Tutorial: Hybrid Project Management with Rela

July 4, 2026 ยท View on GitHub

This comprehensive tutorial walks you through implementing a complete project management documentation system using rela. You'll learn how to track goals, features, tasks, decisions, risks, and stakeholders with full traceability across all project artifacts.

What You'll Build

By the end of this tutorial, you'll have a functioning project management system with:

  • Strategic goals linked to measurable outcomes
  • Epics and features decomposed from goals
  • Tasks implementing features with dependency tracking
  • Decisions with context, rationale, and impact tracing
  • Risks linked to what they threaten
  • Stakeholders mapped to what they care about
  • Retrospectives producing tracked improvements
  • Analysis tools to identify gaps and assess impact

Prerequisites

  • rela installed (go install github.com/Sourcehaven-BV/rela/cmd/rela@latest)
  • Basic familiarity with rela concepts (see Getting Started)

Part 1: Project Setup

Initialize the Project

mkdir my-project
cd my-project
rela init

Create the Project Management Metamodel

Replace the default metamodel.yaml with this project management configuration:

version: "1.0"
namespace: "https://example.org/ontology/project#"

types:
  status:
    values: [draft, active, on_hold, completed, cancelled]
    default: draft

  priority:
    values: [critical, high, medium, low]

  work_status:
    values: [backlog, ready, in_progress, review, done, blocked]
    default: backlog

  risk_status:
    values: [identified, analyzing, mitigating, accepted, resolved, occurred]
    default: identified

  likelihood:
    values: [almost_certain, likely, possible, unlikely, rare]

  impact:
    values: [severe, major, moderate, minor, negligible]

  decision_status:
    values: [proposed, evaluating, decided, superseded, reversed]
    default: proposed

