Handoff Readiness Check
Purpose
Evaluate whether a project, service, or feature is ready to be handed off to another engineer, team, or on-call rotation. Check that documentation is accurate and complete, local setup works from a cold start, tests pass and are meaningful, runbooks cover incident scenarios, there is no single person who is irreplaceable (bus factor), and an incoming engineer can be productive within a defined time target. Produce a scored readiness report with specific gaps and remediation tasks.
When to use
- A team member is leaving and their components need to be transferred to others.
- An external vendor or agency is handing a codebase to an internal team.
- A project exits active development and enters maintenance mode.
- An on-call rotation is being extended to include engineers who did not build the service.
- A code review reveals that only one person understands how a critical component works.
When not to use
- The task is to build the documentation from scratch — that is a writing task; use this skill to evaluate existing documentation.
- The handoff is for a very short-lived prototype that will be discarded.
- A formal onboarding checklist already exists and was recently validated.
Procedure
- Evaluate the README. Read
README.md and check for:
- Purpose statement: what does this service/component do, in one paragraph?
- Prerequisites: exact versions of runtime (Node 20, Python 3.12), required global tools, and how to install them.
- Install command:
npm install, pip install -r requirements.txt, etc. — must be one command.
- Start command:
npm run dev, docker-compose up, etc. — must be one command.
- Test command:
npm test, pytest, etc.
- Link to architecture diagram or decision records if the system is non-trivial.
Attempt to follow the README steps mentally; flag any step that requires implicit knowledge.
Verify local setup from a cold start. Check for an .env.example or equivalent with all required variables and placeholder values. Confirm there are no hard-coded paths to the original developer's machine. Confirm any seed or init scripts are documented and idempotent.
Assess architecture documentation. For services older than 3 months or with more than 5 components, check for:
- System context diagram (what external systems does this connect to?).
- Data flow diagram or sequence diagram for the primary user action.
- ERD or schema summary for databases with more than 10 tables.
- ADRs (Architecture Decision Records) for non-obvious technology choices.
Missing diagrams are acceptable if the system is small; document what "small" means for this context.
- Review runbooks. For each production incident type the service could experience, check for a runbook covering:
- How to detect the issue (which alert fires, which log pattern to look for).
- How to diagnose the root cause (which dashboard, which query to run).
- How to remediate (exact commands, with expected output).
- How to verify the fix.
Check the runbook list against the actual alert rules in monitoring config.
- Identify bus factor risks. Run
git log --format='%ae' | sort | uniq -c | sort -rn to see commit distribution. A single author with >70% of commits and no recent commits from others is a bus factor risk. Also check for:
- Vendor-specific tooling only one person knows how to operate.
- Undocumented production credentials stored only in one person's password manager.
- Critical scripts living only on a developer's laptop.
- Validate test suite health. Run the test suite (or read recent CI results) and confirm:
- Tests pass consistently, not intermittently.
- Test coverage is above a meaningful threshold for the critical paths.
- Tests are readable: a new engineer can understand what is being tested without asking the original author.
- Flaky tests are documented, not just skipped with
xit or @pytest.mark.skip.
Check dependency freshness. Verify no runtime dependency is end-of-life (Node 16, Python 3.8, Rails 6). End-of-life dependencies receive no security patches and become increasingly difficult to support.
Audit secret and credential ownership. Confirm all production secrets are stored in a team-accessible secret manager (not a personal 1Password account). Confirm the team has access to: cloud provider console, DNS management, monitoring dashboard, error tracking.
Estimate time-to-productivity for an incoming engineer. Based on the above, estimate: how long it takes to get the service running locally, understand the architecture, make a small change, and deploy it. Anything over 2 days for a straightforward service is a handoff risk.
Produce a gap list with owners. For each gap found, create a specific actionable task with an estimated effort (15 min, 1 hour, 1 day) so the outgoing engineer can prioritize before departure.
Checklist
Common issues & anti-patterns
- README last updated 18 months ago: the install command references a package that was renamed; new engineers spend hours debugging a one-word change.
- "Ask Alice" documentation: README says "ask Alice about the deploy process" — Alice has left.
- Setup requires Homebrew formula from a private tap: the tap is no longer maintained; the setup is broken for new machines.
- Runbook references a dashboard that was renamed: the engineer pages the on-call for a P1 incident and cannot find the dashboard during the fire.
- Critical SQL queries stored in a personal Notion page: the team cannot find them during an incident.
- Bus factor = 1 for the database schema: nobody knows why certain columns exist; changes break things unexpectedly.
- Tests pass but are meaningless: 100% coverage via mocking everything, including the unit under test.
- Docker Compose works on macOS but not Linux: environment-specific setup issues are undocumented.
- Production secrets in a personal Google Drive share: inaccessible when the owner's account is deactivated.
Required output
## Handoff Readiness Report: [Service/Project Name]
### Overall readiness score: X/10
### README quality
- Purpose statement: present / missing
- Prerequisites with versions: present / missing / incomplete
- Install command: present / missing / broken
- Start command: present / missing / broken
- Test command: present / missing
- Issues: list
### Local setup
- .env.example: present / missing
- Setup followable without prior knowledge: yes / no
- Blockers: list
### Architecture documentation
- System context diagram: present / missing
- Data flow / sequence diagram: present / missing
- ADRs: present (N) / missing
- Gaps: list
### Runbooks
- Active alerts: N
- Runbooks covering those alerts: M (X%)
- Missing runbooks: list of alert names
### Bus factor
- Author distribution: top contributor owns X% of commits
- Team-accessible credentials: yes / no
- Single-owner knowledge areas: list
### Test suite health
- Pass rate: X% (consistent / flaky)
- Skipped tests: N (with explanations: yes/no)
### Dependency health
- End-of-life dependencies: list
### Time-to-productivity estimate
- Get running locally: X hours
- Understand architecture: X hours
- Make a change and deploy: X hours
- Total: X hours — acceptable / at risk
### Gap remediation tasks (ordered by priority)
| Task | Effort | Owner |
|------|--------|-------|
| Add .env.example | 15 min | outgoing dev |
| Write deploy runbook | 2 hours | outgoing dev |
| Transfer DB credentials to 1Password team vault | 30 min | outgoing dev |
Safety
- Do not access or modify production secret stores, cloud consoles, or monitoring systems.
- Do not run setup or install commands that would change the developer's environment.
- Do not create or modify documentation files — produce the gap list for the human to act on.
- Do not commit any changes on behalf of the outgoing engineer.
1---2name: handoff-readiness-check3description: Use when you need to check documentation, runbooks, install commands, local startup, tests, and transfer readiness.4---56# Handoff Readiness Check78## Purpose910Evaluate whether a project, service, or feature is ready to be handed off to another engineer, team, or on-call rotation. Check that documentation is accurate and complete, local setup works from a cold start, tests pass and are meaningful, runbooks cover incident scenarios, there is no single person who is irreplaceable (bus factor), and an incoming engineer can be productive within a defined time target. Produce a scored readiness report with specific gaps and remediation tasks.1112## When to use1314- A team member is leaving and their components need to be transferred to others.15- An external vendor or agency is handing a codebase to an internal team.16- A project exits active development and enters maintenance mode.17- An on-call rotation is being extended to include engineers who did not build the service.18- A code review reveals that only one person understands how a critical component works.1920## When not to use2122- The task is to build the documentation from scratch — that is a writing task; use this skill to evaluate existing documentation.23- The handoff is for a very short-lived prototype that will be discarded.24- A formal onboarding checklist already exists and was recently validated.2526## Procedure27281. **Evaluate the README.** Read `README.md` and check for:29 - Purpose statement: what does this service/component do, in one paragraph?30 - Prerequisites: exact versions of runtime (Node 20, Python 3.12), required global tools, and how to install them.31 - Install command: `npm install`, `pip install -r requirements.txt`, etc. — must be one command.32 - Start command: `npm run dev`, `docker-compose up`, etc. — must be one command.33 - Test command: `npm test`, `pytest`, etc.34 - Link to architecture diagram or decision records if the system is non-trivial.35 Attempt to follow the README steps mentally; flag any step that requires implicit knowledge.36372. **Verify local setup from a cold start.** Check for an `.env.example` or equivalent with all required variables and placeholder values. Confirm there are no hard-coded paths to the original developer's machine. Confirm any seed or init scripts are documented and idempotent.38393. **Assess architecture documentation.** For services older than 3 months or with more than 5 components, check for:40 - System context diagram (what external systems does this connect to?).41 - Data flow diagram or sequence diagram for the primary user action.42 - ERD or schema summary for databases with more than 10 tables.43 - ADRs (Architecture Decision Records) for non-obvious technology choices.44 Missing diagrams are acceptable if the system is small; document what "small" means for this context.45464. **Review runbooks.** For each production incident type the service could experience, check for a runbook covering:47 - How to detect the issue (which alert fires, which log pattern to look for).48 - How to diagnose the root cause (which dashboard, which query to run).49 - How to remediate (exact commands, with expected output).50 - How to verify the fix.51 Check the runbook list against the actual alert rules in monitoring config.52535. **Identify bus factor risks.** Run `git log --format='%ae' | sort | uniq -c | sort -rn` to see commit distribution. A single author with >70% of commits and no recent commits from others is a bus factor risk. Also check for:54 - Vendor-specific tooling only one person knows how to operate.55 - Undocumented production credentials stored only in one person's password manager.56 - Critical scripts living only on a developer's laptop.57586. **Validate test suite health.** Run the test suite (or read recent CI results) and confirm:59 - Tests pass consistently, not intermittently.60 - Test coverage is above a meaningful threshold for the critical paths.61 - Tests are readable: a new engineer can understand what is being tested without asking the original author.62 - Flaky tests are documented, not just skipped with `xit` or `@pytest.mark.skip`.63647. **Check dependency freshness.** Verify no runtime dependency is end-of-life (Node 16, Python 3.8, Rails 6). End-of-life dependencies receive no security patches and become increasingly difficult to support.65668. **Audit secret and credential ownership.** Confirm all production secrets are stored in a team-accessible secret manager (not a personal 1Password account). Confirm the team has access to: cloud provider console, DNS management, monitoring dashboard, error tracking.67689. **Estimate time-to-productivity for an incoming engineer.** Based on the above, estimate: how long it takes to get the service running locally, understand the architecture, make a small change, and deploy it. Anything over 2 days for a straightforward service is a handoff risk.697010. **Produce a gap list with owners.** For each gap found, create a specific actionable task with an estimated effort (15 min, 1 hour, 1 day) so the outgoing engineer can prioritize before departure.7172## Checklist7374- [ ] README has: purpose, prerequisites (with exact versions), install, start, and test commands.75- [ ] `.env.example` exists with all variables and placeholder values.76- [ ] Local setup can be followed without implicit knowledge.77- [ ] Architecture documentation exists for systems with > 5 components.78- [ ] Runbooks cover every active production alert rule.79- [ ] Bus factor: at least 2 people can operate the service without the original author.80- [ ] All production credentials are in a team-accessible secret manager.81- [ ] Test suite passes consistently; no unexplained skipped tests.82- [ ] No runtime dependency is end-of-life.83- [ ] Time-to-productivity estimate is documented and acceptable (< 2 days for a typical engineer).8485## Common issues & anti-patterns8687- **README last updated 18 months ago**: the install command references a package that was renamed; new engineers spend hours debugging a one-word change.88- **"Ask Alice" documentation**: README says "ask Alice about the deploy process" — Alice has left.89- **Setup requires Homebrew formula from a private tap**: the tap is no longer maintained; the setup is broken for new machines.90- **Runbook references a dashboard that was renamed**: the engineer pages the on-call for a P1 incident and cannot find the dashboard during the fire.91- **Critical SQL queries stored in a personal Notion page**: the team cannot find them during an incident.92- **Bus factor = 1 for the database schema**: nobody knows why certain columns exist; changes break things unexpectedly.93- **Tests pass but are meaningless**: 100% coverage via mocking everything, including the unit under test.94- **Docker Compose works on macOS but not Linux**: environment-specific setup issues are undocumented.95- **Production secrets in a personal Google Drive share**: inaccessible when the owner's account is deactivated.9697## Required output9899```100## Handoff Readiness Report: [Service/Project Name]101102### Overall readiness score: X/10103104### README quality105- Purpose statement: present / missing106- Prerequisites with versions: present / missing / incomplete107- Install command: present / missing / broken108- Start command: present / missing / broken109- Test command: present / missing110- Issues: list111112### Local setup113- .env.example: present / missing114- Setup followable without prior knowledge: yes / no115- Blockers: list116117### Architecture documentation118- System context diagram: present / missing119- Data flow / sequence diagram: present / missing120- ADRs: present (N) / missing121- Gaps: list122123### Runbooks124- Active alerts: N125- Runbooks covering those alerts: M (X%)126- Missing runbooks: list of alert names127128### Bus factor129- Author distribution: top contributor owns X% of commits130- Team-accessible credentials: yes / no131- Single-owner knowledge areas: list132133### Test suite health134- Pass rate: X% (consistent / flaky)135- Skipped tests: N (with explanations: yes/no)136137### Dependency health138- End-of-life dependencies: list139140### Time-to-productivity estimate141- Get running locally: X hours142- Understand architecture: X hours143- Make a change and deploy: X hours144- Total: X hours — acceptable / at risk145146### Gap remediation tasks (ordered by priority)147| Task | Effort | Owner |148|------|--------|-------|149| Add .env.example | 15 min | outgoing dev |150| Write deploy runbook | 2 hours | outgoing dev |151| Transfer DB credentials to 1Password team vault | 30 min | outgoing dev |152```153154## Safety155156- Do not access or modify production secret stores, cloud consoles, or monitoring systems.157- Do not run setup or install commands that would change the developer's environment.158- Do not create or modify documentation files — produce the gap list for the human to act on.159- Do not commit any changes on behalf of the outgoing engineer.