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.
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.
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.
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.
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).
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.
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.
| Primitive | Create | Read | Update | Run / Advance | Key tools |
|---|---|---|---|---|---|
| Project | yes | yes | yes | — | create_project, update_project, list_projects |
| Task Type | yes | yes | — | — | create_task_type, list_task_types |
| Status | yes | yes | — | — | create_issue_status, list_statuses |
| Task / Issue | yes | yes | yes | move_issue | create_issue, update_issue, move_issue |
| Todo | yes | yes | yes | complete/reopen | create_todo, complete_todo |
| Comment | yes | yes | yes | — | add_comment, list_comments |
| Card | yes | yes | yes | — | create_card, update_card, list_master_tags |
| Process definition | NO | yes | NO | — | list_processes, get_process |
| Process execution | start | yes | — | cancel | start_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.
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:
start_process on a card, watch the execution progress, and cancel_execution if something is wrong — but they can't invent a new rail.@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.
"Human-assisted and moderated" is not a vibe — in AgileX it maps to four concrete Huly mechanisms an agent uses deliberately:
| # | Channel | Mechanism | What it does |
|---|---|---|---|
| 1 | Status gate | move_issue → "Needs Review" | Agent parks work in a status only a human can advance. The board stalls until a person acts. Hard stop. |
| 2 | Assignment / mention | add_comment with @person | Pulls a specific human in via notification. "@Craig — confidence 0.62 on this candidate, please confirm." |
| 3 | Dialogue thread | add_comment / list_comments | The agent's reasoning and the human's corrections live on the task itself — full audit trail, two-way. |
| 4 | Cancel / unwind | cancel_execution, status revert | A 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.
The agent polls for the human's decision rather than blocking a thread. Statuses ending in Needs Review / Approved / Rejected are the contract.
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.
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.
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.
The generic primitives in §2 have exact counterparts in Huly's Recruiting module. This is the mapping AgileX agents actually operate on:
| Generic primitive | Recruiting object | Role in the moderated flow |
|---|---|---|
| Project / scope | Vacancy | The role being filled — title, description, collaborators. Bounds the agent's work to one opening. |
| Card / contact | Talent | The candidate, with Skills used for filtering/matching. One talent can have many applications. |
| Task / unit of work | Application | Links a Talent to a Vacancy and moves through a kanban status pipeline — this is the thing the agent advances. |
| Moderation gate | Review | A 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:
list_cards / Talent master tag), creates the Application linking Kagiso Maile → Senior ML Engineer at status Screening.download_attachment / fulltext_search, scores fit against the vacancy's Skills, writes its assessment into the application and advances status → Review.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).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.
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_project {
name: "Recruiting",
identifier: "REC",
projectType: "Classic project"
}
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"
}
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: …" }
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
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.| Principle | In practice |
|---|---|
| The board is the state machine | Never 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 rails | Projects, Processes, Task Types, and gate Statuses are authored by people. Agents work within them, never redefine them. |
| Stage, don't fire | No irreversible or external action without a human-advanced status. Park it at a gate and wait. |
| Confidence routes attention | Auto-advance the obvious; escalate the ambiguous with an @mention. Don't make humans review everything. |
| Every action is auditable | Comments carry the agent's reasoning; status history carries the decisions. The trail is the moderation record. |
| Contain the blast radius | Scope 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.