Dependencies create relationships between issues. Tracer supports four distinct dependency types, each serving a specific purpose in organizing and tracking work.
The related dependency links issues that are connected but don’t block each other.
# bd-3 and bd-5 are related but independenttracer dep add bd-3 bd-5 --type related
When to use:
Issues that share context or background
Work that should be done together but can proceed in parallel
Cross-referencing similar issues
Example workflow:
# Two independent but related taskstracer create "Add frontend login form" -p 1# Created: bd-10tracer create "Add backend login API" -p 1# Created: bd-11# They're related but can be done in paralleltracer dep add bd-10 bd-11 --type related# Both appear in ready worktracer ready# Shows: bd-10, bd-11 (both ready)
related dependencies are for documentation only - they don’t affect tracer ready or block status.
The discovered-from dependency tracks work found while working on another issue.
# bd-7 was discovered while working on bd-3tracer dep add bd-7 bd-3 --type discovered-from
When to use:
Bugs found during feature implementation
Technical debt identified during refactoring
Scope expansion or follow-up work
Maintaining audit trail of work discovery
AI agents should use discovered-from to file issues as they work, ensuring nothing gets lost.
Example workflow:
# Start working on a featuretracer update bd-5 --status in_progress# Discover a bug while implementingtracer create "Fix null pointer in validation" -t bug -p 0# Created: bd-12# Link it back to the parent worktracer dep add bd-12 bd-5 --type discovered-from# Later, see what was discoveredtracer show bd-5# Shows dependencies including discovered issues
pub struct Dependency { pub issue_id: String, // The issue with the dependency pub depends_on_id: String, // The issue it depends on pub dep_type: DependencyType, // blocks, parent-child, related, discovered-from pub created_at: DateTime<Utc>, // When dependency was added pub created_by: String, // Who added it}
The tracer ready command finds issues that have no blockers:
-- From sqlite.rs:596SELECT * FROM issues iWHERE i.status = 'open'AND i.id NOT IN ( SELECT d.issue_id FROM dependencies d JOIN issues blocker ON d.depends_on_id = blocker.id WHERE d.type = 'blocks' AND blocker.status != 'closed')
Key points:
Only blocks dependencies affect ready work
Issues are blocked until blockers are closed
Other dependency types (parent-child, related, discovered-from) don’t block
Only create blocks dependencies for true technical or sequential requirements. Over-blocking limits parallel work.Good: “Can’t deploy without tests” Bad: “These are related” (use related instead)
Organize epics with parent-child
Break down large work into subtasks using parent-child. Add blocks between subtasks only if they truly must be sequential.
# Epic with parallel subtaskstracer dep add task-1 epic-1 --type parent-childtracer dep add task-2 epic-1 --type parent-childtracer dep add task-3 epic-1 --type parent-child# All three tasks can proceed in parallel
Track discoveries
Use discovered-from whenever you find new work while working on an issue. This maintains context and prevents work from being lost.
# Found while working on bd-5NEW_ID=$(tracer create "Fix edge case" -t bug -p 0 --json | jq -r '.id')tracer dep add $NEW_ID bd-5 --type discovered-from
Document relationships with related
Use related to cross-reference issues that should be considered together but don’t have hard dependencies.
Check for cycles regularly
Run tracer dep cycles periodically, especially after adding complex dependency chains.
# Get all dependencies for an issuetracer show bd-1 --json | jq '.dependencies'# Find all issues discovered from bd-5tracer show bd-5 --json | \ jq '.dependencies[] | select(.dep_type == "discovered-from")'# List all parent-child relationshipstracer list --json | \ jq '.[] | select(.dependencies[].dep_type == "parent-child")'