fix: issues #498–#521 (heartbeat, pipeline, notify, registry, PR validation)#4
Merged
fix: issues #498–#521 (heartbeat, pipeline, notify, registry, PR validation)#4
Conversation
Fixes based on GitHub Copilot review comments on PR laurentenhoor#502: 1. getMergedMRUrl(): Now filters on pr.state === 'merged' before returning URL 2. ensureLabel(): Throws actionable error instead of silent no-op 3. listIssues(): Handles opts.state === 'all' explicitly 4. reopenIssue(): Best-effort implementation (try/catch) to prevent workflow breakage 5. addComment(): Implemented via 'tea issue comment create' CLI command These changes improve robustness and ensure the provider follows the IssueProvider contract correctly.
Adds optional messageThreadId parameter through the notification chain: Channel type -> resolveNotifyChannel -> notify -> sendMessage -> Telegram API. This enables per-topic routing in Telegram forum groups, where each project can have notifications sent to a specific forum topic instead of the main chat. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a new "issueComplete" notification event type that fires when an issue is closed via the CLOSE_ISSUE completion action. This provides visibility into the final delivery milestone of the pipeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…name When a project is registered with a mixed-case name (e.g. 'UpMoltWork'), the session key was built using project.name, resulting in keys like: agent:main:subagent:UpMoltWork-developer-junior-annabelle However, the gateway stores and looks up session keys case-sensitively, and new sessions are created with lowercase keys. This mismatch caused the heartbeat to not find the active session, consider the worker dead, and re-dispatch — resulting in workers being restarted every heartbeat cycle. Fix: use project.slug (which is always lowercase) to build the session key. Falls back to project.name.toLowerCase() for safety. Fixes: worker restart loop on projects with mixed-case names
…nish tool. Updated the logic for finding active slots to ensure case-insensitive comparison of session keys, enhancing the accuracy of slot matching for the current session.
…t/message-thread-id
This update introduces support for the optional messageThreadId parameter across various project resolution functions and tools, enabling topic-aware routing for Telegram channels. Key changes include: - New function `resolveProjectChannelScope` for building stable scope keys. - Updates to `resolveProjectSlug` and `getProject` to handle scoped inputs. - Migration logic for normalizing legacy topic fields in projects. - Adjustments in admin tools to accommodate messageThreadId for channel linking, un-linking, and listing. These enhancements improve the flexibility and accuracy of project management within chat environments, particularly for Telegram forum topics.
This update introduces the `notifyTarget` parameter in the dispatch and agent communication processes, allowing for more precise routing of messages to specific Telegram channels and topics. Key changes include: - Addition of `notifyTarget` in the `dispatchTask` and `sendToAgent` functions. - Implementation of `applyNotifyRoutingToGatewayParams` to handle the new routing logic. - Updates to project migration logic to ensure legacy topic fields are correctly normalized. These enhancements improve the flexibility of message delivery within Telegram environments, particularly for forum topics.
… Gitea + target in createProvider Made-with: Cursor
Made-with: Cursor
… alignment) Made-with: Cursor
…pipeline, notify, registry, PR validation) - laurentenhoor#498: heal slots active without startTime (zombie_slot), skip stall without updatedAt - laurentenhoor#499: gateway session fetch uses default timeout when ms is undefined; explicit 15s in tick - laurentenhoor#501: abort completion when MERGE_PR action fails (no silent label transition) - laurentenhoor#513: work_finish accepts projectSlug as alternative to channelId - laurentenhoor#518: optional getPrStatusByUrl + explicit prUrl validation for follow-up PRs - laurentenhoor#520: notify fallback to CLI when runtime send fails; pass runCommand from pipeline - laurentenhoor#521: reconcile empty devclaw/projects.json from legacy registry files Made-with: Cursor
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stacked integration work on
develop/issue-sweep-2026-04plus fixes aligned with laurentenhoor/devclaw issues:zombie_slotwhen active + live session but missingstartTime; skip stall when gatewayupdatedAtmissingfetchGatewaySessions: default timeout when undefined; heartbeat tick passes explicit 15sMERGE_PRfailure aborts completion (no label transition after failed merge)work_finish: optionalprojectSlug(alternative tochannelId)getPrStatusByUrl+ explicitprUrlvalidation for follow-up PRsnotify: runtime failure falls back toopenclaw message send; pipeline passesrunCommanddevclaw/projects.jsonfrom legacyprojects.jsonif neededNotes
ghauth.Closes laurentenhoor#498 laurentenhoor#499 laurentenhoor#501 laurentenhoor#513 laurentenhoor#518 laurentenhoor#520 laurentenhoor#521
Made with Cursor