Skip to content
Recued
Menu
← Back to recipes

Linear issue closure watcher

by recued-core v1

Scheduled adopter for Linear issue closure rows seeded by create-linear-issue-with-closure. It lists only Recued-originated issue watches, re-reads a bounded batch of Linear issue, and closes the shared row when Linear reports the issue completed or canceled. It can notify the owner on terminal issue state, but it never creates, updates, moves, cancels, completes, deletes, archives, assigns, labels, subscribes to, comments on, or otherwise mutates Linear issues.

Complete workflow

Linear Issue Closure Loop 4 pinned recipes

Workflow pack for Recued-created Linear issues. It composes the Linear capability pack with a closure ledger: create one owner-approved issue in one Linear team, optionally attach it to a configured project, persist only the connection/team/project/issue linkage in data.shared, and let a scheduled watcher re-read that exact issue until Linear reports it completed or canceled. This pack does not replace Linear workflow states, issue views, project views, cycles, roadmaps, native notifications, automations, comments, or general issue reporting; it adds Recued-visible closure state for issues Recued created.

You are viewing one recipe in this workflow. Installing it opens the complete pack so its other recipes and background automations arrive together.

Linear issue closure watcher
This recipe Background automation

Scheduled adopter for Linear issue closure rows seeded by create-linear-issue-with-closure. It lists only Recued-originated issue watches, re-reads a bounded batch of Linear issue, and closes the shared row when Linear reports the issue completed or canceled. It can notify the owner on terminal issue state, but it never creates, updates, moves, cancels, completes, deletes, archives, assigns, labels, subscribes to, comments on, or otherwise mutates Linear issues.

linearissuescollaborationwork-tracking
by recued-core pinned v1

Workflow origin for the Linear issue closure loop. It creates exactly one owner-approved issue through recued-core.linear.issue.create, and when the issue succeeds it seeds durable data.shared closure state for linear-issue-closure-watcher. It uses deterministic owner-provided fields rather than AI and does not update, move, cancel, complete, delete, archive, assign, label, subscribe to, comment on, or otherwise mutate Linear issues beyond the approved issue create.

linearissuescollaborationwork-tracking
by recued-core pinned v1
Linear issue closure watcher timeout
Background automation

Low-frequency timeout role for recued-core/linear-issue-closure. It moves a bounded batch of expired rows from active to timed_out, deletes the active copy only after the durable timeout write succeeds, and notifies the owner once per batch.

linearwatchertimeoutowner-review
by recued-core pinned v1

Owner-visible list/close role for recued-core/linear-issue-closure. It lists bounded active, timed-out, and closed rows. Supplying a timed-out or closed key deletes only that exact terminal row; active watches cannot be deleted here.

linearwatcherreviewclose
by recued-core pinned v1
View pack details, dependencies, and permissions →
How it works 126 steps

Inspect the data fetches, transforms, gates, and output this recipe runs.

