Agentic Project Management: Hierarchical Tasks for AI Workflows
Flat task queues break on complex projects. Learn how Snipara's hierarchical tasks (htasks) bring real project management to AI agents: 4-level hierarchies, automatic blocking propagation, policy-driven closure with evidence requirements, and full audit trails.
Alex Lopez
Founder, Snipara
Running AI agents on complex projects without structure is chaos. Hierarchical Tasks (htasks) bring project management primitives to multi-agent workflows: 4-level hierarchies, policy-driven governance, blocking propagation, and full audit trails.
Key Takeaways
- 4-level task hierarchy — Initiative → Feature → Workstream → Task
- Automatic blocking propagation — blocked child → blocked parent
- Policy-driven closure — require evidence, enforce waivers
- Full observability — metrics, audit trails, checkpoint deltas
The Problem: Flat Tasks Don't Scale
Most AI agent frameworks use flat task queues: create a task, claim it, complete it. This works for simple workflows, but breaks down when you need:
- Multiple agents working on related tasks
- Dependent work that blocks on upstream delivery
- Evidence that a task was actually completed correctly
- Audit trails for compliance or debugging
- Structured escalation when things go wrong
Real software projects have structure: initiatives break into features, features decompose into workstreams, workstreams contain atomic tasks. Flat queues lose this hierarchy — and with it, the ability to track progress or propagate status.
Hierarchical Task Architecture
Snipara's rlm_htask_* tools implement a 4-level hierarchy designed for real project management:
N0: INITIATIVE "Q1 Platform Modernization" │ ├── N1: FEATURE "User Authentication" │ │ │ ├── N2: API ← Workstream │ │ ├── N3: TASK "Implement JWT endpoint" │ │ └── N3: TASK "Add refresh tokens" │ │ │ ├── N2: FRONTEND ← Workstream │ │ └── N3: TASK "Build login form" │ │ │ └── N2: QA ← Workstream │ └── N3: TASK "Write E2E tests"| Level | Name | Description | Typical Owner |
|---|---|---|---|
| N0 | Initiative | Strategic goal spanning multiple features | Product lead / Architect |
| N1 | Feature | End-user deliverable | Feature lead |
| N2 | Workstream | Parallel work track (API, Frontend, QA) | Tech lead |
| N3 | Task | Atomic unit of work | Individual agent |
Creating Tasks: From Initiative to Atomic Work
Quick Feature Scaffolding
The rlm_htask_create_feature tool creates a Feature (N1) with standard workstreams in a single call:
rlm_htask_create_feature( swarm_id="swarm_abc", title="User Authentication", owner="alice", workstreams=["API", "FRONTEND", "QA"])# Creates N1 + 3 N2 workstreams automaticallyDetailed Task Creation
For atomic tasks (N3), use rlm_htask_create with acceptance criteria and evidence requirements:
rlm_htask_create( swarm_id="swarm_abc", level="N3_TASK", parent_id="htask_ws_api", title="Implement JWT generation", owner="agent_backend", priority="P1", acceptance_criteria=[ {"id": "ac1", "text": "JWT signed with RS256"}, {"id": "ac2", "text": "Tokens expire after 1h"} ], evidence_required=[ {"type": "test", "description": "Unit tests passing"} ])Blocking Propagation: Status Flows Upward
When a task is blocked, the status automatically propagates up the hierarchy:
N1: Feature → BLOCKED (child blocked) N2: API → BLOCKED (child blocked) N3: Task → BLOCKED ← Original blockThis means:
- Project leads see blockers at the feature level without drilling down
- Metrics reflect actual project health
- Escalation is automatic when blockers affect upstream deliverables
Block with Context
rlm_htask_block( swarm_id="swarm_abc", task_id="htask_001", blocker_type="DEPENDENCY", blocker_reason="Waiting for auth API from team-backend", blocked_by_task_id="htask_auth_api", eta_recovery="2026-03-21T10:00:00Z", escalation_to="tech-lead@company.com")Blocker types: TECH, DEPENDENCY, ACCESS, PRODUCT, INFRA, SECURITY
Policy Engine: Configurable Governance
Each swarm has a policy that governs task behavior:
rlm_htask_policy_get(swarm_id="swarm_abc")# Returns:{ "closurePolicy": "STRICT_ALL_CHILDREN", "requireEvidenceOnComplete": true, "failedIsBlockingDefault": true, "allowParentCloseWithWaiver": true}| Policy | Effect |
|---|---|
closurePolicy: STRICT | Parent can only close when ALL children complete |
requireEvidenceOnComplete | N3 tasks MUST provide evidence to close |
allowParentCloseWithWaiver | Allow closing with documented exceptions |
Evidence & Closure: Proving Work is Done
Complete with Evidence
rlm_htask_complete( swarm_id="swarm_abc", task_id="htask_task_001", evidence=[ {"type": "test", "description": "15 unit tests passing"}, {"type": "review", "description": "PR #123 approved"} ], result={"files_modified": ["src/auth/jwt.ts"]})Verify Before Closing Parent
rlm_htask_verify_closure(swarm_id="swarm_abc", task_id="htask_ws_001")# Returns:{"can_close": false, "blockers": ["2 children not completed"], "needs_waiver": true}Close with Waiver
rlm_htask_close( swarm_id="swarm_abc", task_id="htask_ws_001", waiver_reason="Error handling moved to next sprint", waiver_approved_by="tech-lead")Observability: Metrics & Audit Trails
Real-Time Metrics
rlm_htask_metrics(swarm_id="swarm_abc", period_hours=24)# Returns:{ "total": 45, "by_status": {"pending": 10, "in_progress": 8, "blocked": 3, "completed": 24}, "throughput": {"closures_total": 15, "per_hour": 0.63}, "aging_days": {"N0": 14.5, "N1": 7.2, "N2": 3.1, "N3": 1.8}, "blocked_recovered_ratio": 0.85}Audit Trail
Every action is logged for compliance and debugging:
rlm_htask_audit_trail(swarm_id="swarm_abc", task_id="htask_001")# Events: create, update, block, unblock, complete, close, delete, waiverCheckpoint Deltas
For dashboards and incremental sync:
rlm_htask_checkpoint_delta(swarm_id="swarm_abc", since="2026-03-19T09:00:00Z")# Returns events, closures, blocks since checkpointComplete Tool Reference
| Tool | Purpose |
|---|---|
rlm_htask_create | Create task at any level (N0-N3) |
rlm_htask_create_feature | Create N1 with standard workstreams |
rlm_htask_get | Get task with children |
rlm_htask_tree | Get full hierarchy tree |
rlm_htask_update | Update task fields (whitelist by status) |
rlm_htask_block | Block task with typed blocker payload |
rlm_htask_unblock | Unblock and re-evaluate ancestors |
rlm_htask_complete | Complete N3 with evidence |
rlm_htask_verify_closure | Check if parent can close |
rlm_htask_close | Close parent (with optional waiver) |
rlm_htask_delete | Soft/hard delete task |
rlm_htask_recommend_batch | Get prioritized N3 tasks ready to work |
rlm_htask_policy_get | Get swarm policy configuration |
rlm_htask_policy_update | Update policy (admin only) |
rlm_htask_metrics | Get throughput, aging, recovery metrics |
rlm_htask_audit_trail | Get task event history |
rlm_htask_checkpoint_delta | Incremental sync since timestamp |
Best Practices
Use consistent owners
Assign clear ownership at each level for accountability
Define acceptance criteria upfront
Agents need clear "done" definitions to complete correctly
Require evidence for N3 tasks
Prevents premature closure and ensures quality
Mark non-critical tasks as non-blocking
Use is_blocking=false for nice-to-haves
Document all waivers
Future audits will thank you
Monitor blocked_recovered_ratio
Low ratio indicates systemic blockers needing attention