Unit 18 · lesson

Write the Handoff So the Next Engineer Can Continue Without You

The final product of a technical project is not only the code or the demo. It is the ability for another person to understand the current state, reproduce the working parts, recognize the known limits, and continue safely.

A handoff is where all of those boundaries become operational.

Start with current state, not project history

The first paragraph should answer:

What exists now?
What is demonstrated?
What is not demonstrated?
What is the next bounded action?

Do not begin with a long story about every week of the course.

A useful opening might say:

The course project contains a tested Java component model, documented WPILib/JUnit evidence, a ROS 2 Jazzy runtime evidence set, and a reproducible robotnix_bringup workspace/launch path. Java-to-ROS data exchange remains proposed but not demonstrated, and physical robot behavior is outside the required evidence. The next engineering milestone is to select an authorized integration mechanism and verify one correlated data item across the boundary.

Use your actual statuses.

Record the reproducible environments

Include the exact software/runtime assumptions:

Java: OpenJDK 25
ROS OS: Ubuntu 24.04
ROS distribution: Jazzy Jalisco
ROS workspace: ~/robot_ws
bringup package: robotnix_bringup

If your local environment differs, record the actual environment instead of copying the canonical one silently.

The handoff should point to the Repeatable Startup Runbook rather than duplicating every command.

Still summarize the critical verification points:

expected package prefix
expected launch file
expected node names
expected topic name/type
expected endpoint counts

A new engineer should know what "working" looks like before running anything.

Record:

  • project/test location;
  • test command or environment;
  • key boundary cases;
  • known supplied-versus-local evidence status.

Do not say:

run the tests

without identifying which tests protect the load-bearing requirements.

For example:

strict 0.50 m boundary
invalid update preserves previous valid state

Those are the tests a future change must not accidentally weaken.

Record the architecture boundary explicitly

Include a section named something like:

Java-to-ROS integration status

State:

  • bridge implementation status;
  • proposed data contract;
  • source of truth;
  • units/freshness requirements;
  • required end-to-end evidence;
  • why current independent Java/ROS evidence is insufficient to claim integration.

This prevents a future engineer from inheriting a false assumption.

Include known failure modes and their detectors

Do not list every bug you encountered.

Include the failures that teach how the architecture breaks:

unsourced overlay -> package prefix check
stale launch install -> source/install comparison + rebuild
QoS mismatch -> verbose topic endpoint inspection
one-sided remap -> node/topic relationship inspection
Java boundary defect -> exact-boundary JUnit test

These become regression knowledge.

Preserve the controlled failure record

The handoff should identify the failure you injected in Week 17 and the detector that caught it.

Future engineers can use that record to confirm the same regression protection still works after changes.

A failure case is valuable when it remains reproducible.

Record what should not be changed casually

Examples:

  • strict comparison semantics tied to a requirement;
  • units in component fields/data contracts;
  • ROS QoS assumptions for the selected /scan case;
  • workspace/package identity;
  • launch remapping contract;
  • integration status wording until bridge evidence exists.

Do not turn these into bureaucratic locks. Explain why they are load-bearing.

Separate open questions from defects

A defect is a known behavior that violates a requirement.

An open question is something not yet selected or demonstrated.

Example defect:

listener remapping is wrong in installed launch resource

Example open question:

which authorized mechanism should connect WPILib Java data to ROS 2?

Do not write the open question as if a broken bridge already exists.

Write next actions in bounded order

Weak:

Finish integration and test the robot.

Stronger:

  1. Select the Java-to-ROS integration mechanism using current Jazzy/WPILib constraints.
  2. Define one message/data contract with units and freshness.
  3. Implement one-direction proof of concept.
  4. Trace one correlated value from Java producer to ROS consumer.
  5. Add failure/reconnect evidence.
  6. Only then design a controlled physical validation plan if hardware is available and approved.

Each step creates evidence needed for the next claim.

Include rollback/recovery information where needed

For ROS bringup changes, a new engineer should know that source is canonical and generated install resources are rebuilt.

If a launch change causes a regression:

revert source change
rebuild robotnix_bringup
source intended overlay
rerun verification

Do not recommend editing generated install files as rollback.

Keep the handoff readable

A handoff is not a raw dump of every log.

Use links/references to the evidence dossier.

The handoff should summarize:

current state
how to reproduce
what to verify
known limits
known regressions
next actions

The detailed records remain attached separately.

Build the Final Engineering Handoff

Required sections:

Current readiness state

Use the final statuses.

Environment

Record Java, OS, ROS distribution, workspace, package.

Reproduce Java evidence

Point to the tests and key requirements.

Reproduce ROS bringup

Point to the runbook and expected graph.

Java-to-ROS integration status

Attach the integration contract.

Known failure/regression cases

List detector and recovery evidence.

Known limitations

State physical/integration gaps.

Next bounded actions

Order the next engineering milestones.

Evidence index

Point to the readiness dossier and defense packet.

Your turn

Write the handoff as if you will not be available to answer questions tomorrow.

Then review it with one final test:

Could another technically capable student reproduce the demonstrated Java and ROS results without my shell history, private assumptions, or verbal explanation?

If the answer is no, fix the handoff before calling the course complete.

The final lab is the technical defense and handoff review. No new hidden feature is required.