Skip to content

duplicate_holder_pids names only one of a wrapper's two-or-more verified children, and --retire can report clean over a live one #86

Closed

Description

@brettheap

duplicate_holder_pids (lanes-edit.sh, issue #39's own discovery function)
names at most ONE verified child per bg-pty-host parent. When a wrapper has
two or more direct children whose argv all independently verify the same
transcript (--fork-session --resume …/<uuid>.jsonl), the scan loop breaks
on the first verified match:

case "$dhp_c_resume" in */"$dhp_id_lc.jsonl") dhp_verified="$dhp_c"; break ;; esac

and the per-parent output record (<parent><US><child><US><id>) has exactly
one child slot, so the second verified child is silently excluded from the
report lane-end --retire acts on. --retire then terminates the parent and
the one named child, reports success (RETIRED lane <lane>'s duplicate holder of transcript <uuid>), and the second child — now orphaned — keeps running
and keeps holding the transcript: the exact double-holder shape issue #39
exists to end, just with one extra live process surviving a reported-clean
retirement.

Raised by Copilot's review of PR #61 at commit 11bf0f0 (2026-09-15T16:00Z),
lanes-edit.sh:4919. Not fixed there: the honest fix is not a one-line gate
like this PR's other three rounds-13 findings — duplicate_holder_pids'
output format (one child per parent record) has no room for a second
verified child, so naming ALL of them means changing that format and every
reader of it (lane-end --retire's own parsing, whatever else consumes
duplicate-holder's listing). The narrower alternative Copilot itself
offered — fail closed on this shape instead of picking one — doesn't fully
close the gap either: a parent whose child slot is left empty because two
verified matches were found looks IDENTICAL to a parent with no matching
child at all, so lane-end --retire would still report success while the
second live child survives, just without ever naming it. A real fix wants
either the output format widened to a child LIST, or an explicit
ambiguous-children signal lane-end --retire can refuse on by name — a
design decision, not a rushed edit at the tail of an already-large PR.

Scope for whoever picks this up: duplicate_holder_pids in lanes-edit.sh
(discovery), and lane-end's --retire dispatch (consumption) — both would
need to agree on however multiple verified children are represented. A
regression case wants a bg-pty-host wrapper with two children, both faked to
independently verify the same transcript, proving neither survives a
reported-clean --retire (or that the retirement explicitly refuses rather
than reporting clean over a live one).

Activity

  1. brettheap commented on Sep 15, 2026

    @brettheap
    ContributorAuthor

    CLAIMED — lane openRepoTools-3, session 4135b2c9-34a6-47e3-a156-5adebb632fae@Eagle, 2026-09-15T16:57:01Z, for #86

    Logged in lanes/log/openRepoTools-3.md at 2ced51ea7f1f1b058e1c8128d7bbad690c9948fd.

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoTools#86:
       none
    2. `gh pr list --repo opensoft/openRepoTools --state all --search "#86"`, kept where the row or its body names `#86`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoTools` branches naming `86` as a whole token:
       none
    
  2. added a commit that references this issue on Sep 15, 2026
  3. brettheap commented on Oct 11, 2026

    @brettheap
    ContributorAuthor

    TAKEOVERopenRepoTools-3 — lane openRepoTools-5, session 0d83dca2-c18c-4bb0-99ce-896e6cafea02@Eagle, 2026-10-11T16:57:55Z, for #86

    Logged in lanes/log/openRepoTools-5.md at a8a478f353e45bb4749b5850f70f10f1ab230816 (takeover of the stale claim held by lane openRepoTools-3).

    The three reads (lane-collision-protocol Rule 1):

    1. existing `CLAIMED —` comments on opensoft/openRepoTools#86:
    6:CLAIMED — lane openRepoTools-3, session 4135b2c9-34a6-47e3-a156-5adebb632fae@Eagle, 2026-09-15T16:57:01Z, for opensoft/openRepoTools#86
    13:1. existing `CLAIMED —` comments on opensoft/openRepoTools#86:
    2. `gh pr list --repo opensoft/openRepoTools --state all --search "#86"`, kept where the row or its body names `#86`:
       none
    3. `git ls-remote --heads git@github.com:opensoft/openRepoTools` branches naming `86` as a whole token:
       none
    
  4. added a commit that references this issue on Oct 18, 2026
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