Projects, Processes & Tasks — The Agent Work Model

How AgileX agents do real work inside Huly under human supervision: the three primitives, what agents can and can't touch via the API, and the patterns that keep a human in the loop.

AgileX / agenticX Huly Cloud v0.7.423 @firfi/huly-mcp v0.30.1 (341 tools) Workspace: agilex June 2026
The one-sentence model: In AgileX, a human defines the rails (Projects, Processes, Task Types, Statuses) and an agent drives a vehicle along them (creating Tasks, advancing Statuses, starting Process executions, leaving Comments) — stopping at gates where a human reviews, approves, or redirects before the agent continues.

Contents

  1. Why this matters for agents
  2. The three primitives
  3. How they nest
  4. Capability matrix (verified)
  5. The Process truth: define vs. run
  6. The four moderation channels
  7. Human-assisted flow patterns
  8. Worked example: Talent screening
  9. Setting up the rails (API calls)
  10. Design principles

1. Why this matters for agents

An autonomous agent with raw write access to a workspace is a liability — it can act fast, confidently, and wrongly. The value of running AgileX agents inside Huly is that Huly already provides the structures a moderated workflow needs: a unit of work that can carry state, a status lifecycle that can act as an approval gate, a comment thread that doubles as a human-agent conversation, and a notification system that pulls a human in at the right moment.

Instead of inventing an approval system, AgileX agents express their work as Huly objects. Every action an agent takes leaves an auditable trail, every decision can be parked behind a status gate, and every human override is a first-class event. The agent doesn't have a private state machine — the Huly board is the state machine, and it's one a human can see and touch at any moment.

2. The three primitives

🗂️ Project container / scope

The workspace boundary for a body of work — e.g. Recruiting, MLOps Hiring Q3, Platform. A Project is created from a Project Type (a template that pre-defines which Task Types and Statuses exist). Projects scope who and what: members, permissions, the status workflow, milestones, components.

For agents: the Project is the agent's sandbox. An agent is granted membership of one or more Projects and works only within them. Cross-project blast radius is contained by design.

✅ Task / Issue unit of work

The atomic deliverable — what Huly internally calls an Issue and what humans read as a "task". It has an assignee, a Status, a priority, labels, a description, comments, sub-issues, and relations. A Task Type (e.g. Screening, Interview, Bug) decides which statuses and fields a task carries.

For agents: this is the agent's primary work surface. Agents create tasks, fill them in, move them through statuses, attach evidence, and hand them off. Full CRUD is available.

⚡ Process automation rail

A Process is a reusable workflow definition attached to a Card type (a "master tag"): an ordered set of states, transitions, and automated actions. You author it once, then run it many times — each run is an Execution tracked against a specific card/document.

For agents: a Process is the guardrail. An agent cannot redefine the process — it can only start an execution, observe its state, and cancel it. This is the single most important constraint in the whole model (see §5).

3. How they nest

Project Type (template: which task types + statuses exist) └─ Project (e.g. "Recruiting") ← agent's sandbox ├─ Task Type (e.g. "Screening", "Interview") │ └─ Status workflow (Backlog → In Progress → Needs Review → Done) ├─ Task / Issue (the unit of work) ← agent CRUDs these │ ├─ Comments (human ↔ agent dialogue) │ ├─ Todos (agent's own action items) │ └─ Attachments / relations / labels └─ Milestone / Component (grouping) Card (master tag, e.g. "Talent") └─ Process (authored in UI — the rail) ← agent CANNOT create └─ Execution (one run on one card) ← agent starts / observes / cancels

Tasks and Processes meet at the Card. In Recruiting, a Talent is a card; a screening Process runs against that talent card; and the individual steps surface as Tasks a recruiter or agent acts on. The Process keeps the sequence honest; the Tasks carry the work; the Project bounds the whole thing.

4. Capability matrix (verified against the live MCP server)

This is the actual surface exposed by @firfi/huly-mcp@0.30.1 connected to huly.app workspace agilex — not the docs, the running server.

PrimitiveCreateReadUpdateRun / AdvanceKey tools
Projectyesyesyescreate_project, update_project, list_projects
Task Typeyesyescreate_task_type, list_task_types
Statusyesyescreate_issue_status, list_statuses
Task / Issueyesyesyesmove_issuecreate_issue, update_issue, move_issue
Todoyesyesyescomplete/reopencreate_todo, complete_todo
Commentyesyesyesadd_comment, list_comments
Cardyesyesyescreate_card, update_card, list_master_tags
Process definitionNOyesNOlist_processes, get_process
Process executionstartyescancelstart_process, list_process_executions, cancel_execution

Adjacent surfaces an agent can also use as moderation signals: list_notifications / mark_notification_read, list_mentions, add_reaction, list_object_collaborators, fulltext_search, plus full Document, Drive, Contacts, and Channel (chat) toolsets.

5. The Process truth: define vs. run

This is the answer to "the UI only shows how to run." That observation is correct, and it extends to the API. Huly Processes are authored, not generated on the fly. The MCP/API surface offers start_process, list_process_executions, and cancel_execution — but there is no create_process / update_process / delete_process. Process definitions are read-only over the API.

Why this is a feature, not a limitation. If agents could rewrite the workflow definition, they could remove the very gates that make the flow safe. By making the Process layer human-authored and immutable-to-agents, AgileX guarantees that:

So how do you create a Process?

  1. Author in the UI — Recruiting/Settings → Processes (the ⚡ module). Define the master tag it attaches to (e.g. Talent), its states, transitions, and automated actions. This is the supported, recommended path.
  2. Raw transactor (advanced, not via this MCP) — Process definitions are ordinary documents in the @hcengineering/process plugin. A privileged service with transactor access can create them programmatically with TxOperations, but that path is intentionally outside the agent's toolset and reserved for platform setup/migration scripts.

For everything that looks like a lightweight process but needs to be agent-creatable, use Tasks + Statuses + Todos instead (§7). That's the agent-writable equivalent of a workflow.

6. The four moderation channels

"Human-assisted and moderated" is not a vibe — in AgileX it maps to four concrete Huly mechanisms an agent uses deliberately:

#ChannelMechanismWhat it does
1Status gatemove_issue"Needs Review"Agent parks work in a status only a human can advance. The board stalls until a person acts. Hard stop.
2Assignment / mentionadd_comment with @personPulls a specific human in via notification. "@Craig — confidence 0.62 on this candidate, please confirm."
3Dialogue threadadd_comment / list_commentsThe agent's reasoning and the human's corrections live on the task itself — full audit trail, two-way.
4Cancel / unwindcancel_execution, status revertA human (or the agent on detecting an error) stops a run cleanly without leaving orphaned state.

The key design move: an agent never performs an irreversible or outward-facing action directly (sending an offer, rejecting a candidate, emailing externally). It stages the action as a task in a gate status and waits for human approval. Approval = a human moving the status forward, which the agent detects by polling list_issues / list_notifications.

7. Human-assisted flow patterns

Pattern A — Status as approval gate

agent: create_issue("Screen Kagiso Maile", status="Backlog", type="Screening") agent: …does the work… update_issue(description=findings, status="Needs Review") ⛔ GATE — board stops here human: reviews, moves status → "Approved" (or comments a correction) agent: detects "Approved" via list_issues → proceeds to next step

The agent polls for the human's decision rather than blocking a thread. Statuses ending in Needs Review / Approved / Rejected are the contract.

Pattern B — Confidence-routed autonomy

The agent self-grades. High confidence → it advances within the rail automatically. Low confidence → it routes to a gate with an @mention. This keeps humans focused only on the ambiguous cases.

if confidence >= 0.85: update_issue(status="Approved") # auto-advance else: update_issue(status="Needs Review") add_comment("@recruiter low confidence — reason: …")

Pattern C — Process execution as the spine, tasks as the work

A human-authored Talent Screening Process defines the rail. The agent start_process-es it on a talent card, then for each state creates the concrete Task it needs to do, and reports progress back via comments. The Process guarantees order; the Tasks carry the doing.

Pattern D — Todos as the agent's scratchpad

Within a single task, the agent breaks its plan into create_todo items and complete_todos them as it goes. Humans watching the task see a live checklist of what the agent is doing — transparency without interruption.

8. Worked example — Recruiting (the agilex workspace)

The generic primitives in §2 have exact counterparts in Huly's Recruiting module. This is the mapping AgileX agents actually operate on:

Generic primitiveRecruiting objectRole in the moderated flow
Project / scopeVacancyThe role being filled — title, description, collaborators. Bounds the agent's work to one opening.
Card / contactTalentThe candidate, with Skills used for filtering/matching. One talent can have many applications.
Task / unit of workApplicationLinks a Talent to a Vacancy and moves through a kanban status pipeline — this is the thing the agent advances.
Moderation gateReviewA scheduled human evaluation carrying an explicit verdict + notes. The purpose-built approval point.

Live data in the workspace: talents like James Grant, Kagiso Maile (Senior ML), Chloé Dubois, Rudzani Nemukula (Staff MLOps), Farhan Ismail (Principal AI). Here's the moderated loop for one of them against a Senior ML Engineer vacancy:

  1. Human (once): creates the Senior ML Engineer Vacancy and defines the Application status pipeline (e.g. New → Screening → Review → Shortlisted → Interview → Offer), marking Shortlisted+ as requiring a Review verdict.
  2. Agent: finds the Talent (list_cards / Talent master tag), creates the Application linking Kagiso MaileSenior ML Engineer at status Screening.
  3. Agent: reads the CV via download_attachment / fulltext_search, scores fit against the vacancy's Skills, writes its assessment into the application and advances status → Review.
  4. ⛔ Gate — Review: agent add_comment("@craig fit 0.78 for Senior ML — strengths/risks below"). The recruiter records a Review verdict + notes and moves the application → Shortlisted (approve) or Rejected / back to Screening (redirect).
  5. Agent: on detecting Shortlisted, stages the interview-scheduling step (create_event / invite) — again parked behind the next gate before anything external is sent.

At no point does the agent reject a candidate or send an external email on its own authority. The Application status is the state machine and the Review verdict is the human signature — every outward action is a human-approved transition.

9. Setting up the rails (illustrative API calls)

What a human/operator does once to give agents a place to work. Calls shown as MCP tool invocations; parameter names are indicative — confirm exact schema with tools/list.

Create the project (the sandbox)

create_project {
  name: "Recruiting",
  identifier: "REC",
  projectType: "Classic project"
}

Define a Task Type + its gate status

create_task_type {
  projectType: "Classic project",
  name: "Screening",
  fromTemplate: "Task"            # copies workflow config
}
create_issue_status {
  project: "REC",
  name: "Needs Review",          # the approval gate
  category: "Active"
}

Agent creates and advances a task

create_issue {
  project: "REC", title: "Screen — Kagiso Maile",
  type: "Screening", status: "In Progress",
  assignee: "agent:screener"
}
# …work happens…
update_issue { issue: "REC-42", status: "Needs Review" }
add_comment { object: "REC-42",
  message: "@craig fit 0.78 — recommend shortlist. Rationale: …" }

Run a (human-authored) process on a card

list_processes { masterTag: "Talent" }          # discover the rail
start_process {
  process: "Talent Screening",
  card: "talent:kagiso-maile"
}
list_process_executions { card: "talent:kagiso-maile" }   # watch state
Reminder: there is no create_process here on purpose. If the rail you want doesn't exist yet, a human authors it in the UI first — then agents can start_process against it.

10. Design principles for AgileX agents in Huly

PrincipleIn practice
The board is the state machineNever keep hidden agent state. If it matters, it's a task, a status, a comment, or a todo — visible and human-touchable.
Humans own the railsProjects, Processes, Task Types, and gate Statuses are authored by people. Agents work within them, never redefine them.
Stage, don't fireNo irreversible or external action without a human-advanced status. Park it at a gate and wait.
Confidence routes attentionAuto-advance the obvious; escalate the ambiguous with an @mention. Don't make humans review everything.
Every action is auditableComments carry the agent's reasoning; status history carries the decisions. The trail is the moderation record.
Contain the blast radiusScope agents to specific Projects. Cancel cleanly with cancel_execution / status revert when something's wrong.

AgileX / agenticX · Agent Work Model · grounded against live @firfi/huly-mcp on workspace agilex · June 2026. See also: Huly Integration Guide, Huly MCP Spec, Platform Architecture.