docs: add Slack+GitHub+Linear daily organization automation#132
Conversation
Co-authored-by: openhands <openhands@all-hands.dev>
|
🚀 Deploy Preview PR Created/Updated A deploy preview has been created/updated for this PR. Deploy PR: https://github.com/OpenHands/deploy/pull/4377 Once the deploy PR's CI passes, the automation service will be deployed to the feature environment. |
all-hands-bot
left a comment
There was a problem hiding this comment.
🟢 Good taste - Clean, comprehensive documentation for a useful automation pattern.
This PR establishes the first recommended automation example with:
- Proper placeholder usage for sensitive values
- Comprehensive safety rules (access verification, graceful degradation)
- Conservative approach to avoid duplicates and weak matches
- Clear structure with well-defined tasks
- Appropriate timeout (30 min) for the complex workflow
The automation template is well-suited for the prompt preset since it requires judgment for issue matching, priority selection, and summarization.
[RISK ASSESSMENT]
- [Overall PR]
⚠️ Risk Assessment: 🟢 LOW
Documentation-only change adding a template/example file. No code changes, no runtime behavior affected.
VERDICT:
✅ Worth merging: Well-structured documentation that follows best practices.
KEY INSIGHT:
This template demonstrates the right balance between comprehensiveness and usability - detailed enough to be actionable while using placeholders to keep it reusable.
Was this automated review useful? React with 👍 or 👎 to this review to help us measure review quality.
Workflow run: https://github.com/OpenHands/automation/actions/runs/26409964296
|
✅ Review complete. This review was performed through OpenHands Cloud Automation. You can log in and view the conversation here. |
all-hands-bot
left a comment
There was a problem hiding this comment.
🟢 Good taste - Clean, well-structured documentation for a practical automation pattern.
This PR adds comprehensive documentation for a Slack+GitHub+Linear daily organization automation with:
- Proper placeholder usage to prevent accidental credential exposure
- Clear safety rules (access verification, graceful degradation, conservative matching)
- Well-defined tasks with appropriate level of detail
- Reasonable 30-minute timeout for the complex workflow
[RISK ASSESSMENT]
- [Overall PR]
⚠️ Risk Assessment: 🟢 LOW
Pure documentation addition with no code changes, no breaking changes, and no security concerns. The prompt includes good safety guidance and uses placeholders correctly.
VERDICT:
✅ Worth merging: Clean documentation that provides value to users
KEY INSIGHT:
This template demonstrates proper automation design with conservative safeguards and clear user guidance through placeholders.
Was this automated review useful? React with 👍 or 👎 to this review to help us measure review quality.
Workflow run: https://github.com/OpenHands/automation/actions/runs/26490763497
all-hands-bot
left a comment
There was a problem hiding this comment.
🟡 Acceptable — Well-structured, thoughtful prompt template with solid safety rules. A few usability gaps worth addressing before users run into them.
[IMPROVEMENT OPPORTUNITIES]
Missing Linear team/project placeholder (impacts usability)
Task 2 step 3 instructs the agent to "create one in the appropriate Linear team/project," but the Identity and scope section (and the placeholder list in the intro) provides no [LINEAR_TEAM_QUERY] or [LINEAR_PROJECT_QUERY] placeholder. In practice, a workspace with multiple teams (e.g. Backend, Platform, Infra) will cause the agent to guess, which can silently route issues to the wrong team. Adding a placeholder and a corresponding identity line (e.g., - Linear team: resolve by searching for [LINEAR_TEAM_QUERY].) closes this gap cleanly.
Missing prerequisites / required secrets section
The document is self-contained enough to copy-and-paste, but nowhere does it tell users which secrets to configure before the automation can run. A user who sets this up for the first time will hit an auth failure in Task 1's access check without knowing which credential is missing. Recommend adding a short "## Required secrets" or "## Prerequisites" section listing the expected secret names (e.g. GITHUB_TOKEN, LINEAR_API_KEY, SLACK_BOT_TOKEN) and pointing to where to register them in OpenHands.
Implicit Linear assignment / In Progress mutation (undisclosed side effect)
Task 2 step 4 silently assigns the configured Linear assignee and moves issues to In Progress whenever an open PR is associated with them. If [GITHUB_ORG_OR_REPO_SCOPE] spans an entire organization this can touch many issues the user didn't personally open, reassigning them from their current owner. This is a real workflow risk that isn't called out anywhere in the "When to use this" section or the safety rules. Worth at minimum adding a bullet: "Changes Linear issue assignee and status for issues with active PRs — review scope before enabling on org-wide repositories."
Curl example prompt field is placeholder text
The example curl command (line 103) shows "prompt": "Paste the anonymized prompt above after replacing bracketed placeholders." — that string is itself meta-text, not a real value. A first-time user who copy-pastes the command will submit a literal instruction to paste text, not the actual prompt. Options: inline a shortened version of the prompt (with ... ellipsis and a note), or add a comment above the block explaining the user must replace that string with the full prompt text from the section above, properly JSON-escaped or heredoc-embedded.
[RISK ASSESSMENT]
- [Overall PR]
⚠️ Risk Assessment: 🟢 LOW
Documentation-only change. No runtime code is modified. The template itself contains automation instructions that touch real external services (GitHub, Linear, Slack), but those only execute when a user deliberately creates the automation with their own credentials and scope.
VERDICT:
✅ Worth merging — the core structure is sound and the safety rules are genuinely good. The gaps above are quality-of-life improvements for first-time users; they don't block a knowledgeable user from using the template correctly.
KEY INSIGHT:
A missing [LINEAR_TEAM_QUERY] placeholder is the only change that could silently misbehave at runtime — everything else is documentation quality.
Improve this review? If any feedback above seems incorrect or irrelevant to this repository, you can teach the reviewer to do better:
- Add a
.agents/skills/custom-codereview-guide.mdfile to your branch (or edit it if one already exists) with the/codereviewtrigger and the context the reviewer is missing.- 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
|
|
||
| A recommended prompt-preset automation that runs every morning to reconcile GitHub work with Linear planning and summarize actionable Slack context into a personal daily plan. | ||
|
|
||
| This automation is intentionally written with placeholders only. Replace bracketed values such as `[GITHUB_USERNAME]`, `[LINEAR_ASSIGNEE_QUERY]`, `[GITHUB_ORG_OR_REPO_SCOPE]`, `[SLACK_RECIPIENT_QUERY]`, and `[IANA_TIMEZONE]` when creating the automation. |
There was a problem hiding this comment.
The placeholder list includes [GITHUB_USERNAME], [LINEAR_ASSIGNEE_QUERY], [GITHUB_ORG_OR_REPO_SCOPE], [SLACK_RECIPIENT_QUERY], and [IANA_TIMEZONE], but there is no [LINEAR_TEAM_QUERY] (or [LINEAR_PROJECT_QUERY]). Task 2 step 3 will tell the agent to pick "the appropriate Linear team/project" with no guidance, which means it will guess. In multi-team workspaces that silently routes new issues to the wrong team. Suggest adding a placeholder here and a corresponding Identity and scope line such as:
- Linear team: resolve by searching for [LINEAR_TEAM_QUERY]. Do not guess if multiple teams exist.
| Task 2 — Ensure GitHub issues are represented in Linear: | ||
| 1. Find all open GitHub issues, excluding PRs, in the configured GitHub issue scope. | ||
| 2. For each issue, verify that it has a corresponding Linear issue. Match by GitHub issue URL first, then by exact repository/name/number and title if needed. | ||
| 3. If no Linear issue exists, create one in the appropriate Linear team/project using the GitHub issue title, URL, repository, labels, and a concise summary. Include an AI disclosure in the Linear issue description. Choose an appropriate priority for newly created Linear issues using this rubric: |
There was a problem hiding this comment.
"The appropriate Linear team/project" is undefined at this point. The Identity and scope block above (line ~47) specifies assignee and assignee query, but not team. Without a [LINEAR_TEAM_QUERY] placeholder in scope the agent has to infer the team, which is unreliable in workspaces with multiple teams. This line should reference the placeholder once it is added.
| - Medium: normal feature/bug/task with moderate impact. | ||
| - Low: cleanup, docs, nice-to-have, unclear/low-impact backlog. | ||
| - No priority only if there is insufficient information. | ||
| 4. For every GitHub issue that has one or more open PRs associated with it, ensure the corresponding Linear issue is assigned to the configured Linear assignee and has a started/In Progress status. If the Linear issue is already completed or canceled, do not reopen it; mention this in the final report instead. |
There was a problem hiding this comment.
This step silently changes assignee and status on Linear issues the user may not own. If [GITHUB_ORG_OR_REPO_SCOPE] covers an entire org with dozens of repos this could touch many issues at once, overwriting existing assignees and moving issues to In Progress without human review. This side effect is not mentioned in the "When to use this" section or the safety rules.
Suggest adding a warning bullet under "When to use this":
⚠️ Automatically reassigns and moves Linear issues to In Progress for every GitHub issue with an open PR. Verify scope is restricted to your own repositories before enabling org-wide.
| -d @- <<'JSON' | ||
| { | ||
| "name": "Slack+GitHub+Linear Daily Organization", | ||
| "prompt": "Paste the anonymized prompt above after replacing bracketed placeholders.", |
There was a problem hiding this comment.
This "prompt" value is itself placeholder/meta text — a user who copy-pastes the curl command as-is will send the literal string "Paste the anonymized prompt above..." to the API, not the actual prompt. The API will accept it but the resulting automation will not do anything useful.
Options:
- Replace with an explicit note above the block:
# Replace the prompt value below with the full text from the ## Prompt section above, properly escaped as a JSON string. - Or inline a truncated hint:
"Your full prompt text here (replace with content from the Prompt section above)"— still illustrative but harder to accidentally use verbatim.
all-hands-bot
left a comment
There was a problem hiding this comment.
🟡 Acceptable — Well-structured, thoughtful prompt template with solid safety rules. A few usability gaps worth addressing before users run into them.
[IMPROVEMENT OPPORTUNITIES]
Missing Linear team/project placeholder (impacts usability)
Task 2 step 3 instructs the agent to "create one in the appropriate Linear team/project," but the Identity and scope section (and the placeholder list in the intro) provides no [LINEAR_TEAM_QUERY] or [LINEAR_PROJECT_QUERY] placeholder. In practice, a workspace with multiple teams (e.g. Backend, Platform, Infra) will cause the agent to guess, which can silently route issues to the wrong team. Adding a placeholder and a corresponding identity line (e.g., - Linear team: resolve by searching for [LINEAR_TEAM_QUERY].) closes this gap cleanly.
Missing prerequisites / required secrets section
The document is self-contained enough to copy-and-paste, but nowhere does it tell users which secrets to configure before the automation can run. A user who sets this up for the first time will hit an auth failure in Task 1's access check without knowing which credential is missing. Recommend adding a short "## Required secrets" or "## Prerequisites" section listing the expected secret names (e.g. GITHUB_TOKEN, LINEAR_API_KEY, SLACK_BOT_TOKEN) and pointing to where to register them in OpenHands.
Implicit Linear assignment / In Progress mutation (undisclosed side effect)
Task 2 step 4 silently assigns the configured Linear assignee and moves issues to In Progress whenever an open PR is associated with them. If [GITHUB_ORG_OR_REPO_SCOPE] spans an entire organization this can touch many issues the user didn't personally open, reassigning them from their current owner. This is a real workflow risk that isn't called out anywhere in the "When to use this" section or the safety rules. Worth at minimum adding a bullet: "Changes Linear issue assignee and status for issues with active PRs — review scope before enabling on org-wide repositories."
Curl example prompt field is placeholder text
The example curl command (line 103) shows "prompt": "Paste the anonymized prompt above after replacing bracketed placeholders." — that string is itself meta-text, not a real value. A first-time user who copy-pastes the command will submit a literal instruction to paste text, not the actual prompt. Options: inline a shortened version of the prompt (with ... ellipsis and a note), or add a comment above the block explaining the user must replace that string with the full prompt text from the section above, properly JSON-escaped or heredoc-embedded.
[RISK ASSESSMENT]
- [Overall PR]
⚠️ Risk Assessment: 🟢 LOW
Documentation-only change. No runtime code is modified. The template itself contains automation instructions that touch real external services (GitHub, Linear, Slack), but those only execute when a user deliberately creates the automation with their own credentials and scope.
VERDICT:
✅ Worth merging — the core structure is sound and the safety rules are genuinely good. The gaps above are quality-of-life improvements for first-time users; they don't block a knowledgeable user from using the template correctly.
KEY INSIGHT:
A missing [LINEAR_TEAM_QUERY] placeholder is the only change that could silently misbehave at runtime — everything else is documentation quality.
Improve this review? If any feedback above seems incorrect or irrelevant to this repository, you can teach the reviewer to do better:
- Add a
.agents/skills/custom-codereview-guide.mdfile to your branch (or edit it if one already exists) with the/codereviewtrigger and the context the reviewer is missing.- 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
|
|
||
| A recommended prompt-preset automation that runs every morning to reconcile GitHub work with Linear planning and summarize actionable Slack context into a personal daily plan. | ||
|
|
||
| This automation is intentionally written with placeholders only. Replace bracketed values such as `[GITHUB_USERNAME]`, `[LINEAR_ASSIGNEE_QUERY]`, `[GITHUB_ORG_OR_REPO_SCOPE]`, `[SLACK_RECIPIENT_QUERY]`, and `[IANA_TIMEZONE]` when creating the automation. |
There was a problem hiding this comment.
The placeholder list includes [GITHUB_USERNAME], [LINEAR_ASSIGNEE_QUERY], [GITHUB_ORG_OR_REPO_SCOPE], [SLACK_RECIPIENT_QUERY], and [IANA_TIMEZONE], but there is no [LINEAR_TEAM_QUERY] (or [LINEAR_PROJECT_QUERY]). Task 2 step 3 will tell the agent to pick "the appropriate Linear team/project" with no guidance, which means it will guess. In multi-team workspaces that silently routes new issues to the wrong team. Suggest adding a placeholder here and a corresponding Identity and scope line such as:
- Linear team: resolve by searching for [LINEAR_TEAM_QUERY]. Do not guess if multiple teams exist.
| Task 2 — Ensure GitHub issues are represented in Linear: | ||
| 1. Find all open GitHub issues, excluding PRs, in the configured GitHub issue scope. | ||
| 2. For each issue, verify that it has a corresponding Linear issue. Match by GitHub issue URL first, then by exact repository/name/number and title if needed. | ||
| 3. If no Linear issue exists, create one in the appropriate Linear team/project using the GitHub issue title, URL, repository, labels, and a concise summary. Include an AI disclosure in the Linear issue description. Choose an appropriate priority for newly created Linear issues using this rubric: |
There was a problem hiding this comment.
"The appropriate Linear team/project" is undefined at this point. The Identity and scope block above (line ~47) specifies assignee and assignee query, but not team. Without a [LINEAR_TEAM_QUERY] placeholder in scope the agent has to infer the team, which is unreliable in workspaces with multiple teams. This line should reference the placeholder once it is added.
| - Medium: normal feature/bug/task with moderate impact. | ||
| - Low: cleanup, docs, nice-to-have, unclear/low-impact backlog. | ||
| - No priority only if there is insufficient information. | ||
| 4. For every GitHub issue that has one or more open PRs associated with it, ensure the corresponding Linear issue is assigned to the configured Linear assignee and has a started/In Progress status. If the Linear issue is already completed or canceled, do not reopen it; mention this in the final report instead. |
There was a problem hiding this comment.
This step silently changes assignee and status on Linear issues the user may not own. If [GITHUB_ORG_OR_REPO_SCOPE] covers an entire org with dozens of repos this could touch many issues at once, overwriting existing assignees and moving issues to In Progress without human review. This side effect is not mentioned in the "When to use this" section or the safety rules.
Suggest adding a warning bullet under "When to use this":
⚠️ Automatically reassigns and moves Linear issues to In Progress for every GitHub issue with an open PR. Verify scope is restricted to your own repositories before enabling org-wide.
| -d @- <<'JSON' | ||
| { | ||
| "name": "Slack+GitHub+Linear Daily Organization", | ||
| "prompt": "Paste the anonymized prompt above after replacing bracketed placeholders.", |
There was a problem hiding this comment.
This "prompt" value is itself placeholder/meta text — a user who copy-pastes the curl command as-is will send the literal string "Paste the anonymized prompt above..." to the API, not the actual prompt. The API will accept it but the resulting automation will not do anything useful.
Options:
- Replace with an explicit note above the block:
# Replace the prompt value below with the full text from the ## Prompt section above, properly escaped as a JSON string. - Or inline a truncated hint:
"Your full prompt text here (replace with content from the Prompt section above)"— still illustrative but harder to accidentally use verbatim.
Summary
Validation
git diff --check.This PR was created by an AI agent (OpenHands) on behalf of the user.
@neubig can click here to continue refining the PR
Related issue: #135