Skip to content

feat(harness-ops): give converge a planning script that groups by path, and stop sync pointing blocked and worktree rows at converge #7448

Closed
1 of 1 issue completed

Description

@kyle-sexton

What happened

On 2026-10-14 (harness-ops 3.14.0, WSL2), sync printed a Divergences: row ending in "→ run /harness-ops:plugins converge" with 57 actionable divergences. Converge then had 57 divergences covering 932 lagging pins across 108 project paths. 474 of those pins sat in paths not present on the machine, so converge marks them BLOCKED. Most of the rest belonged to linked worktrees, where the right fix is removing the worktree (/source-control:worktree cleanup reaps its records), not converging its pins.

Converge has no script (SKILL.md:50-51: "converge stays model-driven until it gains a script of its own"). Step 2 and Step 3 (context/converge.md:117-125) require a per-pin confirm, by AskUserQuestion per plugin or an enumerated batch. At 932 pins that cannot be done in one session.

Expected

Repro

  1. Have many linked worktrees and some removed ones, each with project-scope records behind user scope.
  2. Run /harness-ops:plugins sync, then /harness-ops:plugins converge.

Evidence

Paths are relative to plugins/harness-ops/skills/plugins/ on main at 8718950e9d.

  • scripts/render-report.jq:184-188: the Divergences: row always ends in "→ run /harness-ops:plugins converge" when the count is non-zero, whatever the rows are.
  • context/converge.md:94-104: absent-path rows are BLOCKED, yet they reach the count the sync row points at.
  • context/converge.md:117-125: per-pin confirmation.
  • Counts from this run: 57 divergences, 932 lagging pins, 108 paths, 474 pins in absent paths.

Proposed fix

  1. Add scripts/converge-plan.sh: read fleet-state.sh output and emit one row per (projectPath, id) with strategy, exact command, and a class: actionable, blocked-absent, blocked-home (fix(harness-ops): converge treats a user home directory (including /mnt/c/Users/* on WSL) as a project path #7447), worktree (path is a linked worktree of a repository found through its .git file), blocked-catalog. Group the output by path.
  2. Converge Step 3 confirms per path: one enumerated batch per path, with approve/skip per row. Keep the rule against a single blanket yes.
  3. Sync's Divergences: row split: shipped in fix(harness-ops): split sync's divergence count into converge-actionable, worktree and blocked pins #8019 (closed as completed).

Scope now: fixes 1-2. Its blocker, #7891 (converge Step 2 and strategy defaults), merged 2026-10-20.

Done when

  • plugins/harness-ops/skills/plugins/scripts/converge-plan.sh reads fleet-state.sh output and emits one row per (projectPath, id): strategy, exact command, and class (actionable, blocked-absent, blocked-home, worktree, blocked-catalog), grouped by path. A worktree row is a path whose .git is a file. Strategies match the defaults fix(harness-ops): converge defaults to update for pins mirroring committed enables #7891 set (context/converge.md: update for pins that mirror committed enables). Check: the PR's CI runs a new converge-plan.test.sh with one fixture row per class, and it passes.
  • context/converge.md Step 3 confirms one batch per path, with approve or skip per row, and still refuses a single blanket yes. Check: the reviewer reads Step 3; the PR's CI runs the markdown lint and it passes.
  • SKILL.md:50-51 no longer says converge stays model-driven. Check: the PR's CI runs the skill-quality check on the changed SKILL.md and it passes.
  • A .changes/harness-ops/ fragment exists. Check: the PR's CI runs scripts/check-changelog-fragments.sh --check and it passes.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Hnyd9hEzF6NuSFzC9rWj92

Activity

  1. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 14, 2026
  2. github-actions commented on Oct 14, 2026

    @github-actions
    Contributor

    Thanks for the report. Automated triage handed this issue to a maintainer.

    Proposed work class: work-class: scoped
    Basis: automated intake triage; a maintainer confirms or changes it.

    Automated triage. A maintainer reviews it.

  3. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Oct 14, 2026
  4. kyle-sexton commented on Oct 18, 2026

    @kyle-sexton
    MemberAuthor

    This was generated by AI during backlog shaping.

    This issue is split into 2 pieces, each sized for one lane PR. The sync pointer is still unconditional (origin/main render-report.jq:184-188 ends any non-zero count with 'run converge'), and fleet-state.sh keeps absent-path rows in divergences[] by rule (fleet-state.sh:86-91: projectPathPresent is advisory and never filters), so the counts can be split without changing that rule. The converge planning script and per-path confirm edit converge.md, which open PR #7891 (#7446) is changing in Step 2, and SKILL.md's 'converge stays model-driven until it gains a script'. Two children.

    Filed pieces are sub-issues of this one, and the paced queue admits them to the lane. Unfiled pieces wait on the blocker shown. The owner approved this split in an attended backlog-shaping session on 2026-10-18.

  5. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Oct 22, 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

    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Fields

    No fields configured for Feature.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions