Skip to content

Add issue duplicate checker workflow#987

Open
enyst wants to merge 5 commits into
mainfrom
add-issue-duplicate-checker-workflow
Open

Add issue duplicate checker workflow#987
enyst wants to merge 5 commits into
mainfrom
add-issue-duplicate-checker-workflow

Conversation

@enyst
Copy link
Copy Markdown
Member

@enyst enyst commented Jun 1, 2026

Summary

  • add the OpenHands Cloud issue duplicate checker workflow for newly opened issues, scheduled auto-close, and manual dispatch
  • add duplicate-candidate label removal on human issue comments
  • use the shared OpenHands/extensions/plugins/issue-duplicate-checker@main action

Depends on OpenHands/extensions#283 landing first so the shared action exists on main.

Verification

  • parsed new workflow YAML with PyYAML

This PR was created by an AI agent (OpenHands) on behalf of the user.

@enyst can click here to continue refining the PR


🐳 Docker images for this PR

GHCR package: https://github.com/OpenHands/agent-canvas/pkgs/container/agent-canvas

Component Value
Image ghcr.io/openhands/agent-canvas
Architectures amd64, arm64
Agent Server ghcr.io/openhands/agent-server:1.24.0-python
Automation openhands-automation==1.0.0a5
Commit 93f9335a617945dcc2c73771ee273d3b76b1be35

Pull (multi-arch manifest)

# Multi-arch manifest — Docker automatically pulls the correct architecture
docker pull ghcr.io/openhands/agent-canvas:sha-93f9335

Run

docker run -it --rm \
  -p 8000:8000 \
  ghcr.io/openhands/agent-canvas:sha-93f9335

All tags pushed for this build

ghcr.io/openhands/agent-canvas:sha-93f9335-amd64
ghcr.io/openhands/agent-canvas:add-issue-duplicate-checker-workflow-amd64
ghcr.io/openhands/agent-canvas:pr-987-amd64
ghcr.io/openhands/agent-canvas:sha-93f9335-arm64
ghcr.io/openhands/agent-canvas:add-issue-duplicate-checker-workflow-arm64
ghcr.io/openhands/agent-canvas:pr-987-arm64
ghcr.io/openhands/agent-canvas:sha-93f9335
ghcr.io/openhands/agent-canvas:add-issue-duplicate-checker-workflow
ghcr.io/openhands/agent-canvas:pr-987

About Multi-Architecture Support

  • Each tag (e.g., sha-93f9335) is a multi-arch manifest supporting both amd64 and arm64
  • Docker automatically pulls the correct architecture for your platform
  • Individual architecture tags (e.g., sha-93f9335-amd64) are also available if needed

Co-authored-by: openhands <openhands@all-hands.dev>
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agent-canvas Ready Ready Preview, Comment Jun 2, 2026 1:53am

Request Review

@enyst enyst marked this pull request as ready for review June 2, 2026 01:10
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

✅ Mock-LLM Docker E2E Test Results

12/12 passed

Commit: 7e4d5c8d · Workflow run · Test artifacts

Status Test Duration
mock-llm-auth-modes.spec.ts › auth mode: non-public key rotation › recovers when localStorage has a stale session API key 3.8s
mock-llm-auth-modes.spec.ts › auth mode: public gate › shows the auth screen when no key is configured 1.2s
mock-llm-auth-modes.spec.ts › auth mode: public gate › rejects an incorrect key with an inline error 1.4s
mock-llm-auth-modes.spec.ts › auth mode: public gate › allows access after pasting the correct key 1.5s
mock-llm-auth-modes.spec.ts › auth mode: public gate › re-prompts when the server rotates its key (stale localStorage) 1.5s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 1: setup LLM profile and register automation trajectory 224ms
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 2: create automation and dispatch run via the UI 28.8s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 3: verify automation and run on the automations page 4.1s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 1: create an LLM profile pointing at the mock LLM server 5.7s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 2: activate the mock-llm profile and verify settings API 4.4s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 3: run a conversation with the mock LLM 4.4s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 4: resume conversation from sidebar after navigating away 4.2s

Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses)

Copy link
Copy Markdown
Member Author

enyst commented Jun 2, 2026

@all-hands-bot This PR is ready for review: it adds duplicate issue checking using the reusable OpenHands/extensions/plugins/issue-duplicate-checker action that has now been merged. CI is green on the latest SHA. Could you review?

This comment was created by an AI agent (OpenHands) on behalf of the user.

@enyst enyst requested a review from all-hands-bot June 2, 2026 01:23
Copy link
Copy Markdown
Contributor

all-hands-bot commented Jun 2, 2026

Review complete.

This review was performed through OpenHands Cloud Automation. You can log in and view the conversation here.

Copy link
Copy Markdown
Contributor

@all-hands-bot all-hands-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Acceptable — The workflows are well-structured with good concurrency controls and a clean three-mode design, but there are a few correctness and security issues worth addressing before merge.


[CRITICAL ISSUES]

  • [.github/workflows/issue-duplicate-checker.yml, Line 60] Correctness: inputs.issue_number != null does not work as intended. In GitHub Actions, an unfilled workflow_dispatch input of type number evaluates to '' (empty string), not JSON null. As written, '' != null evaluates to true, meaning the issue-duplicate-check job can be triggered in issue-check mode without a valid issue number — the action will receive an empty string and likely fail at runtime. Change to inputs.issue_number != '' (or simply inputs.issue_number).

[IMPROVEMENT OPPORTUNITIES]

  • [.github/workflows/issue-duplicate-checker.yml, Lines 68 & 88; .github/workflows/remove-duplicate-candidate-label.yml, Line 27] Supply Chain / Pinning: All three steps use OpenHands/extensions/plugins/issue-duplicate-checker@main. Pinning to a mutable branch ref means any breaking change (or a compromised push) to main immediately affects every repo running this workflow with no review gate. Pin to a specific commit SHA (e.g. @abc1234) or a tagged release and update it via a controlled PR. This is standard practice for third-party/composite Actions that touch secrets (OPENHANDS_API_KEY, OPENHANDS_BOT_GITHUB_PAT_PUBLIC).

  • [.github/workflows/issue-duplicate-checker.yml, Lines 39–40] Redundant step: The smoke-clone job runs actions/checkout@v6 and then immediately does a manual git clone to /tmp/repo-clone. The checkout step populates $GITHUB_WORKSPACE but nothing else in the job uses it — the manual clone is the actual smoke test. Removing the actions/checkout step eliminates one unnecessary step and any GITHUB_TOKEN credential exposure.

[TESTING GAPS]

  • [PR description] Weak Evidence: The stated verification ("parsed new workflow YAML with PyYAML") confirms the file is syntactically valid YAML, not that any workflow path executes correctly end-to-end. A smoke-clone dispatch run or a test issue-check run against a real or mock issue would provide meaningful evidence. Consider running workflow_dispatch with mode: smoke-clone after merge to confirm the reusable action resolves properly once OpenHands/extensions#283 lands.

[RISK ASSESSMENT]

  • [Overall PR] ⚠️ Risk Assessment: 🟡 MEDIUM
    This PR introduces two new event-triggered workflows that use a mutable @main action reference and hold repo secrets (OPENHANDS_API_KEY, bot PAT). The inputs.issue_number != null bug means mode: issue-check dispatches without an issue number will silently misbehave. Risk is elevated above Low due to the pinning gap and the correctness issue on the dispatch path; no existing workflow behavior is broken.

VERDICT:Needs rework — The inputs.issue_number != null check is a real bug that should be fixed, and the mutable @main pin is a meaningful security/stability concern. Both are straightforward one-line fixes.

KEY INSIGHT: The three-mode workflow_dispatch design is clean, but the null-check for the optional issue_number input uses a comparison that never triggers as intended in GitHub Actions expression syntax.


Improve this review? If any feedback above seems incorrect or irrelevant to this repository, you can teach the reviewer to do better:

  1. Add a .agents/skills/custom-codereview-guide.md file to your branch (or edit it if one already exists) with the /codereview trigger and the context the reviewer is missing. See the customization docs for the required frontmatter format.
  2. Re-request a review — the reviewer reads guidelines from the PR branch, so your changes take effect immediately.

Was this review helpful? React with 👍 or 👎 to give feedback.

This review was generated by an AI agent (OpenHands) on behalf of the user through OpenHands Automation. View conversation

Comment thread .github/workflows/issue-duplicate-checker.yml Outdated
Comment thread .github/workflows/issue-duplicate-checker.yml Outdated
Comment thread .github/workflows/issue-duplicate-checker.yml Outdated
Comment thread .github/workflows/issue-duplicate-checker.yml Outdated
Comment thread .github/workflows/remove-duplicate-candidate-label.yml Outdated
Co-authored-by: openhands <openhands@all-hands.dev>
Co-authored-by: openhands <openhands@all-hands.dev>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

❌ Mock-LLM Docker E2E Test Results

7/12 passed · 2 failed · 3 skipped

Commit: 6f6a94fa · Workflow run · Test artifacts

Status Test Duration
mock-llm-auth-modes.spec.ts › auth mode: non-public key rotation › recovers when localStorage has a stale session API key 3.8s
mock-llm-auth-modes.spec.ts › auth mode: public gate › shows the auth screen when no key is configured 1.2s
mock-llm-auth-modes.spec.ts › auth mode: public gate › rejects an incorrect key with an inline error 1.4s
mock-llm-auth-modes.spec.ts › auth mode: public gate › allows access after pasting the correct key 1.7s
mock-llm-auth-modes.spec.ts › auth mode: public gate › re-prompts when the server rotates its key (stale localStorage) 1.4s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 1: setup LLM profile and register automation trajectory 208ms
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 2: create automation and dispatch run via the UI 29.8s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 3: verify automation and run on the automations page 236ms
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 1: create an LLM profile pointing at the mock LLM server 249ms
⏭️ mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 2: activate the mock-llm profile and verify settings API 0ms
⏭️ mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 3: run a conversation with the mock LLM 0ms
⏭️ mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 4: resume conversation from sidebar after navigating away 0ms
🔍 Failure details (2)

❌ mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 3: verify automation and run on the automations page

Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:18300/automations
Call log:
  - navigating to "http://localhost:18300/automations", waiting until "domcontentloaded"

❌ mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 1: create an LLM profile pointing at the mock LLM server

Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:18300/settings/llm
Call log:
  - navigating to "http://localhost:18300/settings/llm", waiting until "domcontentloaded"

Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses)

Copy link
Copy Markdown
Member Author

enyst commented Jun 2, 2026

@all-hands-bot Addressed the requested changes in 6f6a94f: fixed the workflow_dispatch issue-number guard, removed the redundant smoke-clone checkout, and pinned all duplicate-checker action invocations to full extensions SHA fb020c71eb8e7cd2678f0251ab24327d3738da7d. CI is green and all review threads are resolved. Could you review again?

This comment was created by an AI agent (OpenHands) on behalf of the user.

@enyst enyst requested a review from all-hands-bot June 2, 2026 01:43
Copy link
Copy Markdown
Contributor

all-hands-bot commented Jun 2, 2026

Review complete.

This review was performed through OpenHands Cloud Automation. You can log in and view the conversation here.

Copy link
Copy Markdown
Contributor

@all-hands-bot all-hands-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

All three issues flagged in the previous review have been correctly resolved in the current HEAD:

  1. Null-check correctedinputs.issue_number != '' correctly guards the issue-check dispatch path; the empty-string comparison is right for how GitHub Actions evaluates unfilled number inputs.
  2. Redundant actions/checkout removedsmoke-clone now runs only the explicit git clone, eliminating unnecessary GITHUB_TOKEN credential exposure.
  3. SHA-pinned action refs — all three action uses are now pinned to fb020c71eb8e7cd2678f0251ab24327d3738da7d instead of the mutable @main ref.

The overall design is clean: three well-separated jobs with precise triggering conditions, correct concurrency groups (all cancel-in-progress: false, which is right for side-effectful operations), and minimal RBAC (contents: read, issues: write). The remove-duplicate-candidate-label.yml guard conditions are thorough — correctly excluding bot comments and both OpenHands HTML comment markers (<!-- openhands-duplicate-check and <!-- openhands-duplicate-veto).


[IMPROVEMENT OPPORTUNITIES] (non-blocking)

  • Missing timeout-minutes in smoke-clonegit clone --depth 1 should complete in seconds. Without an explicit timeout the job inherits GitHub’s 6-hour default, so a transient network hang won’t surface for hours. timeout-minutes: 5 is appropriate. (See inline note.)

  • Missing timeout-minutes in remove-duplicate-candidate-label.yml — label removal is a single API call. Similarly, timeout-minutes: 10 would make runaway/hung runs visible quickly. (See inline note.)

  • Smoke-clone summary missing HEAD SHAecho "Repository HEAD: $(git -C /tmp/repo-clone rev-parse --short HEAD)" outputs to stdout but not to $GITHUB_STEP_SUMMARY. Moving that line into the heredoc block would make the run annotation include the actual commit validated.


[TESTING GAPS]

  • The stated verification (“parsed new workflow YAML with PyYAML”) confirms syntactic validity only. Running workflow_dispatch with mode: smoke-clone after the dependency (OpenHands/extensions#283) lands is the meaningful smoke test. Consider adding a checklist item to block merge until that dispatch run completes successfully.

[RISK ASSESSMENT]

  • [Overall PR] ⚠️ Risk Assessment: 🟢 LOW — All previously flagged correctness and supply-chain concerns have been addressed. The pinned SHA and corrected empty-string guard eliminate the prior medium-risk issues. The remaining suggestions are defensive/cosmetic; no blocking concerns remain.
  • The primary operational dependency — OpenHands/extensions#283 landing so the pinned SHA is reachable from main — is correctly documented in the PR description.

VERDICT:Worth merging — Core logic is sound. The three-mode dispatch design is clean, concurrency handling is correct, and all prior review findings have been resolved. Minor timeout and summary improvements are good-to-have but not blocking.

KEY INSIGHT: The workflow correctly separates the AI-powered duplicate-detection path (issue-duplicate-check, timeout 35 min, OPENHANDS_API_KEY) from the fast housekeeping paths (auto-close and remove-label, GitHub token only) — exactly the right separation of concerns for cost and permission scoping.


Improve this review? If any feedback above seems incorrect or irrelevant to this repository, you can teach the reviewer to do better:

  1. Add a .agents/skills/custom-codereview-guide.md file to your branch (or edit it if one already exists) with the /codereview trigger and the context the reviewer is missing. See the customization docs for the required frontmatter format.
  2. Re-request a review — the reviewer reads guidelines from the PR branch, so your changes take effect immediately.

Was this review helpful? React with 👍 or 👎 to give feedback.

This review was generated by an AI agent (OpenHands) on behalf of the user through OpenHands Automation. View conversation

jobs:
smoke-clone:
if: github.event_name == 'workflow_dispatch' && inputs.mode == 'smoke-clone'
runs-on: ubuntu-latest
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No timeout-minutes is set for smoke-clone. A git clone --depth 1 should complete in seconds; adding timeout-minutes: 5 here would surface any unexpected hang quickly instead of waiting for GitHub’s 6-hour default.

        runs-on: ubuntu-latest
        timeout-minutes: 5

github.event.comment.user.type != 'Bot' &&
!startsWith(github.event.comment.body || '', '<!-- openhands-duplicate-check') &&
!startsWith(github.event.comment.body || '', '<!-- openhands-duplicate-veto')
runs-on: ubuntu-latest
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No timeout-minutes is set for this job. Label removal is a single GitHub API call; adding timeout-minutes: 10 would make any runaway/hung execution visible quickly.

        runs-on: ubuntu-latest
        timeout-minutes: 10

Co-authored-by: openhands <openhands@all-hands.dev>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

✅ Mock-LLM Docker E2E Test Results

12/12 passed

Commit: 93f9335a · Workflow run · Test artifacts

Status Test Duration
mock-llm-auth-modes.spec.ts › auth mode: non-public key rotation › recovers when localStorage has a stale session API key 3.8s
mock-llm-auth-modes.spec.ts › auth mode: public gate › shows the auth screen when no key is configured 1.2s
mock-llm-auth-modes.spec.ts › auth mode: public gate › rejects an incorrect key with an inline error 1.4s
mock-llm-auth-modes.spec.ts › auth mode: public gate › allows access after pasting the correct key 1.8s
mock-llm-auth-modes.spec.ts › auth mode: public gate › re-prompts when the server rotates its key (stale localStorage) 1.4s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 1: setup LLM profile and register automation trajectory 466ms
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 2: create automation and dispatch run via the UI 29.7s
mock-llm-automation.spec.ts › mock-LLM automation lifecycle › step 3: verify automation and run on the automations page 4.1s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 1: create an LLM profile pointing at the mock LLM server 4.1s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 2: activate the mock-llm profile and verify settings API 4.4s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 3: run a conversation with the mock LLM 4.3s
mock-llm-conversation.spec.ts › mock-LLM agent-server conversation › step 4: resume conversation from sidebar after navigating away 3.6s

Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📸 Snapshot Test Report

✅ All snapshots match the main branch baselines.

Category Count
🔴 Changed 0
🆕 New 0
✅ Unchanged 73
Total 73
✅ Unchanged snapshots (73)

archived-conversation

  • conversation-panel-with-archived-badges
  • conversation-view-archived
  • conversation-view-sandbox-error

automations

  • automations-delete-modal
  • automations-list-active-inactive
  • automations-no-automations
  • automations-search-no-results

backends-extended

  • backend-add-blank-disabled
  • backend-add-cloud-advanced-open
  • backend-add-cloud-no-key-disabled
  • backend-add-cloud-with-key-enabled
  • backend-add-form-partially-filled
  • backend-add-invalid-url-disabled
  • backend-add-local-ready
  • backend-add-name-only-disabled
  • backend-add-two-column-layout
  • backend-add-whitespace-host-disabled
  • backend-after-switch
  • backend-cancel-nothing-saved
  • backend-dropdown-two-backends
  • backend-edit-prefilled
  • backend-manage-after-removal
  • backend-manage-two-listed
  • backend-remove-cancelled
  • backend-remove-confirmation
  • backend-switch-overlay

backends

  • backend-add-modal
  • backend-manage-modal
  • backend-selector-open

changes-tab

  • changes-deleted-file
  • changes-diff-viewer
  • changes-empty

collapsible-thinking

  • reasoning-content-collapsed
  • reasoning-content-expanded
  • think-action-collapsed
  • think-action-expanded

mcp-page

  • mcp-custom-server-1-editor-open
  • mcp-custom-server-2-url-filled
  • mcp-custom-server-3-all-filled
  • mcp-custom-server-4-installed
  • mcp-custom-server-editor
  • mcp-empty-installed
  • mcp-search-filtered
  • mcp-slack-install-1-marketplace
  • mcp-slack-install-2-modal
  • mcp-slack-install-3-filled
  • mcp-slack-install-4-installed

onboarding

  • onboarding-step-0-choose-agent
  • onboarding-step-1-check-backend
  • onboarding-step-2-setup-llm
  • onboarding-step-3-say-hello

projects-workspace-browser

  • projects-workspace-browser

settings-page

  • add-backend-modal
  • analytics-consent-modal
  • home-screen
  • settings-app-page
  • settings-page

settings-secrets

  • secrets-add-form-filled
  • secrets-add-form
  • secrets-after-save
  • secrets-delete-confirm
  • secrets-list

settings-verification

  • condenser-settings
  • verification-settings-off
  • verification-settings-on

sidebar

  • sidebar-collapsed
  • sidebar-conversation-panel
  • sidebar-filter-menu

skills-page

  • skills-empty
  • skills-loaded
  • skills-no-match
  • skills-search-filtered
  • skills-type-filter

Generated by the Snapshot Tests workflow. This comment was created by an AI agent (OpenHands) on behalf of the repo maintainers.

Copy link
Copy Markdown
Member Author

enyst commented Jun 2, 2026

@all-hands-bot Addressed the remaining cleanup in 93f9335: added explicit timeouts, included the smoke-clone HEAD in the step summary, and removed the unused repository input from remove-label mode. CI is green on the latest SHA. Could you review again and approve if ready?

This comment was created by an AI agent (OpenHands) on behalf of the user.

@enyst enyst requested a review from all-hands-bot June 2, 2026 02:04
Copy link
Copy Markdown
Contributor

all-hands-bot commented Jun 2, 2026

Review complete.

This review was performed through OpenHands Cloud Automation. You can log in and view the conversation here.

Copy link
Copy Markdown
Contributor

@all-hands-bot all-hands-bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review

This is a re-review of the PR at the latest HEAD (93f9335). All issues raised in previous reviews have been addressed, and the final polish commit fully closes the remaining non-blocking gaps.


What changed in the latest commit (93f9335 — "chore: polish duplicate checker workflows")

Item Status
timeout-minutes: 5 added to smoke-clone ✅ Done
REPO_HEAD captured into $GITHUB_ENV and printed in $GITHUB_STEP_SUMMARY ✅ Done
timeout-minutes: 10 added to remove-duplicate-candidate-label.yml ✅ Done
Spurious repository: input removed from remove-label mode ✅ Done

Current state of each issue previously raised

Issue Resolution
inputs.issue_number != null bug ✅ Fixed — now != ''
Redundant actions/checkout in smoke-clone ✅ Removed
Mutable @main action pins ✅ All three uses pinned to fb020c71
Missing timeout-minutes in smoke-clone ✅ Set to 5
Missing timeout-minutes in remove-duplicate-candidate-label.yml ✅ Set to 10
HEAD SHA not surfaced in step summary ✅ Now written to $GITHUB_STEP_SUMMARY via REPO_HEAD env var

Design observations (informational, non-blocking)

Workflow-level permissions apply to all jobs. issue-duplicate-checker.yml sets contents: read, issues: write at the workflow level. The smoke-clone job (which only does git clone --depth 1 via HTTPS) doesn't need contents: read from the token and certainly not issues: write. Per-job permissions: overrides would be the strictest posture, but this is cosmetic for a workflow_dispatch-only job.

close_after_days default of 3 is intentional and reasonable. Worth noting for future operators: teams sometimes prefer 7 days for newly-opened issues, but this can be overridden at dispatch time.

Dependency gating. The PR correctly documents that OpenHands/extensions#283 must land before the pinned SHA fb020c71eb8e7cd2678f0251ab24327d3738da7d is reachable on main. Merging this PR before that dependency lands will cause all three uses: steps to fail at runtime. Consider adding a merge blocker (label or branch protection rule) until the dependency is confirmed merged.


Risk Assessment

🟢 LOW — All critical and improvement items have been resolved. The three-mode dispatch design is clean, concurrency handling is correct (cancel-in-progress: false on all side-effectful jobs), permissions are scoped appropriately (contents: read, issues: write), and all action refs are SHA-pinned. The only remaining operational prerequisite is the upstream OpenHands/extensions#283 dependency.

VERDICT:Approved — Ready to merge once the OpenHands/extensions#283 dependency lands and the smoke-clone dispatch has been validated post-merge.

This review was generated by an AI agent (OpenHands) on behalf of the user through OpenHands Automation. View conversation

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.

3 participants