entities:
  # Strategic Layer
  goal:
    label: Goal
    aliases: [obj, okr]
    id_patterns: ["GOAL-", "OKR-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      success_criteria:
        type: string
      target_date:
        type: string
      owner:
        type: string
      status:
        type: status
      priority:
        type: priority

  # Planning Layer
  epic:
    label: Epic
    aliases: [ep]
    id_patterns: ["EPIC-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      target_release:
        type: string
      status:
        type: status
      priority:
        type: priority

  feature:
    label: Feature
    aliases: [feat]
    id_patterns: ["FEAT-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      acceptance_criteria:
        type: string
      status:
        type: work_status
      priority:
        type: priority
      estimate:
        type: string

  milestone:
    label: Milestone
    aliases: [ms]
    id_patterns: ["MS-"]
    properties:
      title:
        type: string
        required: true
      target_date:
        type: string
      actual_date:
        type: string
      status:
        type: status

  # Execution Layer
  task:
    label: Task
    aliases: [tsk]
    id_patterns: ["TASK-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      assignee:
        type: string
      status:
        type: work_status
      estimate:
        type: string
      actual:
        type: string

  bug:
    label: Bug
    aliases: [bug]
    id_patterns: ["BUG-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      severity:
        type: enum
        values: [blocker, critical, major, minor, trivial]
      found_in:
        type: string
      assignee:
        type: string
      status:
        type: work_status

  # Decision Layer
  decision:
    label: Decision
    aliases: [dec]
    id_patterns: ["DEC-"]
    properties:
      title:
        type: string
        required: true
      context:
        type: string
      options_considered:
        type: string
      chosen_option:
        type: string
      rationale:
        type: string
      consequences:
        type: string
      decided_by:
        type: string
      decided_date:
        type: string
      status:
        type: decision_status

  # Risk Layer
  risk:
    label: Risk
    aliases: [rsk]
    id_patterns: ["RISK-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      likelihood:
        type: likelihood
      impact:
        type: impact
      exposure:
        type: priority
      mitigation_strategy:
        type: string
      contingency_plan:
        type: string
      owner:
        type: string
      status:
        type: risk_status

  issue:
    label: Issue
    aliases: [iss]
    id_patterns: ["ISS-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      impact:
        type: string
      resolution:
        type: string
      owner:
        type: string
      status:
        type: enum
        values: [open, investigating, resolving, resolved, accepted]
      raised_date:
        type: string
      resolved_date:
        type: string

  # Stakeholder Layer
  stakeholder:
    label: Stakeholder
    aliases: [stk]
    id_patterns: ["STK-"]
    properties:
      name:
        type: string
        required: true
      role:
        type: string
      organization:
        type: string
      influence:
        type: enum
        values: [high, medium, low]
      interest:
        type: enum
        values: [high, medium, low]
      communication_preference:
        type: string
      engagement_approach:
        type: string

  # Knowledge Layer
  meeting:
    label: Meeting
    aliases: [mtg]
    id_patterns: ["MTG-"]
    properties:
      title:
        type: string
        required: true
      date:
        type: string
      attendees:
        type: string
      meeting_type:
        type: enum
        values:
          [standup, planning, review, retrospective, steering, workshop, ad_hoc]

  retrospective:
    label: Retrospective
    aliases: [retro]
    id_patterns: ["RETRO-"]
    properties:
      title:
        type: string
        required: true
      date:
        type: string
      what_went_well:
        type: string
      what_needs_improvement:
        type: string
      team:
        type: string

  improvement:
    label: Improvement
    aliases: [imp]
    id_patterns: ["IMP-"]
    properties:
      title:
        type: string
        required: true
      description:
        type: string
      owner:
        type: string
      status:
        type: work_status
      expected_benefit:
        type: string

relations:
  # Goal decomposition
  contributesTo:
    label: contributes to
    description: Lower-level items contribute to higher-level goals
    from: [epic, feature]
    to: [goal]
    inverse: achievedThrough

  partOfEpic:
    label: part of epic
    description: A feature belongs to an epic
    from: [feature]
    to: [epic]
    inverse: contains

  # Task relationships
  implementedBy:
    label: implemented by
    description: A feature is implemented by tasks
    from: [feature]
    to: [task]
    inverse: implements

  subtaskOf:
    label: subtask of
    description: A task is a subtask of another
    from: [task]
    to: [task]
    inverse: hasSubtask

  fixes:
    label: fixes
    description: A task fixes a bug
    from: [task]
    to: [bug]
    inverse: fixedBy

  # Dependency relationships
  blockedBy:
    label: blocked by
    description: Work is blocked by other work or issues
    from: [task, feature, epic]
    to: [task, feature, issue, risk]
    inverse: blocks

  dependsOn:
    label: depends on
    description: Work depends on other work being completed
    from: [task, feature, epic]
    to: [task, feature]
    inverse: dependencyOf

  # Milestone relationships
  targetedFor:
    label: targeted for
    description: Work is targeted for a milestone
    from: [feature, epic]
    to: [milestone]
    inverse: includes

  # Decision relationships
  affects:
    label: affects
    description: A decision affects work items
    from: [decision]
    to: [feature, epic, task]
    inverse: affectedBy

  decidedIn:
    label: decided in
    description: A decision was made in a meeting
    from: [decision]
    to: [meeting]
    inverse: produced

  supersedes:
    label: supersedes
    description: A decision supersedes a previous decision
    from: [decision]
    to: [decision]
    inverse: supersededBy

  # Risk relationships
  threatens:
    label: threatens
    description: A risk threatens a goal, feature, or milestone
    from: [risk]
    to: [goal, feature, milestone]
    inverse: threatenedBy

  mitigatedBy:
    label: mitigated by
    description: A risk is mitigated by a task or decision
    from: [risk]
    to: [task, decision]
    inverse: mitigates

  becameIssue:
    label: became issue
    description: A risk materialized into an issue
    from: [risk]
    to: [issue]
    inverse: originatedFrom

  # Issue relationships
  resolvedBy:
    label: resolved by
    description: An issue is resolved by a task or decision
    from: [issue]
    to: [task, decision]
    inverse: resolves

  # Stakeholder relationships
  ownedBy:
    label: owned by
    description: A goal or feature is owned by a stakeholder
    from: [goal, feature, epic]
    to: [stakeholder]
    max_incoming: 1
    inverse: owns

  interestedIn:
    label: interested in
    description: A stakeholder is interested in items
    from: [stakeholder]
    to: [goal, feature, milestone]
    inverse: hasStakeholder

  consulted:
    label: consulted
    description: A stakeholder was consulted for a decision
    from: [decision]
    to: [stakeholder]
    inverse: consultedFor

  # Meeting relationships
  attended:
    label: attended
    description: A stakeholder attended a meeting
    from: [stakeholder]
    to: [meeting]
    inverse: attendedBy

  discussed:
    label: discussed
    description: A meeting discussed items
    from: [meeting]
    to: [feature, risk, issue, decision]
    inverse: discussedIn

  # Retrospective relationships
  produces:
    label: produces
    description: A retrospective produces improvements
    from: [retrospective]
    to: [improvement]
    inverse: identifiedIn

  improvesProcess:
    label: improves process
    description: An improvement enhances how we work
    from: [improvement]
    to: [goal]
    inverse: improvedBy

Save this as metamodel.yaml in your project root.

Part 2: Setting Up Strategic Goals

Every project should start with clear goals. Let's create a few strategic goals for an example e-commerce platform modernization project.

Create Your First Goal

rela create goal -P title="Increase customer retention by 15%"

This creates entities/goals/GOAL-001.md. Let's add more detail:

rela update GOAL-001 \
  -P "description=Reduce churn and increase repeat purchases through improved user experience" \
  -P "success_criteria=Customer retention rate improves from 45% to 60% YoY" \
  -P "target_date=2024-Q4" \
  -P "priority=critical" \
  -P "status=active"

Create Additional Goals

rela create goal -P title="Reduce time-to-market by 30%"
rela update GOAL-002 \
  -P "description=Accelerate feature delivery through improved tooling and processes" \
  -P "success_criteria=Average feature cycle time drops from 6 weeks to 4 weeks" \
  -P "target_date=2024-Q3" \
  -P "priority=high" \
  -P "status=active"

rela create goal -P title="Achieve 99.9% platform uptime"
rela update GOAL-003 \
  -P "description=Improve reliability to support business growth" \
  -P "success_criteria=Monthly uptime consistently exceeds 99.9%" \
  -P "target_date=2024-Q2" \
  -P "priority=high" \
  -P "status=active"

View Your Goals

rela list goal

Or use the interactive TUI:

rela tui

Navigate to Goals to see all strategic objectives.

Part 3: Creating the Planning Layer

Create Epics

Epics are large bodies of work that contribute to goals:

rela create epic -P title="Self-service Account Management"
rela update EPIC-001 \
  -P "description=Enable customers to manage their accounts without support intervention" \
  -P "target_release=v2.0" \
  -P "priority=high" \
  -P "status=active"

rela create epic -P title="Mobile App Redesign"
rela update EPIC-002 \
  -P "description=Complete redesign of mobile shopping experience" \
  -P "target_release=v2.1" \
  -P "priority=high" \
  -P "status=active"

rela create epic -P title="Infrastructure Reliability"
rela update EPIC-003 \
  -P "description=Improve system reliability through better monitoring and redundancy" \
  -P "target_release=v2.0" \
  -P "priority=critical" \
  -P "status=active"
rela link EPIC-001 contributesTo GOAL-001
rela link EPIC-002 contributesTo GOAL-001
rela link EPIC-003 contributesTo GOAL-003

Create Features

Features are specific deliverables within an epic:

# Self-service account features
rela create feature -P title="Password Reset Flow"
rela update FEAT-001 \
  -P "description=Allow users to reset passwords via email or SMS" \
  -P "acceptance_criteria=Users can reset password within 2 minutes" \
  -P "estimate=5 points" \
  -P "priority=high" \
  -P "status=ready"

rela create feature -P title="Profile Management"
rela update FEAT-002 \
  -P "description=Users can update profile info, preferences, and communication settings" \
  -P "estimate=8 points" \
  -P "priority=medium" \
  -P "status=backlog"

rela create feature -P title="Order History Dashboard"
rela update FEAT-003 \
  -P "description=View past orders with filtering and search" \
  -P "estimate=8 points" \
  -P "priority=medium" \
  -P "status=backlog"

# Mobile app features
rela create feature -P title="Mobile Checkout Redesign"
rela update FEAT-004 \
  -P "description=Streamlined mobile checkout with Apple Pay and Google Pay" \
  -P "estimate=13 points" \
  -P "priority=high" \
  -P "status=backlog"

# Infrastructure features
rela create feature -P title="Automated Failover"
rela update FEAT-005 \
  -P "description=Automatic failover to backup systems on primary failure" \
  -P "estimate=13 points" \
  -P "priority=critical" \
  -P "status=in_progress"
rela link FEAT-001 partOfEpic EPIC-001
rela link FEAT-002 partOfEpic EPIC-001
rela link FEAT-003 partOfEpic EPIC-001
rela link FEAT-004 partOfEpic EPIC-002
rela link FEAT-005 partOfEpic EPIC-003

Create Milestones

rela create milestone -P title="Phase 1: Foundation"
rela update MS-001 \
  -P "target_date=2024-03-31" \
  -P "status=active"

rela create milestone -P title="Phase 2: Self-Service Launch"
rela update MS-002 \
  -P "target_date=2024-06-30" \
  -P "status=draft"

rela create milestone -P title="Phase 3: Mobile Relaunch"
rela update MS-003 \
  -P "target_date=2024-09-30" \
  -P "status=draft"
rela link FEAT-005 targetedFor MS-001
rela link FEAT-001 targetedFor MS-002
rela link FEAT-002 targetedFor MS-002
rela link FEAT-003 targetedFor MS-002
rela link FEAT-004 targetedFor MS-003

Part 4: Execution Layer - Tasks and Bugs

Create Tasks

# Tasks for Password Reset Flow
rela create task -P title="Implement email verification service"
rela update TASK-001 \
  -P "description=Build service to send and verify email tokens" \
  -P "assignee=alice@example.com" \
  -P "estimate=2 days" \
  -P "status=in_progress"

rela create task -P title="Create password reset UI"
rela update TASK-002 \
  -P "description=Frontend forms for password reset flow" \
  -P "assignee=bob@example.com" \
  -P "estimate=3 days" \
  -P "status=ready"

rela create task -P title="Add SMS verification option"
rela update TASK-003 \
  -P "description=Integrate Twilio for SMS-based verification" \
  -P "assignee=alice@example.com" \
  -P "estimate=2 days" \
  -P "status=backlog"

# Tasks for Automated Failover
rela create task -P title="Set up health check endpoints"
rela update TASK-004 \
  -P "description=Add /health endpoints to all services" \
  -P "assignee=charlie@example.com" \
  -P "estimate=1 day" \
  -P "status=done"

rela create task -P title="Configure load balancer failover"
rela update TASK-005 \
  -P "description=Set up automatic failover in AWS ALB" \
  -P "assignee=charlie@example.com" \
  -P "estimate=2 days" \
  -P "status=in_progress"

rela create task -P title="Implement database replication"
rela update TASK-006 \
  -P "description=Set up PostgreSQL streaming replication" \
  -P "assignee=charlie@example.com" \
  -P "estimate=3 days" \
  -P "status=ready"
rela link FEAT-001 implementedBy TASK-001
rela link FEAT-001 implementedBy TASK-002
rela link FEAT-001 implementedBy TASK-003
rela link FEAT-005 implementedBy TASK-004
rela link FEAT-005 implementedBy TASK-005
rela link FEAT-005 implementedBy TASK-006

Create Dependencies

# TASK-002 depends on TASK-001 (need email service before UI)
rela link TASK-002 dependsOn TASK-001

# TASK-003 depends on TASK-001 (reuse verification patterns)
rela link TASK-003 dependsOn TASK-001

# TASK-005 depends on TASK-004 (need health checks before failover)
rela link TASK-005 dependsOn TASK-004

# TASK-006 depends on TASK-005 (database after load balancer)
rela link TASK-006 dependsOn TASK-005

Track a Bug

rela create bug -P title="Password reset emails marked as spam"
rela update BUG-001 \
  -P "description=Reset emails going to spam folder for Gmail users" \
  -P "severity=major" \
  -P "found_in=v1.9.2" \
  -P "assignee=alice@example.com" \
  -P "status=in_progress"

# Create a fix task
rela create task -P title="Fix email deliverability issues"
rela update TASK-007 \
  -P "description=Configure SPF, DKIM, and DMARC records" \
  -P "assignee=alice@example.com" \
  -P "estimate=1 day" \
  -P "status=in_progress"

rela link TASK-007 fixes BUG-001

Part 5: Decision Management

Record an Architectural Decision

rela create decision -P title="Use GraphQL for Mobile API"
rela update DEC-001 \
  -P "context=Mobile app needs efficient data fetching with bandwidth constraints" \
  -P "options_considered=1. REST API, 2. GraphQL, 3. gRPC" \
  -P "chosen_option=GraphQL" \
  -P "rationale=Allows mobile to request exactly needed fields, reducing bandwidth by ~40%" \
  -P "consequences=Team needs GraphQL training; adds complexity to backend" \
  -P "decided_by=Architecture Team" \
  -P "decided_date=2024-01-15" \
  -P "status=decided"
rela link DEC-001 affects FEAT-004
rela link DEC-001 affects EPIC-002

Record Decision in a Meeting

rela create meeting -P title="Architecture Review - Mobile API"
rela update MTG-001 \
  -P "date=2024-01-15" \
  -P "attendees=Alice, Bob, Charlie, Diana" \
  -P "meeting_type=workshop"

rela link DEC-001 decidedIn MTG-001

Another Decision Example

rela create decision -P title="Adopt Kubernetes for container orchestration"
rela update DEC-002 \
  -P "context=Need container orchestration for microservices deployment" \
  -P "options_considered=1. Docker Swarm, 2. Kubernetes, 3. ECS" \
  -P "chosen_option=Kubernetes (EKS)" \
  -P "rationale=Industry standard, strong ecosystem, team has experience" \
  -P "consequences=Higher infrastructure cost; need to manage cluster" \
  -P "decided_by=Platform Team" \
  -P "decided_date=2024-01-20" \
  -P "status=decided"

rela link DEC-002 affects FEAT-005
rela link DEC-002 affects EPIC-003

Part 6: Risk Management

Identify Risks

rela create risk -P title="Third-party Payment Provider API Changes"
rela update RISK-001 \
  -P "description=Payment provider may deprecate current API version" \
  -P "likelihood=likely" \
  -P "impact=major" \
  -P "exposure=high" \
  -P "mitigation_strategy=Abstract payment integration; monitor deprecation notices" \
  -P "contingency_plan=Maintain ability to switch providers within 2 weeks" \
  -P "owner=alice@example.com" \
  -P "status=mitigating"

rela create risk -P title="Key Team Member Departure"
rela update RISK-002 \
  -P "description=Single point of failure in infrastructure knowledge" \
  -P "likelihood=possible" \
  -P "impact=major" \
  -P "exposure=medium" \
  -P "mitigation_strategy=Document all systems; cross-train team members" \
  -P "owner=bob@example.com" \
  -P "status=mitigating"

rela create risk -P title="Mobile App Store Rejection"
rela update RISK-003 \
  -P "description=App updates may be rejected by Apple/Google" \
  -P "likelihood=possible" \
  -P "impact=moderate" \
  -P "exposure=medium" \
  -P "mitigation_strategy=Follow guidelines strictly; pre-submit review" \
  -P "owner=bob@example.com" \
  -P "status=identified"
rela link RISK-001 threatens FEAT-004
rela link RISK-001 threatens MS-003
rela link RISK-002 threatens FEAT-005
rela link RISK-002 threatens GOAL-003
rela link RISK-003 threatens EPIC-002
rela link RISK-003 threatens MS-003

Create Mitigation Tasks

rela create task -P title="Create payment provider abstraction layer"
rela update TASK-008 \
  -P "description=Build adapter pattern for payment integrations" \
  -P "assignee=alice@example.com" \
  -P "estimate=3 days" \
  -P "status=ready"

rela link RISK-001 mitigatedBy TASK-008

When a Risk Becomes an Issue

# Risk materialized!
rela create issue -P title="Stripe API v2 Sunset Announced"
rela update ISS-001 \
  -P "description=Stripe announced v2 API end-of-life in 6 months" \
  -P "impact=Must migrate before deadline or payments will fail" \
  -P "owner=alice@example.com" \
  -P "status=investigating" \
  -P "raised_date=2024-02-01"

# Link the risk to the issue
rela link RISK-001 becameIssue ISS-001

# Create resolution task
rela create task -P title="Migrate to Stripe API v3"
rela update TASK-009 \
  -P "description=Update all payment integrations to use Stripe API v3" \
  -P "assignee=alice@example.com" \
  -P "estimate=5 days" \
  -P "status=ready"

rela link ISS-001 resolvedBy TASK-009

Part 7: Stakeholder Management

Define Stakeholders

rela create stakeholder -P title="Sarah Johnson"
rela update STK-001 \
  -P "role=VP of Product" \
  -P "organization=Product Team" \
  -P "influence=high" \
  -P "interest=high" \
  -P "communication_preference=Weekly email summary + monthly steering" \
  -P "engagement_approach=Strategic updates; involve in major decisions"

rela create stakeholder -P title="Mike Chen"
rela update STK-002 \
  -P "role=Engineering Director" \
  -P "organization=Engineering" \
  -P "influence=high" \
  -P "interest=high" \
  -P "communication_preference=Daily standups + Slack" \
  -P "engagement_approach=Technical deep-dives; involve in architecture"

rela create stakeholder -P title="Lisa Park"
rela update STK-003 \
  -P "role=Customer Success Lead" \
  -P "organization=Customer Success" \
  -P "influence=medium" \
  -P "interest=high" \
  -P "communication_preference=Bi-weekly sync + feature demos" \
  -P "engagement_approach=Customer feedback channel; beta testing coordination"

rela create stakeholder -P title="David Kim"
rela update STK-004 \
  -P "role=CFO" \
  -P "organization=Finance" \
  -P "influence=high" \
  -P "interest=medium" \
  -P "communication_preference=Monthly business review" \
  -P "engagement_approach=ROI metrics; budget impacts only"
# Ownership
rela link GOAL-001 ownedBy STK-001
rela link GOAL-003 ownedBy STK-002
rela link EPIC-001 ownedBy STK-001
rela link EPIC-003 ownedBy STK-002

# Interest
rela link STK-003 interestedIn GOAL-001
rela link STK-003 interestedIn FEAT-001
rela link STK-004 interestedIn GOAL-001
rela link STK-004 interestedIn MS-002

# Decision consultation
rela link DEC-001 consulted STK-002
rela link DEC-002 consulted STK-002

Track Meeting Attendance

rela link STK-001 attended MTG-001
rela link STK-002 attended MTG-001

Part 8: Knowledge Management

Record a Retrospective

rela create retrospective -P title="Sprint 23 Retrospective"
rela update RETRO-001 \
  -P "date=2024-02-15" \
  -P "team=Platform Team" \
  -P "what_went_well=Automated deployments saved time; good team collaboration" \
  -P "what_needs_improvement=Too many meetings; unclear priorities mid-sprint"

Create Improvements from Retro

rela create improvement -P title="Implement no-meeting Wednesdays"
rela update IMP-001 \
  -P "description=Reserve Wednesdays for focused development work" \
  -P "owner=bob@example.com" \
  -P "status=in_progress" \
  -P "expected_benefit=Increase deep work time by 20%"

rela create improvement -P title="Add priority labels to sprint items"
rela update IMP-002 \
  -P "description=Clear P0/P1/P2 labels on all sprint items" \
  -P "owner=alice@example.com" \
  -P "status=done" \
  -P "expected_benefit=Reduce priority confusion"

rela link RETRO-001 produces IMP-001
rela link RETRO-001 produces IMP-002
rela link IMP-001 improvesProcess GOAL-002
rela link IMP-002 improvesProcess GOAL-002

Part 9: Analysis and Reporting

Check for Orphan Work

Find tasks that don't trace back to any goal:

rela analyze orphans

Trace Dependencies

Trace everything related to a goal:

rela trace from GOAL-001

This shows the full hierarchy: Goal โ†’ Epics โ†’ Features โ†’ Tasks

Trace what's needed for a specific task:

rela trace to TASK-001

Find the path between any two items:

rela trace path GOAL-001 TASK-001

Find Blocked Items

rela list task --filter "status=blocked"
rela list feature --filter "status=blocked"

View Risk Exposure

rela list risk --filter "exposure=high"
rela list risk --filter "status=occurred"

Generate Reports

Export data for reporting:

# Export all items as JSON
rela export json --output project-data.json

# Export as CSV for spreadsheets
rela export csv --output project-data.csv

# Generate dependency graph
rela export dot --output dependencies.dot
dot -Tpng dependencies.dot -o dependencies.png

Part 10: Using the TUI

The Terminal User Interface provides an interactive way to navigate your project:

rela tui

Key Navigation

  • Arrow keys: Navigate lists
  • Enter: View details / select
  • Tab: Switch between panes
  • c: Create new entity
  • l: Create link from current entity
  • d: Delete current entity
  • e: Edit current entity
  • s: Search
  • g: View relationship graph
  • ?: Help

TUI Workflows

Daily Standup:

  1. Open TUI
  2. Navigate to Tasks
  3. Filter by status=in_progress
  4. Review each task, update status as needed
  5. Check for blocked items

Sprint Planning:

  1. Navigate to Features
  2. Filter by status=backlog
  3. Review each feature
  4. Create tasks for features selected for sprint
  5. Link tasks to features

Risk Review:

  1. Navigate to Risks
  2. Filter by status=identified or exposure=high
  3. Review each risk
  4. Update status or create mitigation tasks

Best Practices

1. Start with Goals

Always create goals first, then decompose into epics, features, and tasks. This ensures all work traces to business value.

Create relationships as you create entities. An unlinked entity is an orphan waiting to happen.

3. Update Status Regularly

Keep status fields current. Stale data undermines trust in the system.

4. Document Decisions

Every significant choice should be a decision record with context and rationale. Future you will thank present you.

5. Use Analysis Before Meetings

Before steering committees or planning sessions:

rela analyze orphans
rela list risk --filter "exposure=high"
rela trace from GOAL-001

7. Export for Stakeholders

Non-technical stakeholders may prefer spreadsheets:

rela export csv --output weekly-report.csv

Common Queries

What's blocking the milestone?

rela trace to MS-002
rela list feature --filter "status=blocked"

Who cares about this feature?

rela show FEAT-001
# Look at "has stakeholder" relationships

What decisions affect this epic?

rela show EPIC-002
# Look at "affected by" relationships

What risks threaten our timeline?

rela list risk --filter "status!=resolved"

What came out of the last retro?

rela show RETRO-001
rela list improvement --filter "status!=done"

Next Steps

You now have a fully functional project management system. Consider:

  1. Customize the metamodel for your specific needs
  2. Integrate with CI/CD to auto-update task status
  3. Set up regular analysis as part of your workflow
  4. Export data to dashboards or reporting tools

For more information, see: