Skip to content

Han Feedback: pairing-tdd-han-feedback (2026-09-03) #201

Description

@mxriverlynn

Han Feedback — 2026-09-03

Skills used: han-core:pairing, han-coding:tdd, han-feedback:han-feedback Agents used:
han-core:adversarial-validator Context: A pairing session driving a four-behavior TDD rewrite of a rename model in
a Rails monorepo, with one behavior marked expensive-to-walk-back in the pairing plan and therefore subject to the
pre-build ask from the collaborative stop rule. Outcome: All four behaviors were built, reviewed, and committed —
but the pre-build ask was mishandled in a way the person had to correct after the fact, and the protocol needs a rule
change.


The defect: the pre-build ask was bundled into the previous piece's stop, and silence about it was read as a decline

The pairing plan marked piece 3 as carrying an expensive-to-walk-back choice, so the stop rule's ask-before-build
applied. The run presented that ask inside the piece-2 stop message, after piece 2's review content, to save a turn.

The person was still focused on piece 2 — verifying it, confirming it was complete. They replied "commit and next",
meaning: commit piece 2, move on. The run interpreted that reply as also answering the piece-3 ask — specifically as a
declined answer ("just show me"), which the stop rule treats as first-class — and immediately built piece 3 on its own
read of the choice.

That interpretation was wrong. The person had not declined; they had not engaged with the question at all, because
nothing signaled that the stop message contained a second, forward-looking item awaiting a reply. They expected the ask
to arrive at the start of piece 3, after piece 2 was approved. The run only learned this when the person said so
explicitly, several stops later.

Why the current skill text permits this. The stop rule says the ask comes "before the build, not at the stop
afterward", and pairing Step 5 places it at the top of the loop iteration ("If the plan marked this piece expensive to
walk back, ask first"). Neither forbids folding the ask into the tail of the previous piece's stop — and a turn-frugal
run will do exactly that, because the previous stop is the last message before the build starts. The bundling satisfies
the letter of "before the build" while defeating the purpose: an ask the person never registered cannot collect an
independent read, and a reply aimed at the previous piece gets misparsed as an answer to it.

Suggested fix. Add an explicit rule to collaborative-stop-rule.md (and echo it in pairing Step 5): the pre-build
ask for piece N is its own turn, presented only after the person has responded to the piece N−1 stop. A stop presents
exactly one piece and asks nothing about future pieces. Corollary: a response to a stop is a response to that stop's
piece only — it must never be read as answering, or declining, a question about a later piece. If a run has already
bundled the ask and the reply addresses only the previous piece, the ask is unanswered: re-present it in its own turn
before building.


What worked well

  • The pairing plan and stop cadence were otherwise effective. Four pieces, one stop each, position/built/checkable
    presented in the stop-rule shape; the person steered commits and pacing throughout, and every piece was reviewed
    before the next began.
  • The TDD discipline held under pressure. Every behavior showed an observed red for the intended reason before
    production code changed; a wrong method call (save! on a command model with only execute!) was caught by the suite
    and fixed against existing-caller evidence; the final write-path swap was correctly treated as refactor-hat work gated
    by the green suite rather than forced through a fake red.
  • The adversarial-validator dispatch earned its cost. When the person challenged whether the new spec's scenario was
    reachable by a real user, the agent attacked the claim from four angles and returned a precise verdict (reachable at
    creation time, not via later deletion) with file-level evidence, an honest narrowing, and named residual risks. That
    evidence is what carried the contested piece to approval.
  • A known-flaky environment check was verified before blaming the change. The typecheck failure was reproduced on a
    clean tree before being reported as environmental.

What didn't work

  • The defect above: the piece-3 pre-build ask was bundled into the piece-2 stop, and "commit and next" was misread
    as a first-class decline of a question the person never engaged with. A piece carrying the plan's one
    expensive-to-walk-back choice was built without the independent read the ask exists to collect.
  • The misread compounded silently. The run recorded "ask declined" in the feedback record as if it were the person's
    decision, so the record itself carried the wrong fact until the person corrected it.

Overall

Pairing plus collaborative TDD fit this work well: the plan's piece boundaries matched the review the person actually
wanted, the observed-failure gate caught a real API misuse, and the one specialist dispatch resolved the session's
hardest question with evidence. The failure was in the ask protocol's timing, not its existence — the skill text says
"ask before the build" but does not say "and not earlier, inside another piece's stop", so the run optimized a turn away
and destroyed the ask's value. The fix is a sequencing rule: one stop, one piece, no forward-looking questions; the ask
for a marked piece opens that piece's turn, after the previous piece is approved, and a reply to a stop never answers a
question about a later piece.


Rating

Dimension Score
Output accuracy 5/5
Evidence discipline 3/5
Finding signal-to-noise 5/5
Output length vs. decision count 4/5
Turn efficiency 3/5

Accuracy 5/5: all behaviors green, reds observed for the right reasons, environment failure correctly attributed.
Evidence discipline 3/5: strong on code claims (validator, clean-tree probe), but the session's key consent fact — that
the person declined the ask — was an inference from an ambiguous reply, treated as evidence and written into the record.
Signal-to-noise 5/5: the single agent dispatch was load-bearing and lean. Length 4/5: stops were proportionate; the
bundled ask made one stop carry more than one decision. Turn efficiency 3/5: the turn saved by bundling the ask cost a
piece built on a misread and the later turns needed to surface and correct it.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions