Remote Work Tools

Tech debt without a system becomes invisible until it causes an incident. For remote teams without hallway conversations, the invisibility problem is worse: engineers work around problems silently, never surfacing them to the people who could allocate time to fix them. This guide covers a practical async system for capturing, scoring, and allocating time to tech debt in a distributed team.

The Core Problem with Remote Tech Debt Management

In co-located teams, tech debt often gets discussed in passing (“this module is a nightmare, we should really fix it”). Remote teams lose that informal channel. The result: engineers work around problems individually without a shared picture of the worst offenders.

A good remote tech debt system needs:

Tool Choice: GitHub Issues with Labels

GitHub Issues works better than Jira or Linear for tech debt because it lives in the same repository as the code. When an engineer notices debt while working on a PR, they can file an issue in seconds.

Label system:

Type:
  tech-debt          — catch-all for debt items
  tech-debt-hotspot  — frequently touched area with known problems
  tech-debt-risk     — risk of incident if not addressed

Impact:
  impact-high        — affects multiple teams or frequent workflows
  impact-medium      — affects one team or infrequent workflows
  impact-low         — minor or edge case

Effort:
  effort-days        — 1-5 days of work
  effort-weeks       — 1-3 weeks of work
  effort-months      — multi-sprint effort

Status:
  debt-new           — filed, not yet scored
  debt-scored        — has a priority score
  debt-scheduled     — allocated to a sprint or quarter
  debt-blocked       — waiting on external dependency

GitHub CLI to create labels:

# Create all labels in bulk
gh label create "tech-debt" --color "d93f0b" --description "Technical debt items"
gh label create "tech-debt-hotspot" --color "e11d48" --description "Frequently touched problem area"
gh label create "tech-debt-risk" --color "dc2626" --description "Risk of incident"
gh label create "impact-high" --color "7c3aed" --description "High user or team impact"
gh label create "impact-medium" --color "6d28d9" --description "Medium impact"
gh label create "impact-low" --color "8b5cf6" --description "Low impact"
gh label create "effort-days" --color "059669" --description "1-5 days"
gh label create "effort-weeks" --color "10b981" --description "1-3 weeks"
gh label create "effort-months" --color "34d399" --description "Multi-sprint"
gh label create "debt-new" --color "6b7280" --description "Not yet scored"
gh label create "debt-scored" --color "f59e0b" --description "Scored, awaiting scheduling"
gh label create "debt-scheduled" --color "3b82f6" --description "In a sprint or quarter plan"

Issue Template

<!-- .github/ISSUE_TEMPLATE/tech-debt.md -->
---
name: Tech Debt
about: Document a technical debt item
title: '[DEBT] '
labels: tech-debt, debt-new
assignees: ''
---

## What is the problem?
<!-- Describe what's broken, slow, hard to maintain, or risky -->

## Where is it?
<!-- File paths, modules, services, or layers affected -->
Module:
Files:

## Business Impact
<!-- What happens when this debt causes a problem? Who is affected? -->

## Frequency
<!-- How often do engineers encounter this? -->
- [ ] Daily
- [ ] Weekly
- [ ] Monthly
- [ ] Rare but high risk

## Proposed Fix
<!-- High-level approach. Does not need to be detailed. -->

## Effort Estimate
- [ ] Days (1-5)
- [ ] Weeks (1-3)
- [ ] Months (multi-sprint)

## Score (filled in during async review)
<!-- Impact (1-5) × Frequency (1-5) ÷ Effort (1-5) -->
Score: TBD

Scoring System (Async, No Meeting Required)

Use a simple formula: Score = (Impact × Frequency) ÷ Effort

Score each dimension 1-5:

A GitHub Action triggers when an issue is labeled debt-new and posts a scoring template as a comment, requesting async input from the team:

# .github/workflows/tech-debt-scoring.yml
name: Tech Debt Scoring Request
on:
 issues:
 types: [labeled]

jobs:
 request-scoring:
 if: github.event.label.name == 'debt-new'
 runs-on: ubuntu-latest
 steps:
 - name: Post scoring comment
 uses: actions/github-script@v7
 with:
 script: |
 await github.rest.issues.createComment({
 owner: context.repo.owner,
 repo: context.repo.repo,
 issue_number: context.issue.number,
 body: `## Tech Debt Scoring

Please score this item by replying with your assessment (any team member can score):

**Impact (1-5):** How severely does this affect users or engineering velocity?
1 = minor | 3 = moderate | 5 = critical/incident risk

**Frequency (1-5):** How often do engineers encounter this?
1 = rare | 3 = weekly | 5 = daily for most engineers

**Effort (1-5):** How much work to fix? (1=easy, 5=large)
1 = days | 3 = weeks | 5 = months

Reply with: Impact: X | Frequency: X | Effort: X

I'll aggregate scores after 48 hours.`
 });

Weekly Async Review (No Meeting)

Instead of a debt review meeting, use a structured async thread:

<!-- Posted every Monday in #eng-tech-debt Slack channel -->

## Tech Debt Weekly Review — Week of 2026-03-22

### New items (score by Wednesday EOD)
- [DEBT] Payment service uses deprecated Stripe API (#451) — @maria
- [DEBT] OrderRepository N+1 query on list endpoint (#452) — @james

### Top 5 by score (action required)
1. Score 8.3 — [DEBT] Auth module has no tests (#398) — @platform-team, scheduled Q2
2. Score 7.1 — [DEBT] Search uses full table scan (#412) — scoring complete, needs owner
3. Score 6.8 — [DEBT] Deploy script has hardcoded prod secrets (#399) — CRITICAL, @security-team

### This week's debt time budget: 8 engineer-hours
Current allocation: [#398 auth tests — 4h] [#412 search — 4h pending]

### Needs owner (reply by Friday)
- #412 Search optimization (4h estimated) — any takers?

React ✅ to confirm you've read this.

Time Allocation Policy

Without explicit time allocation, tech debt never gets done. Establish a policy:

## Tech Debt Time Budget Policy

Every sprint allocates 15% of engineering capacity to tech debt.
For a team of 6 engineers × 80h sprint = 72h × 15% = ~10h/sprint.

### Allocation rules:
1. Items with score ≥ 7 must be scheduled within the current quarter
2. Items with score ≥ 9 (risk items) must be addressed within 2 sprints
3. No more than 50% of debt budget on any single item
4. "Debt tax" on new features: any PR adding complexity must include a debt issue

### Tracking velocity:
- Items closed per month: target ≥ 4
- Items added per month: track to ensure net negative trend
- Oldest open item: should be < 3 months for scored items

GitHub Project Board Setup

# Create a project board for tech debt
gh project create --owner @org --title "Tech Debt Backlog" --format table

# Add columns: Scored, Scheduled, In Progress, Done
# Fields to add:
# - Score (number)
# - Quarter (select: Q1/Q2/Q3/Q4)
# - Owner (person)

# Filter view: sorted by Score descending, open items only
# This is the primary view for weekly review

Metrics to Track Monthly

# GitHub CLI: count debt items by status
gh issue list --label "tech-debt" --state open --json number,labels,createdAt \
 | jq 'length'

# Items closed this month
gh issue list --label "tech-debt" --state closed \
 --json closedAt \
 | jq --arg date "$(date -d '30 days ago' +%Y-%m-%d)" \
 '[.[] | select(.closedAt >= $date)] | length'

# Items added this month
gh issue list --label "tech-debt" --state all \
 --json createdAt \
 | jq --arg date "$(date -d '30 days ago' +%Y-%m-%d)" \
 '[.[] | select(.createdAt >= $date)] | length'

If additions consistently exceed closures, increase the debt budget or reduce feature velocity until the trend reverses.


Built by theluckystrike — More at zovo.one