Skip to content

fix(han-core): give the pre-build ask its own turn - #213

Merged
mxriverlynn merged 3 commits into
v5.5.0-betafrom
gh-201-pairing-tdd
Sep 11, 2026
Merged

fix(han-core): give the pre-build ask its own turn#213
mxriverlynn merged 3 commits into
v5.5.0-betafrom
gh-201-pairing-tdd

Conversation

@mxriverlynn

Copy link
Copy Markdown
Collaborator

Closes #201.

A pairing session tucked the piece-3 pre-build ask under piece 2's stop, read "commit and next" as declining it, built piece 3 without the person's read, and wrote "ask declined" into the feedback record as the person's decision. The skill text allowed it: the rule said the ask comes before the build and pairing Step 5 said "ask first", and nothing forbade folding the ask into the previous stop.

The ask is a turn of its own, and a stop never carries it

collaborative-stop-rule.md now says a stop covers what just closed and asks nothing about a later piece. The ask opens the marked piece's turn after the person has replied to the previous stop, or to the plan when the marked piece is the first, and it is the whole turn. A reply to a stop or the plan answers that alone and never counts as declining an ask the person has not answered. A question about the ask holds it open.

The line "never require an answer before building" is gone. Read literally it licensed the build the issue reports. The build now waits for a reply to the ask, and a decline is a full reply: "I don't know" still advances the piece.

A bundled ask is an unanswered ask

When an earlier turn put the ask under a stop or the plan and the reply spoke only to that, the ask was never posed on its own, so the run presents it now, on its own, before building. If the piece was already built when that comes to light, the run says it put the ask under an earlier turn so it went unanswered, and continues from the stop in hand. It does not ask after the fact, because an ask after the build collects the cost and none of the benefit.

The record holds the person's words

The rule's "Recording what the person says" section pins the entry's form: the person's words, the stop or ask they answered, and any reading the run adds labeled as the run's, never written as what the person decided. One worked example pins the shape. An ask with no entry is an ask with no answer. This goes one step past the issue's suggested fix; the issue names the wrong record entry as a second effect, and the long-form doc already promised the record holds "which piece prompted it" with nothing delivering it.

What is in this PR

Two commits. The first adds the change plan, its decision log, the current-state findings from a structural and behavioral discovery round, and the scope boundary under docs/plans/gh-201-pre-build-ask-timing/. The second applies the plan: five paragraphs in the canonical rule with its two vendored copies kept byte-identical, three edits to pairing/SKILL.md (Step 5 item 1 rewritten with what happens to the ask's reply, one sentence on item 3, Step 6's opening sentence), and five edits to han-core/docs/skills/pairing.md so the doc promises exactly what the rule delivers, including one more turn per marked piece in its cost line.

Every sentence the three files must agree on was pinned in the plan before it was written, and copied rather than paraphrased. md5 -q prints one hash for all three rule copies. npm run lint and npm test pass. The five backing skills are untouched: the one new clause they can act on sits in "What a stop presents", which they already read, and none of them poses an ask.

Deliberately not in this PR

Eight items sit under Deferred (YAGNI) in the plan with reopening triggers, among them a three-state ask marker in the record, ask behavior inside a "show me the next three" batch, a piece anchor on the ask turn, and an acknowledgment on a re-presented ask. None is implicated by the one incident on record.

No ADR links the rule to the pairing plan's decision D7, which named the sentence this PR removes; the plan's decision D-3 records why it went. No version bump and no changelog edit; both belong to /han-release.

Issue #201 reports a pairing session that tucked the piece-3 pre-build
ask under piece 2's stop, read "commit and next" as declining it, built
piece 3 without the person's read, and wrote "ask declined" into the
feedback record as the person's decision. The skill text permits it: the
rule says the ask comes before the build and pairing Step 5 says "ask
first", and neither forbids folding the ask into the previous stop.

`docs/plans/gh-201-pre-build-ask-timing/` holds the change plan, its
decision log, the current-state findings from a structural and
behavioral discovery round, and the scope boundary. The plan re-scopes
three sections of `collaborative-stop-rule.md` (and its two byte-identical
copies), pairing Steps 5 and 6, and the pairing long-form doc, and pins
every sentence the three files must agree on. Two behavior changes were
put to the operator and accepted: the ask is a turn of its own that a
stop never carries, and the record holds the person's words with the
run's reading labeled as the run's. A review round with the junior
developer, UX designer, and risk analyst extended the first change to a
marked first piece, gave the ask's reply a recorded path, and named the
run as the cause in the after-build message. Eight items sit under
Deferred (YAGNI) with their reopening triggers.
Closes #201.

The collaborative stop rule said the pre-build ask comes before the
build and pairing Step 5 said "ask first", and neither forbade folding
the ask into the tail of the previous piece's stop. A run did exactly
that, read "commit and next" as declining the ask it had tucked under
piece 2's stop, built piece 3 without the person's read, and wrote "ask
declined" into the feedback record as the person's decision.

`collaborative-stop-rule.md` now says a stop covers what just closed
and asks nothing about a later piece; the ask is a turn of its own,
opening the marked piece's turn after the person has replied to the
previous stop or to the plan; a reply to a stop or the plan answers
that alone and never counts as declining an ask the person has not
answered; a question about the ask holds it open; a bundled ask was
never posed and is presented on its own before building, and one found
after the build is named with the run as the cause rather than
re-asked. "Never require an answer before building" is gone, because
the build now waits for a reply to the ask, though a decline is a full
reply. The record's entry form is pinned: the person's words, the stop
or ask they answered, and any reading the run adds labeled as the run's,
with one worked example. The two vendored copies in `han-coding` and
`han-planning` are byte-identical to the canonical file.

Pairing Step 5 item 1 carries the same rule in the loop's terms and
names what happens to the reply: recorded against the ask, then the
build, with no pass through Step 6. Item 3 says naming the next concern
is a report, never a question. Step 6 writes the response in the
person's words against the stop or ask it answers. The long-form doc
promises each of these to the person in the same terms and adds one
turn per marked piece to its cost line.

The change plan, decision log, and findings behind every sentence are
under `docs/plans/gh-201-pre-build-ask-timing/`.
@mxriverlynn
mxriverlynn marked this pull request as ready for review September 11, 2026 16:15
@mxriverlynn
mxriverlynn merged commit ee33161 into v5.5.0-beta Sep 11, 2026
2 checks passed
@mxriverlynn
mxriverlynn deleted the gh-201-pairing-tdd branch September 11, 2026 16:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant