ShrubberyDocs
Guide

Counter-Offer Flow

How a Knight proposes different terms on a pending Handshake, and how the Lead accepts them.

01 · Overview

Overview

When a Knight receives a proposal that almost works, they can Counter-Offer instead of accepting or refusing. They edit objective and/or deadline while the row stays Pending_Handshake and flag pending_counter_offer. The Lead then accepts those terms into Active. This is the mirror of Renegotiation, which is Lead-initiated after a row is already Active.

02 · Actors

Actors

  • Knight — assignee on a Pending_Handshake row; proposes the alternative in the Accord.
  • Lead — assigner; sees the standing counter on Garden/Oversight and accepts (or edits again).
  • Squire — not involved.
03 · Flow

Flow

  1. Lead has already sent the Shrubbery — status Pending_Handshake; Knight sees it in the Accord.
  2. Knight opens "Propose alternative", changes extracted_task and/or deadline, and submits. No-op if neither field actually changed.
  3. System writes the new terms, sets pending_counter_offer = true, logs renegotiated with initiator: 'knight', and notifies the Lead (counter_offer_proposed). Status remains Pending_Handshake.
  4. Lead reviews the badge/card and accepts the counter-offer — Pending_HandshakeActive, flag cleared, activated_at set; audit accepted with via: 'counter_offer'.
  5. Alternatively the path ends without Lead accept: Knight refuses the commitment → Refused; or Lead edits the row (clears the counter flag and may re-open terms).
04 · Edge cases

Edge cases

  • Only while pending — Knights cannot counter-offer an Active row; after Handshake they deliver or the Lead renegotiates.
  • No dedicated reject — there is no refuseCounterOffer action. Lead re-edit supersedes; Knight refuse ends the commitment.
  • Lead renegotiation vs counter — Lead substantive edit on Active reverts to pending and clears any counter flag; that path is documented under Renegotiation.
  • Audit reuse — both Lead and Knight term changes can emit renegotiated; read initiator in the payload to tell them apart.
  • No rate limit yet — abuse caps for repeated counters are backlog, not enforced in product today.
  • Guest path — Guests on /handshake/[token] cannot counter-offer; accept or refuse only.
05 · Related

Last updated: 24 July 2026