Skip to content

feat(checks): route the watch wrapper to the Go command #977

Description

@tbhb-agent

Problem

Child of #793, blocked by #976. Delivers AC12 of the parent, which this issue numbers AC1, and owns the offline capability-probe test (TestWatchCommandProbe, with TestWatchProbeOffline in the wrapper pull request): the skill's watcher entry becomes a thin wrapper that probes for the Go command from the sibling child and falls back to the unchanged existing shell script.

Watching stays shell behavior until a wrapper selects the Go command (packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53). Consumers on older binaries must keep working through the N-2 window.

Acceptance criteria

  1. AC1: Non-functional: the skill's watcher entry ends this change as a new thin shell wrapper that probes the Go subcommand, forwards unchanged arguments, output and status when supported, and falls back to the existing watch-checks.sh, left byte-for-byte unchanged, when the binary or subcommand is unavailable throughout the N-2 window; a failed supported invocation never triggers fallback.

Scope and non-goals

In scope: the wrapper, the capability probe, the skill manifest's watcher invocation, the generated skill copies, and the consumer steps in docs/agent-skills-migration.md.

Non-goals:

Approach

Add a new wrapper script written with shell builtins only (parameter expansion rather than external commands such as dirname, so mise run lint-shell-allowlist passes). It probes the installed binary for the watcher's usage text, forwards arguments, output and status unchanged when supported, and runs the existing watch-checks.sh otherwise. Leave watch-checks.sh byte-for-byte untouched as the frozen fallback, so the shell allowlist gate does not check it, and point the skill manifest's watcher invocation at the wrapper. Consumers that call watch-checks.sh by name keep the old shell behavior through the N-2 window. A failed supported invocation never falls back. Run mise run generate-skills, then mise run skill-tokens, then apm install, and verify the deployed entry points, token metadata and lock changes independently.

Dependencies

Size

S

Verify plan

  • Failing test first: add a wrapper regression that runs with a supporting binary available and fails against the original shell entry point because it never routes to the command, then passes once routing exists. Keep the unsupported-capability and operational-failure cases here. Command semantics are verified by feat(checks): add the Go pull request watch command #976 and are cited rather than repeated. Use scripted local responses; no live PR watching is needed.
  • AC1: Exercise a supporting binary, no binary, an N-2 binary lacking the subcommand, and a supporting command returning 1, 2 or 76. Assert probe has no reads or side effects, fallback runs only for unsupported capability, forwards bytes/arguments/statuses, and never replaces an operational failure. Inspect the wrapper for forwarding/probe logic only. Run git diff --exit-code origin/main -- packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh and confirm the existing script is byte-identical to origin/main.
  • AC1: Run mise run lint-shell-allowlist and confirm it passes with the wrapper as the only new or changed shell file.
  • Run mise run check, mise run cover-go-check and mise run cover-py-check, recording results on the reviewed head. The coverage floors are not part of check.
  • Run mise run generate-skills, mise run skill-tokens, apm install and mise run check-generated-skills. Compare packaged and deployed entry points, token metadata and lock changes independently.
  • D1–D10: Verify every AC on the merged head and cite its evidence in the PR; obtain independent exact-head approval and passing required checks; complete gitleaks, the repository leak scan and the review of every content post; sign commits and squash; update docs; include Assisted-by trailers and the provenance:agent-assisted label; check actual PR size limits; file follow-ups with Problem and numbered ACs, list them in PR Related and link deferred code to them; close the issue with a closing reference, move it to Done and record the merge commit in the final Status comment.

Risks

A fallback after an operational Go failure could repeat reads and conceal the actual outcome. Older binaries can answer help for an unknown subcommand with success, so a wrong probe could bypass the fallback.

The shell allowlist gate is not loosened or baselined: the wrapper uses builtins only and the unchanged script is not rechecked.

Undo: revert this change to restore shell watching. Do not edit the frozen shell to repair unrelated behavior.

Operator authority

None

Activity

  1. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: NOT READY — wrapper verification must start from the merged command prerequisite

    Checked

    Read #977, parent Epic #793, sibling #976, and PRs #961/#962 (bodies and changed-file lists); inspected #962's wrapper and shell-test patches. Accepted the supplied mechanical-gate pass without rerunning it.

    The AC split is complete and disjoint: #976 AC1–AC11 match parent AC1–AC11; #977 AC1 matches parent AC12. Wrapper shape and frozen fallback are explicit parent outcomes, so their appearance in AC1 is appropriate. AC1 is testable and traced to supporting/absent/older binaries, argument/output/status forwarding, and a side-effect-free probe. N-2 compatibility, failure handling, generated artifacts and consumer docs are covered. S fits one wrapper PR; risks, revert and Operator authority: None fit the scope. Existing behavior is at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53; #962's proposed wrapper starts at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:3 (PR head).

    Gaps

    1. Replace the first Verify-plan bullet. It requires command-level regressions to fail because the Go watcher is absent, but feat(checks): add the Go pull request watch command #976 must already have merged and command behavior changes are excluded here. Specify a wrapper regression that fails with the original shell entry point despite a supporting binary being available, then passes after routing is added. Keep unsupported-capability and operational-failure tests here; cite feat(checks): add the Go pull request watch command #976 for command semantics. This makes verification executable on the required base.
    2. Record the actual relationships and name feat(checks): add the Go pull request watch command #976 explicitly in Dependencies. Read-only GraphQL shows feat(checks): route the watch wrapper to the Go command #977 has no parent and no native blocked-by links. Set parent feat(checks): move pull request watching into Go #793 and native blocked-by feat(checks): add the Go pull request watch command #976; prose naming “the sibling command child” does not establish the dependency. Ship the Go binaries as release assets installed through mise's github backend #333/feat(distribution): migrate consumer tool pins to release assets #544 remain retirement conditions, not landing blockers.
    3. Add the repository DoD commands explicitly: mise run check, mise run cover-go-check and mise run cover-py-check, recording results on the reviewed head. The generic D1–D10 bullet does not identify these additional repository gates; the coverage floors are not run by check. The existing generation/token/install/check-generated sequence covers the other repository items.

    Split

    No further split needed. Keep #977 as the S wrapper slice after #976. Acceptance ownership does not overlap; shared parity checks may validate integration without moving command acceptance into this child. Map PR #962's older parent-AC verification labels to child AC1 when attaching it to #977.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation, not that implementation or merge evidence has passed. D3 assumes gates remain intact; any gate loosening needs exact-head owner approval.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.

    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.

    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.

    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.

    • D5 The author signed each commit, the squash included.

    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.

    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.

    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.

    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.

    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.

    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.

    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.

    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watch or mechanical request check were run.

    Round: 1 of 3

  2. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: NOT READY — native parent and blocker links are still missing

    Checked

    Read the revised #977 body, its round 1 Refinement comment, parent Epic #793, sibling #976, and PRs #961/#962 (bodies and changed-file lists). Also inspected #962's proposed wrapper and wrapper-test patches. Accepted the supplied mechanical-gate pass without rerunning it.

    Round 1 gap 1 is closed: the failing-first regression now starts with a supporting binary and the original shell entry point, then passes after wrapper routing. Unsupported-capability and operational-failure cases stay here; command semantics are cited to #976. This is executable after the command prerequisite merges.

    Round 1 gap 3 is closed: the Verify plan explicitly names mise run check, mise run cover-go-check and mise run cover-py-check, with results recorded on the reviewed head. It retains the ordered generation/token/install sequence and independent checks of deployed entry points, token metadata and lock changes.

    The acceptance split remains complete and disjoint: #976 owns parent AC1–AC11; #977 AC1 owns parent AC12 verbatim. Wrapper shape and the frozen fallback are required parent outcomes, so their inclusion in the child AC is appropriate. AC1 is testable and explicitly traced to supporting/absent/older binaries, unchanged forwarding, operational statuses 1/2/76, a side-effect-free probe and frozen-source comparison. N-2 compatibility, generated artifacts and consumer migration documentation are covered. S fits one wrapper PR. The risks, revert and Operator authority: None fit the scope. The current shell entry point starts repository work at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53; #962's proposed probe starts at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:3 (PR head).

    Gaps

    1. Round 1 gap 2 remains open in live GitHub metadata. The revised Dependencies section names feat(checks): add the Go pull request watch command #976 and claims that the issue carries the native blocked-by link, but a read-only GraphQL query of feat(checks): route the watch wrapper to the Go command #977 returned parent: null and blockedBy.nodes: []. Set the native parent to feat(checks): move pull request watching into Go #793 and native blocked-by to feat(checks): add the Go pull request watch command #976, then verify both relationships. Keep the prose consistent with those actual links. Ship the Go binaries as release assets installed through mise's github backend #333/feat(distribution): migrate consumer tool pins to release assets #544 remain conditions for future fallback retirement, not prerequisites for landing this wrapper.

    Split

    No further split needed. Keep #977 as the S wrapper slice after #976. When attaching PR #962, map its older parent-AC12 evidence to child AC1 and ensure command acceptance evidence needed to close #976 lands in #961. Shared parity checks can validate integration without changing acceptance ownership.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation; they do not attest that implementation or merge evidence has passed. D3 assumes gates remain intact; any gate loosening requires exact-head owner approval.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.
    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.
    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.
    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.
    • D5 The author signed each commit, the squash included.
    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.
    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.
    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.
    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.
    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.
    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.
    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.
    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watch or mechanical request check were run.

    Round: 2 of 3

  3. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: READY — native relationships verified; wrapper slice is ready after #976

    Checked

    Read the revised #977 body, the round 2 Refinement comment, parent Epic #793, sibling #976, and PRs #961/#962 (bodies and changed-file lists). Inspected #962's proposed wrapper, wrapper-test and migration-document patches, the current shell entry point and the N-2 policy. Accepted the supplied mechanical-gate pass without rerunning it.

    Round 2's remaining gap is CLOSED. Read-only GraphQL returned parent.number = 793, issueDependenciesSummary = {blockedBy: 1, totalBlockedBy: 1, blocking: 0, totalBlocking: 0}, and blockedBy.nodes = [{number: 976}]. The Dependencies prose now agrees with the native relationships. #976 must merge first; #333/#544 remain conditions for future fallback retirement rather than blockers for landing this wrapper.

    The previously closed gaps remain closed in the revised body: the failing-first regression starts with a supporting binary and the original shell entry point, then passes after routing. Unsupported-capability and operational-failure checks remain here, while command semantics are cited to #976. The Verify plan explicitly names mise run check, mise run cover-go-check and mise run cover-py-check, recording results on the reviewed head, and retains the ordered generation/token/install sequence plus independent deployed-entry-point, token-metadata and lock checks.

    The children cover the parent without acceptance overlap: #976 AC1–AC11 match parent AC1–AC11; #977 AC1 matches parent AC12. The thin wrapper and frozen fallback are explicit parent outcomes, so their wording in AC1 is appropriate. AC1 is testable and traced to supporting, absent and older binaries; unchanged argument/output/status forwarding; operational statuses 1/2/76 without fallback; a probe without reads or side effects; and comparison with the pinned shell. The baseline begins repository work at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53; #962's proposed probe starts at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:3 (PR head). N-2 compatibility follows docs/compatibility.md:3 and has explicit verification. Consumer migration docs and generated artifacts are covered. S fits one wrapper PR; risks, revert and Operator authority: None fit this scope.

    Gaps

    None. All round 2 gaps are closed. READY describes refinement readiness; implementation remains blocked until #976 merges.

    Split

    No further split needed. Keep #977 as the S wrapper slice after #976. When attaching PR #962, map its older parent-AC12 verification labels to child AC1. Evidence needed to close command acceptance, including repository-state preservation and command-versus-shell parity, must land with #976/#961 as that child's revised Approach requires. Existing PR descriptions are implementation evidence to update, not additional acceptance ownership for this issue.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation; they do not attest that implementation or merge evidence has passed. D3 assumes gates remain intact; any gate loosening requires exact-head owner approval.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.
    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.
    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.
    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.
    • D5 The author signed each commit, the squash included.
    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.
    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.
    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.
    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.
    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.
    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.
    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.
    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watch or mechanical request check were run.

    Round: 3 of 3

  4. added
    refinement:readyPassed the Definition of Ready; may be picked up
    refinement:activeA refinement round is open; not ready for implementation
    and removed
    refinement:activeA refinement round is open; not ready for implementation
    refinement:readyPassed the Definition of Ready; may be picked up
    on Oct 31, 2026
  5. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: NOT READY — wrapper scope is sound; the epic still omits the new parity child

    Checked

    Read the current #977 body and previous READY Refinement comment, parent #793, siblings #976/#978, and PRs #961/#962, including the probe, wrapper and parity-test patches. Accepted the supplied mechanical-gate pass without rerunning it. Read-only GraphQL confirms #977 and #978 both have parent #793 and native blocked-by #976; the epic has all three native children.

    The stable acceptance IDs are preserved: #976 AC1–AC11 still match parent AC1–AC11, and #977 AC1 still matches parent AC12. No parent outcome was dropped or assigned to both implementation children. #978 adds comparative evidence rather than taking command or wrapper behavior away from either child.

    The changed #977 scope correctly excludes command-versus-shell parity and owns the offline capability-probe check. Its AC1 verification requires a probe without reads or side effects, supporting/absent/N-2 binaries, unchanged arguments/output/status, operational statuses 1/2/76 without fallback, and a pinned fallback comparison. The offline probe in PR #962 is at internal/agentrepo/watch_command_internal_test.go:137 (PR head); its empty PATH and non-repository directory exercise the intended offline boundary. PR #961 currently also contains the lighter TestWatchCommandProbe at internal/agentrepo/watch_internal_test.go:17 (PR head). Their final allocation must follow the revised child scopes.

    AC1 is testable and traced in the Verify plan. Wrapper shape and frozen fallback are explicit parent outcomes, so that wording is appropriate here. The failing-first routing regression is executable after #976 merges. N-2 compatibility follows docs/compatibility.md:3; the baseline starts repository work at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53. Size S fits one wrapper PR. Required gates, coverage floors, generation/token/install ordering, deployed artifacts, migration docs, risks, revert and Operator authority: None remain covered.

    Gaps

    1. Synchronize the epic's delivery and closure plan with the new scope. feat(checks): move pull request watching into Go #793 still says “delivered by two child issues,” lists only feat(checks): add the Go pull request watch command #976/feat(checks): route the watch wrapper to the Go command #977 in Approach and Dependencies, and closes when “both children” merge. Its native child list now includes test(checks): prove watch command parity against the pinned shell #978, whose parity proof was explicitly moved out of the other two children. Update the epic to name all three children and require test(checks): prove watch command parity against the pinned shell #978's comparative evidence for epic completion, retaining every existing AC ID and the feat(checks): add the Go pull request watch command #976 AC1–AC11 / feat(checks): route the watch wrapper to the Go command #977 AC1-to-parent-AC12 mapping. Otherwise the written closure rule can declare the epic complete while the newly separated parity proof remains outstanding. This does not require making test(checks): prove watch command parity against the pinned shell #978 a blocker of feat(checks): route the watch wrapper to the Go command #977; their current independent relationship can remain explicit.

    Split

    No further split of #977 is needed. Keep the command, wrapper/offline probe, and comparative oracle in #976, #977 and #978 respectively. The previous READY comment's instruction to land parity in #976/#961 is superseded by this scope change.

    When revising the PRs, map #962's parent AC12 evidence to #977 AC1, place command acceptance evidence in #961, and move the comparative parity case to #978. #978 already calls for retiring the Bats parity case when its replacement lands; ensure the final PRs implement that handoff. Existing PR descriptions still reflect the earlier split and are not proof that the new work is complete.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation, not that implementation, checks or merge evidence has passed. D3 retains exact-head owner approval for any loosened gate.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.
    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.
    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.
    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.
    • D5 The author signed each commit, the squash included.
    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.
    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.
    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.
    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.
    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.
    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.
    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.
    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watching or mechanical request check were run.

    Round: 1 of 3

  6. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: READY — epic now includes all three children and requires the parity proof

    Checked

    Read the current #977 body, previous READY Refinement comment and re-refinement round 1 comment, parent Epic #793, siblings #976/#978, and PRs #961/#962 (bodies, changed-file lists and relevant probe, wrapper and test patches). Accepted the supplied mechanical-gate pass without rerunning it.

    Round 1's gap is closed. The epic now names all three children in Outcome and Children, assigns parent AC1–AC11 to #976 and parent AC12 to #977 AC1, and explicitly requires #978 AC1/AC2 parity evidence plus all three merges for closure. Parent AC1–AC12 and both implementation children's AC IDs remain unchanged. The native child list contains #976, #977 and #978. Read-only GraphQL confirms #977 and #978 each have parent #793 and native blocked-by #976.

    The revised allocation is complete and disjoint. #976 owns command behavior and direct regression evidence, including repository-state preservation. #977 owns wrapper selection, forwarding, frozen fallback and the offline capability probe. #978 owns comparing the command with the pinned shell on identical scripted responses, including stdout, stderr, exit status and check-read counts. Its offline/state-preservation checks constrain the comparison itself; they do not duplicate command acceptance. Its baseline fixture does not depend on the wrapper fallback's location, so #978 and #977 can independently follow #976. No parent outcome or comparative closing condition is left uncovered.

    The previous READY comment's instruction to put parity into #976/#961 is superseded by this scope change. #977 explicitly names #978 in its non-goals and owns the offline probe test. PR #962's TestWatchProbeOffline uses an empty executable search path and a non-repository directory, asserting help succeeds without stderr at internal/agentrepo/watch_command_internal_test.go:137 (PR head). PR #961 still contains the lighter TestWatchCommandProbe at internal/agentrepo/watch_internal_test.go:17 (PR head); final test allocation must follow the revised scope rather than retain duplicate probe ownership.

    #977 AC1 is testable and traced to supporting, absent and N-2 binaries; unchanged argument/output/status forwarding; statuses 1/2/76 without fallback; a probe without reads or side effects; and pinned-source fallback comparison. Wrapper shape and frozen fallback are parent outcomes, so that wording is appropriate. The failing-first routing regression runs on the required command-enabled base. The baseline begins repository work at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53; #962's proposed probe starts at packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:3 (PR head). N-2 verification matches docs/compatibility.md:3.

    Size S fits one wrapper PR. The Verify plan covers required checks, both coverage floors, ordered generation/token/install steps, independent generated/deployed artifact checks and migration documentation. Risks identify operational-failure fallback and misleading older-binary help; undo restores shell watching. Operator authority: None is appropriate. #333/#544 remain retirement conditions, not landing blockers.

    Gaps

    None. The epic's former two-child closure gap is closed, with no new acceptance gap or overlap. READY is refinement readiness; #977 still waits for #976 to merge.

    Split

    No further split needed. Keep command/direct evidence in #976/#961, wrapper/offline probe in #977/#962, and comparative parity in #978. When updating the existing PRs, map #962's parent AC12 labels to #977 AC1, move command acceptance evidence into #961, and transfer parity to #978. Retire the Bats parity case when its replacement lands, as #978 already requires. Existing PR descriptions and patches still reflect the earlier split; align them before closure. They do not establish that the revised work is complete.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation; they do not certify implementation, test or merge completion. D3 retains exact-head owner approval for any loosened gate.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.
    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.
    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.
    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.
    • D5 The author signed each commit, the squash included.
    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.
    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.
    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.
    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.
    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.
    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.
    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.
    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watching or mechanical request check were run.

    Round: 2 of 3

  7. added
    refinement:readyPassed the Definition of Ready; may be picked up
    and removed
    refinement:activeA refinement round is open; not ready for implementation
    on Oct 31, 2026
  8. added
    refinement:activeA refinement round is open; not ready for implementation
    and removed
    refinement:readyPassed the Definition of Ready; may be picked up
    on Oct 31, 2026
  9. tbhb-dev-reviews commented on Oct 31, 2026

    @tbhb-dev-reviews

    Refinement: READY — the new wrapper preserves the frozen watcher and leaves the shell gate intact

    Checked

    Reviewed the amended #977 body and all five earlier Refinement comments; parent Epic #793 and shell-migration Epic #588; siblings #976/#978/#994/#996; distribution prerequisites #333/#544; native relationships; and PRs #824/#961/#962/#1000. Accepted the supplied mechanical-gate pass without rerunning it.

    Computed round: 1. There are zero earlier Refinement comments since the redesign at 11:51Z; all five predate it. Thus 1 + 0 = 1, agreeing with the new-lineage note and disagreeing with the prompt's isolated “2”.

    Verified origin/main against the live remote: bfa8937. The cited watcher path exists, and line 53 still begins repository discovery (packages/agents/source/skills/watch-pr/shared/scripts/watch-checks.sh:53). The Go command is now registered (internal/agentrepo/command.go:84), and its help branch precedes repository and GitHub access (internal/agentrepo/watch.go:46, internal/agentrepo/watch.go:81). #961 and #1000 merged the command and repository-preservation evidence; #976 is CLOSED. Native metadata confirms parent #793 and the historical blocked-by link to #976, with zero open blockers.

    Earlier gaps remain resolved: the failing-first regression starts with a supporting binary and fails because the original entry point does not route; command semantics stay with #976; native parent/blocker links match the prose; both coverage-floor commands and mise run check are explicit; and #793 names command, wrapper and parity delivery with all three required for closure. #978 retains comparative evidence, including its disclosed empty-after-registration divergence. #996 tracks later fallback retirement and is blocked by #977/#978/#333/#544; it is not a prerequisite for this wrapper.

    AC1 states the required consumer boundary and compatibility outcome. Its wrapper/frozen-fallback shape is itself parent AC12's outcome, so it is appropriate in the criterion. The Verify plan traces AC1 to supporting, absent and N-2 binaries; usage-based capability detection; unchanged arguments, stdout, stderr and status; supported failures 1/2/76 without fallback; an offline probe; byte identity of the existing script; and inspection of the routing boundary. This covers the touched non-functional compatibility and failure behavior (docs/compatibility.md:3). Generated outputs, deployment/token/lock checks, consumer steps and repository gates are explicit. S fits one PR below 800 code lines after excluding command and parity work. Risks and revert are concrete; Operator authority: None fits the change.

    The redesign addresses the shell-freeze problem: add only a thin probe/forwarding wrapper, keep the original shell file untouched, and change the skill invocation. The gate checks changed maintained shell files and excludes generated copies (cmd/shell-allowlist/changed.go:14, cmd/shell-allowlist/changed.go:42); shell builtins and agentrepo are already allowed (.devtools/shell-allowlist.toml:3, .devtools/shell-allowlist.toml:72). Parameter expansion avoids adding dirname. Passing mise run lint-shell-allowlist is required; no allowlist edit, baseline or suppression is authorized. No new watcher algorithm, guard or speculative layer is needed.

    Checked for delivery overlap. Open PRs #824/#962 contain the older design, which replaces watch-checks.sh and adds a legacy copy. That does not satisfy the amended requirement to leave watch-checks.sh byte-identical and add a separate wrapper. Their command content is already delivered by #961/#1000. Update the existing wrapper PR #962 to this scope rather than open a duplicate; keep its offline probe, remove already-landed command work, and leave comparative parity to #978. Neither an open nor a merged PR currently completes the amended AC1. The current skill call sites that must select the new entry are packages/agents/source/skills/watch-pr/SKILL.codex.md:18 and packages/agents/source/skills/watch-pr/SKILL.claude.md:32.

    Gaps

    None in the amended wrapper scope or verification contract. READY is refinement readiness, not an implementation or gate-pass attestation. #976's prerequisite has now landed. The existing PR still needs the redesign and required evidence before closure.

    Split

    No further split. Keep wrapper selection, forwarding, frozen fallback and offline probe in #977; command behavior/evidence in the already-landed command changes; comparative parity in #978; and eventual fallback/oracle deletion in #996. Retain child AC1's mapping to parent AC12 when updating #962.

    Definition of done

    Ticks mean the ACs and Verify plan cover the obligation; they do not certify that implementation, checks or merge evidence have passed. D3 retains the base owner-approval rule; this issue specifically requires an unchanged shell gate.

    • D1 The author verified each AC on the merged head, and the Verification section of the pull request cites each AC ID with its evidence: the command and its result, or a link.
    • D2 An independent reviewer approved the exact merged head, and the author resolved each finding or filed it as a follow-up.
    • D3 The required checks pass on that head, and any loosened gate has the owner's approval of that exact head.
    • D4 The leak scans come back clean: gitleaks, devtools' check-leaks.sh with the repository's private-strings list, and the leak review of each post.
    • D5 The author signed each commit, the squash included.
    • D6 The docs match the change (README, docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why.
    • D7 The commits and the squash have Assisted-by trailers, and the pull request has the provenance:agent-assisted label.
    • D8 The pull request stays within the size limits, or the owner approved its exact head over the hard limit.
    • D9 The author files follow-ups and deferred findings as issues with at least a Problem and numbered AC and lists them under the Related section of the pull request. Any work left in the code links its issue.
    • D10 The merge closes the issue through a closing reference and the board shows Done. The final Status: comment names the merge commit.
    • devtools-1 mise run check is green, and so are the coverage floors mise run cover-go-check and mise run cover-py-check, which check doesn't run.
    • devtools-2 A change to skill sources under packages/agents/source/ commits what mise run generate-skills, then mise run skill-tokens, then apm install rewrite, in that order, and check-generated-skills (part of lint) passes.
    • devtools-3 A consumer-visible change (the vendored payload, a skill, a reusable workflow, a task or a pin) has its consumer steps in docs/agent-skills-migration.md or the adoption docs, or the PR's Verification says "No consumer impact" and why.

    No tests, builds, full suites, live watch, generation/install tasks or mechanical request check were run. No repository files were changed.

    Round: 1 of 3

  10. added
    refinement:readyPassed the Definition of Ready; may be picked up
    and removed
    refinement:activeA refinement round is open; not ready for implementation
    on Oct 31, 2026
  11. moved this from Backlog to In progress in devtoolson Oct 31, 2026
  12. moved this from In progress to Done in devtoolson Oct 31, 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

    refinement:readyPassed the Definition of Ready; may be picked up

    Fields

    Priority

    None yet

    Work type

    None yet

    Projects

    • Status
      Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions