Product·12 min read

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.

A

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"
LevelNameDescriptionTypical Owner
N0InitiativeStrategic goal spanning multiple featuresProduct lead / Architect
N1FeatureEnd-user deliverableFeature lead
N2WorkstreamParallel work track (API, Frontend, QA)Tech lead
N3TaskAtomic unit of workIndividual 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 automatically

Detailed 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 block

This 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
}
PolicyEffect
closurePolicy: STRICTParent can only close when ALL children complete
requireEvidenceOnCompleteN3 tasks MUST provide evidence to close
allowParentCloseWithWaiverAllow 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, waiver

Checkpoint 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 checkpoint

Complete Tool Reference

ToolPurpose
rlm_htask_createCreate task at any level (N0-N3)
rlm_htask_create_featureCreate N1 with standard workstreams
rlm_htask_getGet task with children
rlm_htask_treeGet full hierarchy tree
rlm_htask_updateUpdate task fields (whitelist by status)
rlm_htask_blockBlock task with typed blocker payload
rlm_htask_unblockUnblock and re-evaluate ancestors
rlm_htask_completeComplete N3 with evidence
rlm_htask_verify_closureCheck if parent can close
rlm_htask_closeClose parent (with optional waiver)
rlm_htask_deleteSoft/hard delete task
rlm_htask_recommend_batchGet prioritized N3 tasks ready to work
rlm_htask_policy_getGet swarm policy configuration
rlm_htask_policy_updateUpdate policy (admin only)
rlm_htask_metricsGet throughput, aging, recovery metrics
rlm_htask_audit_trailGet task event history
rlm_htask_checkpoint_deltaIncremental 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

A

Alex Lopez

Founder, Snipara

Share this article

LinkedInShare