Data fetch
shared_issue_watches ?
Process (125 steps)
now date_add
Add 0 days to
watch_rows filter
Filter by condition
watch_rows_for_connection filter
Filter by condition
watch_rows_with_issue filter
Filter by condition
never_checked_watch_rows filter
Filter by condition
checked_watch_rows filter
Filter by condition
checked_watch_rows_oldest_first sort
Sort by value.last_checked_at
fair_watch_rows flatten
Flatten nested lists in
candidate_rows slice
Take a subset of
batch_count count
Count items in candidate rows
candidate_count count
Count items in watch rows with issue
has_candidate compare
Check if candidate rows has data
has_connection compare
Check if setting linear has data
skip_issue_read any
Check if any of the conditions are true
batch_context_envelopes merge
Combine objects together
batch_contexts map
Extract from each item
issue ?
skip: step.skip_issue_read equal true
issue_live_batch_context pick
Keep only specific fields from
issue_batch_context_envelopes merge
Combine objects together
issue_batch_contexts map
Extract from each item
state_type default
Apply default
state_type_live_batch_context pick
Keep only specific fields from
state_type_batch_context_envelopes merge
Combine objects together
state_type_batch_contexts map
Extract from each item
has_state_type compare
Check if item state type has data
has_state_type_live_batch_context pick
Keep only specific fields from
has_state_type_batch_context_envelopes merge
Combine objects together
has_state_type_batch_contexts map
Extract from each item
issue_completed compare
Check if item state type equals completed
issue_completed_live_batch_context pick
Keep only specific fields from
issue_completed_batch_context_envelopes merge
Combine objects together
issue_completed_batch_contexts map
Extract from each item
issue_canceled compare
Check if item state type equals canceled
issue_canceled_live_batch_context pick
Keep only specific fields from
issue_canceled_batch_context_envelopes merge
Combine objects together
issue_canceled_batch_contexts map
Extract from each item
terminal_status any
Check if any of the conditions are true
terminal_status_live_batch_context pick
Keep only specific fields from
terminal_status_batch_context_envelopes merge
Combine objects together
terminal_status_batch_contexts map
Extract from each item
completed_at default
Apply default
completed_at_live_batch_context pick
Keep only specific fields from
completed_at_batch_context_envelopes merge
Combine objects together
completed_at_batch_contexts map
Extract from each item
canceled_at default
Apply default
canceled_at_live_batch_context pick
Keep only specific fields from
canceled_at_batch_context_envelopes merge
Combine objects together
canceled_at_batch_contexts map
Extract from each item
live_issue_identifier default
Apply default
live_issue_identifier_live_batch_context pick
Keep only specific fields from
live_issue_identifier_batch_context_envelopes merge
Combine objects together
live_issue_identifier_batch_contexts map
Extract from each item
live_team_id default
Apply default
live_team_id_live_batch_context pick
Keep only specific fields from
live_team_id_batch_context_envelopes merge
Combine objects together
live_team_id_batch_contexts map
Extract from each item
live_project_id default
Apply default
live_project_id_live_batch_context pick
Keep only specific fields from
live_project_id_batch_context_envelopes merge
Combine objects together
live_project_id_batch_contexts map
Extract from each item
owner_action ternary
Apply ternary
owner_action_live_batch_context pick
Keep only specific fields from
owner_action_batch_context_envelopes merge
Combine objects together
owner_action_batch_contexts map
Extract from each item
skip_close any
Check if any of the conditions are true
skip_close_live_batch_context pick
Keep only specific fields from
skip_close_batch_context_envelopes merge
Combine objects together
skip_close_batch_contexts map
Extract from each item
closed_watch_key replace
Replace text in item watch key
closed_watch_key_live_batch_context pick
Keep only specific fields from
closed_watch_key_batch_context_envelopes merge
Combine objects together
closed_watch_key_batch_contexts map
Extract from each item
close_watch ?
skip: item.skip_close equal true
close_watch_live_batch_context pick
Keep only specific fields from
close_watch_batch_context_envelopes merge
Combine objects together
close_watch_batch_contexts map
Extract from each item
delete_closed_active_watch ?
skip: item.close_watch.ok not_equal true
delete_closed_active_watch_live_batch_context pick
Keep only specific fields from
delete_closed_active_watch_batch_context_envelopes merge
Combine objects together
delete_closed_active_watch_batch_contexts map
Extract from each item
notify_completed_enabled compare
Check if setting notify when completed equals true
notify_completed_enabled_live_batch_context pick
Keep only specific fields from
notify_completed_enabled_batch_context_envelopes merge
Combine objects together
notify_completed_enabled_batch_contexts map
Extract from each item
notify_canceled_enabled compare
Check if setting notify when canceled equals true
notify_canceled_enabled_live_batch_context pick
Keep only specific fields from
notify_canceled_enabled_batch_context_envelopes merge
Combine objects together
notify_canceled_enabled_batch_contexts map
Extract from each item
should_notify_completed all
Check if all conditions are true
should_notify_completed_live_batch_context pick
Keep only specific fields from
should_notify_completed_batch_context_envelopes merge
Combine objects together
should_notify_completed_batch_contexts map
Extract from each item
should_notify_canceled all
Check if all conditions are true
should_notify_canceled_live_batch_context pick
Keep only specific fields from
should_notify_canceled_batch_context_envelopes merge
Combine objects together
should_notify_canceled_batch_contexts map
Extract from each item
status_should_notify any
Check if any of the conditions are true
status_should_notify_live_batch_context pick
Keep only specific fields from
status_should_notify_batch_context_envelopes merge
Combine objects together
status_should_notify_batch_contexts map
Extract from each item
should_notify all
Check if all conditions are true
should_notify_live_batch_context pick
Keep only specific fields from
should_notify_batch_context_envelopes merge
Combine objects together
should_notify_batch_contexts map
Extract from each item
notification_title ternary
Apply ternary
notification_title_live_batch_context pick
Keep only specific fields from
notification_title_batch_context_envelopes merge
Combine objects together
notification_title_batch_contexts map
Extract from each item
notify_owner ?
skip: item.should_notify not_equal true
notify_owner_live_batch_context pick
Keep only specific fields from
notify_owner_batch_context_envelopes merge
Combine objects together
notify_owner_batch_contexts map
Extract from each item
refreshed_watch_value merge
Combine objects together
skip: item.delete_closed_active_watch.ok equal true
refreshed_watch_value_live_batch_context pick
Keep only specific fields from
refreshed_watch_value_batch_context_envelopes merge
Combine objects together
refreshed_watch_value_batch_contexts map
Extract from each item
refresh_active_watch ?
skip: item.delete_closed_active_watch.ok equal true
refresh_active_watch_live_batch_context pick
Keep only specific fields from
refresh_active_watch_batch_context_envelopes merge
Combine objects together
refresh_active_watch_batch_contexts map
Extract from each item
closed_batch_rows filter
Filter by condition
refreshed_batch_rows filter
Filter by condition
closed_batch_count count
Count items in closed batch rows
refreshed_batch_count count
Count items in refreshed batch rows
summary to_summary
Format results as a summary card
Settings 5 configurable

Configurable at install. Defaults shown — change them anytime in Recued.

linear setting =
channels setting = in_app
batch limit setting = 5
notify when canceled setting = true
notify when completed setting = true

Trust & control

What installing this recipe would let it do. Recued grants these permissions at install — review them there before approving.

Where it runs

Device + server Runs on your device (browser) or your server.

Permissions it requires

Send notificationsRead your Linear connection
Declared by the recipe — Recued grants these at install, where you review them before approving.

Data it touches

Warehousedata.issuedata.shared

About

Tags

linear linearissuescollaborationwork-trackingproject-managementclosurenotificationclosed-loopstate:linear-issue-closure-watcherpack:linear-issue-closure

Details

126 steps 5 configurable settings recipe_id: linear-issue-closure-watcher