Harness Offboarding
Conduct a structured departure debrief for an engineer leaving a harness-managed project. Capture the in-flight context, decisions, and social knowledge they hold in their head, hand off open work and ownership, run an access/knowledge/secret checklist, and verify nothing load-bearing leaves with the person. The symmetric counterpart to harness-onboarding: onboarding gets knowledge in, offboarding gets knowledge out before it is lost.
When to Use
- An engineer (human or agent operator) is leaving a harness-managed project, changing teams, or handing off long-term ownership
- Team shrinkage or reorganization where a person's areas of expertise need a documented successor
- A contractor or temporary contributor is rolling off and their access must be revoked cleanly
- Before extended leave when someone else must carry the person's in-flight work
- When someone asks "how do we hand this off?" or "what do we lose when X leaves?"
- NOT for routine end-of-session handoff between agents (use
summarize_session / session state directly)
- NOT for archiving or decommissioning a whole project (this is about a person leaving, not the repo ending)
- NOT when the project has no harness configuration (there is no durable surface to write the handoff into — onboard to harness first with harness-initialize-project)
Process
Phase 1: CAPTURE — Debrief the In-Flight Context
The goal is to extract what is only in the departing person's head before it walks out the door. Run this as a structured interview, one topic at a time, and record the answers verbatim — do not paraphrase away specifics.
Seed the debrief from durable surfaces first, so the interview fills gaps rather than re-deriving what is already written:
search_sessions and summarize_session — recent sessions the person drove; surface the decisions and dead-ends already recorded so the interview does not repeat them.
.harness/learnings.md — what is already captured vs. what the person will say is missing.
.harness/state.json — the current phase, active task, and any recorded blockers they own.
- Recent commit and PR authorship (
git log --author, open PRs) — the surface area they touched most.
Conduct the debrief across the five extraction topics. Ask about each explicitly; silence on a topic is a gap, not a pass:
- Recent decisions made — choices taken that are not yet written as an ADR (why this library, why this boundary, why this trade-off). These become ADR drafts in Phase 3.
- Undocumented gotchas — the "everyone knows not to touch X on a Friday deploy" tacit knowledge. Fragile sequences, non-obvious ordering, environment quirks.
- Conventions held in head — patterns the person enforced in review that were never written into
AGENTS.md or a linter (naming, error handling, test structure).
- Areas of expertise — the subsystems where this person was the de-facto owner and who (if anyone) can inherit each.
- Known fragile components — the parts that break in surprising ways, the code nobody else understands, the "here be dragons" map.
Record answers into the handoff artifact scaffold (written in Phase 3), keeping the person's own words for gotchas and fragility notes — the phrasing carries the warning.
Phase 2: HANDOFF — Transfer Open Work and Ownership
Move everything the person currently owns to a named successor or an explicit "unowned — needs an owner" state. Nothing may silently remain assigned to someone who is gone.
Reassign roadmap ownership. Enumerate roadmap rows where the departing person is the Assignee (sharded shards under docs/roadmap.d/, or docs/roadmap.md for monolith projects). For each, either reassign to a successor or mark the assignee empty and flag the row in the handoff artifact as needing an owner. Use manage_roadmap (or edit the shard's - **Assignee:** line directly for sharded roadmaps — never hand-edit the generated docs/roadmap.md).
Hand off in-flight work. For each open branch, draft PR, or mid-execution plan the person owns:
- Capture its current state, what is left, and any local-only context (uncommitted intent, review feedback not yet addressed).
- If
.harness/state.json shows an active task mid-plan, record where execution stands and what the next task expects, so a successor can resume from harness state show.
- Name the successor per item, or mark it explicitly orphaned for triage.
Transfer expertise ownership. For each area of expertise from Phase 1, record the successor. Where there is no successor, that is the highest-priority gap for the team to resolve — surface it prominently.
Phase 3: CHECKLIST — Knowledge, Access, and Secrets
Run the departure checklist. Knowledge items are performed here; access and secret items are reminders the skill surfaces for a human or platform admin to action — the skill never touches credentials itself.
Materialize the handoff artifact. Write docs/knowledge/handoff-{person}-{date}.md containing the captured debrief, the ownership transfer table, and the checklist status. Use the template in "Handoff Artifact Format" below. This is the durable deliverable — unlike onboarding's conversational orientation, offboarding leaves a permanent record.
Generate ADR drafts from the "recent decisions" captured in Phase 1. Write each as a draft decision record under the project's decisions location (docs/knowledge/decisions/ or wherever AGENTS.md points), marked status: draft for a remaining team member to ratify. Do not invent rationale the person did not give.
Ingest into the knowledge graph. Run ingest_source on the new handoff artifact and any ADR drafts so the captured knowledge is queryable via query_graph after the person is gone. This is what makes the capture load-bearing rather than a document that rots unread.
Access and secret revocation reminders (surface as an actionable checklist — the skill does not execute these):
- Repository and org access (GitHub/GitLab collaborator, team membership, admin rights)
- CI/CD and deploy credentials, service accounts the person provisioned
- Cloud console, database, and infrastructure access
- Secrets the person may know (shared credentials, signing keys, API tokens) — flag for rotation, not just revocation, since knowledge of a secret is not revoked by removing access
- Third-party SaaS seats (monitoring, error tracking, package registries)
- Personal access tokens or bot tokens tied to the person's account that automation depends on — these must be re-issued under a service identity before revocation, or automation breaks
Knowledge-surface gap review. Compare the debrief answers against the project's written knowledge surfaces and list what is missing:
AGENTS.md — conventions the person named that are not documented here
STRATEGY.md — product/direction context the person held that is not captured
.harness/learnings.md — gotchas and fragility notes not yet recorded
Each gap becomes a follow-up item in the handoff artifact.
Phase 4: VERIFY — Confirm Nothing Is Orphaned
The exit gate. The person should not leave until each of these is closed or explicitly accepted as a known gap.
No orphaned ownership. No roadmap row still lists the departing person as assignee without either a successor or an explicit "needs owner" flag. Re-scan the roadmap to confirm.
No orphaned in-flight work. Every open branch/PR/plan the person owned has a named successor or is flagged for triage. Nothing is silently abandoned.
Capture is durable and queryable. The handoff artifact exists, ADR drafts are written, and query_graph can retrieve the ingested handoff — verify with a spot query (e.g., ask the graph for the person's areas of expertise).
Access checklist is acknowledged. Every revocation/rotation reminder has an owner and a status (done / pending / N/A). Secrets the person knew are flagged for rotation, not just access removal.
Gaps are visible, not hidden. Any area of expertise with no successor, any undocumented convention, any fragile component with no written warning is listed prominently at the top of the handoff artifact as an accepted risk — so the team decides knowingly rather than discovering it the day it breaks.
Handoff Artifact Format
Write to docs/knowledge/handoff-{person}-{date}.md:
# Handoff: <person> — <date>
## Open Risks (read first)
- <area of expertise with no successor>
- <fragile component with no written owner>
- <undocumented convention now at risk>
## In-Flight Work
| Item | State | What's Left | Successor |
| ---------------- | ------- | ----------- | -------------------- |
| <branch/PR/plan> | <state> | <remaining> | <name / NEEDS OWNER> |
## Ownership Transfer
| Area of Expertise | Successor | Notes |
| ----------------- | -------------------- | --------- |
| <subsystem> | <name / NEEDS OWNER> | <context> |
## Decisions Captured (ADR drafts pending)
- <decision> → <adr-draft path> (status: draft)
## Undocumented Gotchas
- <gotcha, in the person's own words>
## Fragile Components
- <component>: <why it's fragile, what breaks it>
## Access & Secret Checklist
| Item | Action | Owner | Status |
| --------------- | ------ | ------- | ------- |
| <repo access> | revoke | <admin> | pending |
| <shared secret> | rotate | <admin> | pending |
## Knowledge-Surface Gaps
- AGENTS.md: <missing convention>
- STRATEGY.md: <missing context>
- .harness/learnings.md: <missing gotcha>
Harness Integration
search_sessions / summarize_session — Seed the debrief from the sessions the person drove; recover decisions and dead-ends already recorded.
ingest_source — Ingest the handoff artifact and ADR drafts into the knowledge graph so captured knowledge is queryable after departure.
query_graph — Verify the capture is durable and retrieve the person's areas of expertise as a completeness check.
manage_roadmap — Reassign or unassign roadmap rows the person owned (or edit the shard's - **Assignee:** line directly for sharded roadmaps).
harness state show — Read .harness/state.json to recover the person's active task and blockers for in-flight handoff.
.harness/learnings.md — Both a seed (what's captured) and a target (where new gotchas land).
AGENTS.md / STRATEGY.md — Compared against the debrief to surface undocumented conventions and lost product context.
Success Criteria
- The five extraction topics were each asked about explicitly (decisions, gotchas, conventions, expertise, fragile components) — no topic silently skipped
- Session history was reviewed via
search_sessions / summarize_session before the interview, so the debrief filled gaps rather than repeating recorded work
- Every roadmap row assigned to the departing person was reassigned or explicitly flagged as needing an owner
- Every open branch, PR, and mid-execution plan the person owned has a named successor or a triage flag
- A durable
docs/knowledge/handoff-{person}-{date}.md artifact was written with all sections filled
- ADR drafts were generated from the captured decisions and marked
status: draft (no invented rationale)
- The handoff artifact and ADR drafts were ingested into the knowledge graph and verified retrievable via
query_graph
- An access/secret checklist was produced, with secrets the person knew flagged for rotation (not just access revocation)
- Knowledge-surface gaps against
AGENTS.md, STRATEGY.md, and .harness/learnings.md were enumerated
- Open risks (expertise with no successor, unwarned fragile components) are listed prominently, not buried
Rationalizations to Reject
| Rationalization |
Reality |
| "They wrote good commit messages, so the context is already captured — I can skip the debrief." |
Commit messages record what changed, not the decisions not taken, the gotchas never hit in a commit, or the conventions enforced in review. The tacit knowledge is exactly what commits do not hold. |
| "There's no successor for this area, so I'll leave it blank and move on." |
A blank owner is the single most dangerous outcome of offboarding. An unowned area of expertise must be surfaced as an open risk at the top of the artifact so the team resolves it knowingly — not discovered the day it breaks. |
| "Revoking their repo access covers the secrets too." |
Removing access does not un-know a secret. Any shared credential, signing key, or token the person knew must be flagged for rotation. Access revocation and secret rotation are different actions with different owners. |
| "I'll write the handoff doc but skip graph ingestion — the file is enough." |
A file nobody queries rots unread. Ingesting into the knowledge graph is what makes the capture retrievable by the next person who asks 'who understood X?' — that is the difference between capture and burial. |
Examples
Example: Offboarding the De-Facto Owner of a Payments Module
CAPTURE:
search_sessions(author: "dana") → 3 recent sessions on the payments retry logic
summarize_session → "chose exponential backoff over fixed; idempotency key is (orderId, attempt)"
Debrief:
- Decisions: "Picked Stripe over Adyen for the EU rollout — Adyen's webhook retry
semantics didn't match our idempotency model." (no ADR exists)
- Gotchas: "The reconciliation job MUST run after the settlement window closes at
23:00 UTC — running it early double-counts refunds."
- Conventions held in head: "All money is cents-as-integer, never float — enforced
in review, never linted."
- Areas of expertise: payments/, the reconciliation cron — no clear successor.
- Fragile components: "The refund path has a race if two partial refunds land in the
same second — guarded by a DB unique constraint nobody documented."
HANDOFF:
Roadmap: 2 rows assigned to dana → 1 reassigned to sam, 1 marked NEEDS OWNER
In-flight: branch fix/refund-race → 80% done, review feedback unaddressed → successor sam
State: .harness/state.json shows execute phase, task 3 of 5 on the reconciliation plan
Expertise: payments/ → NEEDS OWNER (surfaced as top open risk)
CHECKLIST + VERIFY:
Wrote docs/knowledge/handoff-dana-2026-08-05.md
ADR draft: docs/knowledge/decisions/stripe-over-adyen.md (status: draft)
ingest_source(handoff-dana-2026-08-05.md) → 1 node, 4 edges
query_graph("dana areas of expertise") → returns payments, reconciliation ✓
Access checklist: repo access (revoke), Stripe dashboard seat (revoke),
shared Stripe restricted key dana provisioned (ROTATE), CI deploy token (re-issue under service acct)
Gaps: AGENTS.md missing "money is integer-cents"; learnings.md missing reconciliation timing gotcha
Open risk logged: payments/ has no successor
Example: Offboarding a Rolling-Off Contractor
CAPTURE:
Short-tenure contributor, one subsystem (the CSV import feature).
Debrief:
- Decisions: none beyond what's in the merged PRs.
- Gotchas: "The importer assumes UTF-8; latin-1 files silently corrupt — no test covers it."
- Conventions: followed existing ones, none held in head.
- Expertise: CSV import only; the full-time team already knows it.
- Fragile: the encoding assumption above.
HANDOFF + CHECKLIST + VERIFY:
Roadmap: no rows assigned. In-flight: none open.
Wrote docs/knowledge/handoff-jordan-2026-08-05.md (short — most sections "none")
No ADR drafts (no undocumented decisions).
ingest_source → captured the encoding gotcha as a knowledge node.
Access checklist: contractor GitHub collaborator access (revoke), no secrets known (N/A).
Gap: learnings.md missing the UTF-8/latin-1 encoding gotcha → added.
Verify: no orphaned ownership, no orphaned work, gotcha is queryable. Clean exit.
1---2name: harness-offboarding3description: Harness Offboarding4---5# Harness Offboarding67> Conduct a structured departure debrief for an engineer leaving a harness-managed project. Capture the in-flight context, decisions, and social knowledge they hold in their head, hand off open work and ownership, run an access/knowledge/secret checklist, and verify nothing load-bearing leaves with the person. The symmetric counterpart to harness-onboarding: onboarding gets knowledge _in_, offboarding gets knowledge _out_ before it is lost.89## When to Use1011- An engineer (human or agent operator) is leaving a harness-managed project, changing teams, or handing off long-term ownership12- Team shrinkage or reorganization where a person's areas of expertise need a documented successor13- A contractor or temporary contributor is rolling off and their access must be revoked cleanly14- Before extended leave when someone else must carry the person's in-flight work15- When someone asks "how do we hand this off?" or "what do we lose when X leaves?"16- NOT for routine end-of-session handoff between agents (use `summarize_session` / session state directly)17- NOT for archiving or decommissioning a whole project (this is about a _person_ leaving, not the repo ending)18- NOT when the project has no harness configuration (there is no durable surface to write the handoff into — onboard to harness first with harness-initialize-project)1920## Process2122### Phase 1: CAPTURE — Debrief the In-Flight Context2324The goal is to extract what is _only_ in the departing person's head before it walks out the door. Run this as a structured interview, one topic at a time, and record the answers verbatim — do not paraphrase away specifics.25261. **Seed the debrief from durable surfaces first**, so the interview fills gaps rather than re-deriving what is already written:27 - `search_sessions` and `summarize_session` — recent sessions the person drove; surface the decisions and dead-ends already recorded so the interview does not repeat them.28 - `.harness/learnings.md` — what is already captured vs. what the person will say is missing.29 - `.harness/state.json` — the current phase, active task, and any recorded blockers they own.30 - Recent commit and PR authorship (`git log --author`, open PRs) — the surface area they touched most.31322. **Conduct the debrief across the five extraction topics.** Ask about each explicitly; silence on a topic is a gap, not a pass:33 - **Recent decisions made** — choices taken that are not yet written as an ADR (why this library, why this boundary, why this trade-off). These become ADR drafts in Phase 3.34 - **Undocumented gotchas** — the "everyone knows not to touch X on a Friday deploy" tacit knowledge. Fragile sequences, non-obvious ordering, environment quirks.35 - **Conventions held in head** — patterns the person enforced in review that were never written into `AGENTS.md` or a linter (naming, error handling, test structure).36 - **Areas of expertise** — the subsystems where this person was the de-facto owner and who (if anyone) can inherit each.37 - **Known fragile components** — the parts that break in surprising ways, the code nobody else understands, the "here be dragons" map.38393. **Record answers into the handoff artifact scaffold** (written in Phase 3), keeping the person's own words for gotchas and fragility notes — the phrasing carries the warning.4041### Phase 2: HANDOFF — Transfer Open Work and Ownership4243Move everything the person currently _owns_ to a named successor or an explicit "unowned — needs an owner" state. Nothing may silently remain assigned to someone who is gone.44451. **Reassign roadmap ownership.** Enumerate roadmap rows where the departing person is the `Assignee` (sharded shards under `docs/roadmap.d/`, or `docs/roadmap.md` for monolith projects). For each, either reassign to a successor or mark the assignee empty and flag the row in the handoff artifact as needing an owner. Use `manage_roadmap` (or edit the shard's `- **Assignee:**` line directly for sharded roadmaps — never hand-edit the generated `docs/roadmap.md`).46472. **Hand off in-flight work.** For each open branch, draft PR, or mid-execution plan the person owns:48 - Capture its current state, what is left, and any local-only context (uncommitted intent, review feedback not yet addressed).49 - If `.harness/state.json` shows an active task mid-plan, record where execution stands and what the next task expects, so a successor can resume from `harness state show`.50 - Name the successor per item, or mark it explicitly orphaned for triage.51523. **Transfer expertise ownership.** For each area of expertise from Phase 1, record the successor. Where there is no successor, that is the highest-priority gap for the team to resolve — surface it prominently.5354### Phase 3: CHECKLIST — Knowledge, Access, and Secrets5556Run the departure checklist. Knowledge items are performed here; access and secret items are _reminders_ the skill surfaces for a human or platform admin to action — the skill never touches credentials itself.57581. **Materialize the handoff artifact.** Write `docs/knowledge/handoff-{person}-{date}.md` containing the captured debrief, the ownership transfer table, and the checklist status. Use the template in "Handoff Artifact Format" below. This is the durable deliverable — unlike onboarding's conversational orientation, offboarding leaves a permanent record.59602. **Generate ADR drafts** from the "recent decisions" captured in Phase 1. Write each as a draft decision record under the project's decisions location (`docs/knowledge/decisions/` or wherever `AGENTS.md` points), marked `status: draft` for a remaining team member to ratify. Do not invent rationale the person did not give.61623. **Ingest into the knowledge graph.** Run `ingest_source` on the new handoff artifact and any ADR drafts so the captured knowledge is queryable via `query_graph` after the person is gone. This is what makes the capture load-bearing rather than a document that rots unread.63644. **Access and secret revocation reminders** (surface as an actionable checklist — the skill does not execute these):65 - Repository and org access (GitHub/GitLab collaborator, team membership, admin rights)66 - CI/CD and deploy credentials, service accounts the person provisioned67 - Cloud console, database, and infrastructure access68 - Secrets the person may know (shared credentials, signing keys, API tokens) — flag for **rotation**, not just revocation, since knowledge of a secret is not revoked by removing access69 - Third-party SaaS seats (monitoring, error tracking, package registries)70 - Personal access tokens or bot tokens tied to the person's account that automation depends on — these must be re-issued under a service identity before revocation, or automation breaks71725. **Knowledge-surface gap review.** Compare the debrief answers against the project's written knowledge surfaces and list what is missing:73 - `AGENTS.md` — conventions the person named that are not documented here74 - `STRATEGY.md` — product/direction context the person held that is not captured75 - `.harness/learnings.md` — gotchas and fragility notes not yet recorded76 Each gap becomes a follow-up item in the handoff artifact.7778### Phase 4: VERIFY — Confirm Nothing Is Orphaned7980The exit gate. The person should not leave until each of these is closed or explicitly accepted as a known gap.81821. **No orphaned ownership.** No roadmap row still lists the departing person as assignee without either a successor or an explicit "needs owner" flag. Re-scan the roadmap to confirm.83842. **No orphaned in-flight work.** Every open branch/PR/plan the person owned has a named successor or is flagged for triage. Nothing is silently abandoned.85863. **Capture is durable and queryable.** The handoff artifact exists, ADR drafts are written, and `query_graph` can retrieve the ingested handoff — verify with a spot query (e.g., ask the graph for the person's areas of expertise).87884. **Access checklist is acknowledged.** Every revocation/rotation reminder has an owner and a status (done / pending / N/A). Secrets the person knew are flagged for rotation, not just access removal.89905. **Gaps are visible, not hidden.** Any area of expertise with no successor, any undocumented convention, any fragile component with no written warning is listed prominently at the top of the handoff artifact as an accepted risk — so the team decides knowingly rather than discovering it the day it breaks.9192## Handoff Artifact Format9394Write to `docs/knowledge/handoff-{person}-{date}.md`:9596```markdown97# Handoff: <person> — <date>9899## Open Risks (read first)100101- <area of expertise with no successor>102- <fragile component with no written owner>103- <undocumented convention now at risk>104105## In-Flight Work106107| Item | State | What's Left | Successor |108| ---------------- | ------- | ----------- | -------------------- |109| <branch/PR/plan> | <state> | <remaining> | <name / NEEDS OWNER> |110111## Ownership Transfer112113| Area of Expertise | Successor | Notes |114| ----------------- | -------------------- | --------- |115| <subsystem> | <name / NEEDS OWNER> | <context> |116117## Decisions Captured (ADR drafts pending)118119- <decision> → <adr-draft path> (status: draft)120121## Undocumented Gotchas122123- <gotcha, in the person's own words>124125## Fragile Components126127- <component>: <why it's fragile, what breaks it>128129## Access & Secret Checklist130131| Item | Action | Owner | Status |132| --------------- | ------ | ------- | ------- |133| <repo access> | revoke | <admin> | pending |134| <shared secret> | rotate | <admin> | pending |135136## Knowledge-Surface Gaps137138- AGENTS.md: <missing convention>139- STRATEGY.md: <missing context>140- .harness/learnings.md: <missing gotcha>141```142143## Harness Integration144145- **`search_sessions` / `summarize_session`** — Seed the debrief from the sessions the person drove; recover decisions and dead-ends already recorded.146- **`ingest_source`** — Ingest the handoff artifact and ADR drafts into the knowledge graph so captured knowledge is queryable after departure.147- **`query_graph`** — Verify the capture is durable and retrieve the person's areas of expertise as a completeness check.148- **`manage_roadmap`** — Reassign or unassign roadmap rows the person owned (or edit the shard's `- **Assignee:**` line directly for sharded roadmaps).149- **`harness state show`** — Read `.harness/state.json` to recover the person's active task and blockers for in-flight handoff.150- **`.harness/learnings.md`** — Both a seed (what's captured) and a target (where new gotchas land).151- **`AGENTS.md` / `STRATEGY.md`** — Compared against the debrief to surface undocumented conventions and lost product context.152153## Success Criteria154155- The five extraction topics were each asked about explicitly (decisions, gotchas, conventions, expertise, fragile components) — no topic silently skipped156- Session history was reviewed via `search_sessions` / `summarize_session` before the interview, so the debrief filled gaps rather than repeating recorded work157- Every roadmap row assigned to the departing person was reassigned or explicitly flagged as needing an owner158- Every open branch, PR, and mid-execution plan the person owned has a named successor or a triage flag159- A durable `docs/knowledge/handoff-{person}-{date}.md` artifact was written with all sections filled160- ADR drafts were generated from the captured decisions and marked `status: draft` (no invented rationale)161- The handoff artifact and ADR drafts were ingested into the knowledge graph and verified retrievable via `query_graph`162- An access/secret checklist was produced, with secrets the person knew flagged for rotation (not just access revocation)163- Knowledge-surface gaps against `AGENTS.md`, `STRATEGY.md`, and `.harness/learnings.md` were enumerated164- Open risks (expertise with no successor, unwarned fragile components) are listed prominently, not buried165166## Rationalizations to Reject167168| Rationalization | Reality |169| ----------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |170| "They wrote good commit messages, so the context is already captured — I can skip the debrief." | Commit messages record _what_ changed, not the decisions not taken, the gotchas never hit in a commit, or the conventions enforced in review. The tacit knowledge is exactly what commits do not hold. |171| "There's no successor for this area, so I'll leave it blank and move on." | A blank owner is the single most dangerous outcome of offboarding. An unowned area of expertise must be surfaced as an open risk at the top of the artifact so the team resolves it knowingly — not discovered the day it breaks. |172| "Revoking their repo access covers the secrets too." | Removing access does not un-know a secret. Any shared credential, signing key, or token the person knew must be flagged for rotation. Access revocation and secret rotation are different actions with different owners. |173| "I'll write the handoff doc but skip graph ingestion — the file is enough." | A file nobody queries rots unread. Ingesting into the knowledge graph is what makes the capture retrievable by the next person who asks 'who understood X?' — that is the difference between capture and burial. |174175## Examples176177### Example: Offboarding the De-Facto Owner of a Payments Module178179**CAPTURE:**180181```182search_sessions(author: "dana") → 3 recent sessions on the payments retry logic183summarize_session → "chose exponential backoff over fixed; idempotency key is (orderId, attempt)"184185Debrief:186 - Decisions: "Picked Stripe over Adyen for the EU rollout — Adyen's webhook retry187 semantics didn't match our idempotency model." (no ADR exists)188 - Gotchas: "The reconciliation job MUST run after the settlement window closes at189 23:00 UTC — running it early double-counts refunds."190 - Conventions held in head: "All money is cents-as-integer, never float — enforced191 in review, never linted."192 - Areas of expertise: payments/, the reconciliation cron — no clear successor.193 - Fragile components: "The refund path has a race if two partial refunds land in the194 same second — guarded by a DB unique constraint nobody documented."195```196197**HANDOFF:**198199```200Roadmap: 2 rows assigned to dana → 1 reassigned to sam, 1 marked NEEDS OWNER201In-flight: branch fix/refund-race → 80% done, review feedback unaddressed → successor sam202State: .harness/state.json shows execute phase, task 3 of 5 on the reconciliation plan203Expertise: payments/ → NEEDS OWNER (surfaced as top open risk)204```205206**CHECKLIST + VERIFY:**207208```209Wrote docs/knowledge/handoff-dana-2026-08-05.md210ADR draft: docs/knowledge/decisions/stripe-over-adyen.md (status: draft)211ingest_source(handoff-dana-2026-08-05.md) → 1 node, 4 edges212query_graph("dana areas of expertise") → returns payments, reconciliation ✓213Access checklist: repo access (revoke), Stripe dashboard seat (revoke),214 shared Stripe restricted key dana provisioned (ROTATE), CI deploy token (re-issue under service acct)215Gaps: AGENTS.md missing "money is integer-cents"; learnings.md missing reconciliation timing gotcha216Open risk logged: payments/ has no successor217```218219### Example: Offboarding a Rolling-Off Contractor220221**CAPTURE:**222223```224Short-tenure contributor, one subsystem (the CSV import feature).225Debrief:226 - Decisions: none beyond what's in the merged PRs.227 - Gotchas: "The importer assumes UTF-8; latin-1 files silently corrupt — no test covers it."228 - Conventions: followed existing ones, none held in head.229 - Expertise: CSV import only; the full-time team already knows it.230 - Fragile: the encoding assumption above.231```232233**HANDOFF + CHECKLIST + VERIFY:**234235```236Roadmap: no rows assigned. In-flight: none open.237Wrote docs/knowledge/handoff-jordan-2026-08-05.md (short — most sections "none")238No ADR drafts (no undocumented decisions).239ingest_source → captured the encoding gotcha as a knowledge node.240Access checklist: contractor GitHub collaborator access (revoke), no secrets known (N/A).241Gap: learnings.md missing the UTF-8/latin-1 encoding gotcha → added.242Verify: no orphaned ownership, no orphaned work, gotcha is queryable. Clean exit.243```