Skip to content

Facts and steps

Predicates are CEL expressions; their syntax is on the intent manifest page. A missing fact reads as its type’s zero value.

The predicates of an intent manifest read these. The action slot ([action] predicates) reads the row the daemon serves; the turn slot ([record] when, headline cases, also_profile[].when) reads the turn being built.

FactTypeSlotsMeaning
pr.mineboolaction, turnThe pull request’s author is the viewer.
pr.authorstringaction, turnThe pull request’s author login; empty when not stored.
pr.statestringaction, turnThe pull request’s state on GitHub: OPEN, CLOSED or MERGED.
pr.slugstringaction, turnowner/repo#number.
pr.ownerstringaction, turnThe repository owner.
pr.repostringaction, turnowner/repo.
pr.repo_namestringaction, turnThe repository name, without its owner.
pr.basestringaction, turnThe base branch.
pr.associationstringturnThe author’s association with the repository, from the Basics read.
pr.cross_repositoryboolaction, turnThe head branch lives in a fork.
pr.visibilitystringturnThe repository’s visibility: public, private or internal, from the Basics read; empty before it.
pr.requested_teamslistturnThe teams a review of the pull request was requested through, as -.
pr.labelslistturnThe pull request’s labels, from the Basics read.
pr.address.reviewerslistturnThe reviewers the address round answers: on its turn, those it answers, empty on any other; in a workflow, those it would answer.
pr.address.checkslistturnThe failing checks the address round fixes: on its turn, those it fixes, empty on any other; in a workflow, those it would fix.
pr.address.conflictboolturnThe head conflicts with the base past the conflict window and the address round resolves it: on its turn, it does, false on any other; in a workflow, it would.
pr.draftboolactionThe pull request is a draft, from the inventory row.
pr.review_requested_meboolactionA review is requested from the viewer, from the inventory row.
pr.adoptedboolactionThe pull request was taken over into the loop.
pr.heldboolactionRounds on the pull request are held.
pr.nudge.wholistactionWhom a nudge would address, from nudge.targets.
pr.nudge.whystringactionWhy the pull request waits on them, from nudge.targets.
pr.nudge.refusalstringactionWhy a nudge is refused now: the mute while one holds, else the text nudge.prepare would refuse with; empty when a nudge may go.
pr.last_review.existsboolturnThe viewer reviewed the pull request before.
pr.last_review.verdictstringturnThe viewer’s newest review state, any state; empty when none.
pr.last_review.decisionstringturnThe viewer’s newest non-comment verdict; empty when none.
FactTypeSlotsMeaning
row.kindstringactionThe row’s situation kind; a plugin’s row_kinds close it on its units.
row.openboolactionThe pull request is open: kind is not done, or, untracked, its GitHub state is open.
row.trackedboolactionThe pull request is in the inventory.
row.questionboolactionA turn waits on the user’s answer.
row.pendingboolactionA round is pending.
row.cappedboolactionThe daily budget held the row’s automatic round.
row.intakeboolactionAn intake is open on the pull request.
row.intake_seqintactionThe number of the open intake, the waiting one first; 0 when none is open.
row.author_workspaceboolactionA linked workspace holds the author role.
row.yoursboolactionThe row’s unit is the viewer’s to act on: any unit but a pull request, or a pull request that is the viewer’s, taken over or held by an author workspace.
row.review_workspaceboolactionA linked workspace holds the review role.
row.trust_folderstringactionThe folder whose trust lifts the row’s start block; empty for a block on another question.
row.trust_homeslistactionThe agent homes trusting row.trust_folder writes in.
row.remove_refusalstringactionWhat refused removing the row’s workspace, which a force remove overrides; empty when nothing did.
row.recommendedstringactionThe runner recommended for the row’s items: session or headless; empty when none is.
FactTypeSlotsMeaning
task.captured_by_userboolactionThe user captured the task: origin user and kind capture; false for a derived task, such as one from a Slack thread.
task.titlestringnameThe task’s title.
task.short_idstringnameThe task’s id, short: its first six hex digits.
FactTypeSlotsMeaning
turn.automatedboolturnThe sweep started the turn.
turn.ownedboolturnThe viewer owns the pull request’s loop.
turn.needs_take_overboolturnowner_only, not owned, and no input with before = “take_over” set.
turn.resumeboolturnThe turn resumes an earlier one.
turn.tryboolturnThe turn is a dry run (profile try).
turn.plannedstringturnThe round the request planned: first, follow-up, or empty for none.
turn.stagestringturnfirst or follow-up; only intents with dims = [“stage”] may read it.
unit.refstringturnThe unit as the instructions name it, such as owner/repo#12.
unit.labelstringnameThe unit as people read it: a pull request as owner/repo#12, any other unit as provider:key.

A name (session.*, workspace.*; slot name)

Section titled “A name (session.*, workspace.*; slot name)”
FactTypeSlotsMeaning
session.titlestringnameThe manifest’s session.title.
workspace.namestringnameThe name of the worktree created for the unit; empty when the turn creates none or before it is named.
session.startedtimestampnameWhen the session starts; a template formats it with Go’s layout, as {{.session.started.Format “02/01 15:04”}}. Zero when unset; test with > timestamp(0).
FactTypeSlotsMeaning
draft.statestringdraft_actionThe draft’s state.
draft.providerstringdraft_actionThe provider of the draft’s unit.
draft.refusalstringdraft_actionWhy the action is disabled: plugin_off, state, posts_nothing, no_effects, effect_posts, not_from_workflow or skipped; empty when it is enabled.
draft.maybe_postedbooldraft_actionThe draft failed after its post may have reached its provider.

An item proposal’s gate (proposal.*; slot proposal)

Section titled “An item proposal’s gate (proposal.*; slot proposal)”
FactTypeSlotsMeaning
proposal.opstringproposalThe operation proposed on the item: update, resolve, reopen and the others an op names.
proposal.itemstringproposalThe id of the item the operation changes.
proposal.unitstringproposalThe item’s unit, as a person reads it.
proposal.reasonstringproposalWhy the operation was proposed; empty when its proposer gave no reason.
proposal.provenancestringproposalWho proposed it, as the ledger names its provenance: extracted, turn or derived.
proposal.verbstringproposalOn a verb’s gate, the verb it runs once approved; empty on an item proposal’s.
proposal.taskstringproposalOn a verb’s gate, the title of the task the verb runs on.
proposal.otherstringproposalOn the gate of a verb that takes another task, that task’s title; empty otherwise.
proposal.keepstringproposalOn a merge’s gate, the title of the task the survivor rule keeps as the gate opens; empty otherwise.
proposal.foldstringproposalOn a merge’s gate, the title of the task it folds into proposal.keep; empty otherwise.

A built-in action’s copy (copy.*; slot copy)

Section titled “A built-in action’s copy (copy.*; slot copy)”
FactTypeSlotsMeaning
copy.titlestringcopyThe unit’s title.
copy.linkstringcopyThe unit’s web address; empty when it has none that is http or https.
copy.labelstringcopyThe unit as people read it, such as owner/repo#12.
copy.brief.goalstringcopyThe brief’s goal; empty when the unit has no brief.
copy.brief.contextstringcopyThe brief’s context; empty when the unit has no brief.
copy.brief.kindstringcopyThe brief’s kind; empty when the unit has no brief.
copy.brief.sizestringcopyThe brief’s size; empty when the unit has no brief.
copy.brief.riskstringcopyThe brief’s risk: low, medium or high; empty when the unit has no brief.
copy.brief.risk_whystringcopyWhy the brief rates its risk so; empty when the unit has no brief.
copy.brief.open_questionslistcopyThe brief’s open questions; empty when the unit has no brief.
FactTypeSlotsMeaning
config.plugins.github.address_reviewsboolaction, turnThe plugins.github.address_reviews setting for the pull request.
config.plugins.github.address_checksboolaction, turnThe plugins.github.address_checks setting for the pull request.
config.plugins.github.followups_without_workspaceboolaction, turnThe plugins.github.followups_without_workspace setting for the pull request.
config.plugins.github.address_without_workspaceboolaction, turnThe plugins.github.address_without_workspace setting for the pull request.

A workflow’s when reads the facts of its provider’s slot, plus trigger.*, config.* and now; a provider whose units have a brief also reads brief.*, and [drafts.withdraw] when also reads draft.*. wloop workflows facts [github|session|slack|task|workspace] prints them. A pull request fact has one name and one spelling in every slot: pr.repo is owner/repo and pr.repo_name the bare name.

session fact (provider session)TypeMeaning
session.statestringactive (it has a live process), dormant (no process; its manager can wake it) or closed.
session.managerstringThe workspace manager that owns the session, such as orca or claude-desktop.
session.managedboolThe session was started by the loop (sessions.managed).
session.listedboolThe session’s manager lists its process as usable.
session.orphanedboolThe session’s manager lists its process as not usable.
session.agent_statestringThe agent’s state as the manager reports it. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.user_activeboolThe user acts in the session now.
session.user_typed_after_turnboolThe user typed in the session after the loop’s last turn.
session.prompt_knowableboolWhether the user typed can be known, from the hook or the transcript.
session.prompted_while_idleboolA manual session got a prompt during its idle period. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.open_turnstringThe state of the session’s open turn; empty when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.newest_statestringThe state of the session’s newest turn. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.newest_agedurationTime since the newest turn was sent or started.
session.newest_intentstringThe intent of the newest turn.
session.closes_when_doneboolThe newest turn’s intent closes its session when done.
session.idle_sincetimestampWhen the current idle period started. Zero when unset; test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.idle_fordurationTime since idle_since. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.unread_gatesintGates of the session’s turns the user answered, whose notice reached the session and whose answer its agent has not read with task_read.
session.unread_sincetimestampWhen the notice of the oldest unread answer of unread_gates reached the session; zero when none. Test with > timestamp(0).
session.unread_fordurationTime since unread_since; 0 when none.
session.pr_statestringThe state of the book’s pull request: OPEN, CLOSED or MERGED; empty when none.
session.duplicateboolAnother listed session resumes the same agent session; the focused one, one the user prompted, and else the oldest are never duplicates.
session.worktree_goneboolThe session’s worktree path no longer exists.
session.closed_by_managerboolThe dormant session’s manager keeps its own record of it, and the user closed it there, such as archiving it in Claude Desktop.
session.transcript_goneboolThe agent’s transcript of the session, as its hooks reported it, no longer exists.
session.process_goneboolThe active session’s process was missed by two complete censuses of its manager.
session.process_orphanedboolComplete censuses of the same runtime have listed the active session’s process orphaned, a terminal no window of the app shows with no agent in it, for a fast job. It proves nothing about the process staying so.
session.orphan_durableboolThe census proved the active session’s process a durable orphan, while the app’s windows showed some terminal and their graph held for a fast job: it outlived a restart of the app’s windows after a fast job orphaned in windows that showed some terminal, or stayed orphaned two hours with a known last output from before, every reading showing some terminal.
session.fingerprintstringThe session id, its state, the start of the idle period and the newest turn’s sequence. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
session.repostringowner/repo of the book’s pull request; empty when none.
session.namestringWhat people call the session: its workspace’s display name, else its worktree’s folder, else its terminal’s title, else its id.
workspace fact (provider workspace)TypeMeaning
workspace.rolestringauthor (a taken-over workspace included), review or none.
workspace.mainboolThe workspace is the repository’s main checkout.
workspace.prstringThe linked pull request, owner/repo#number; empty when none.
workspace.pr_statestringThe linked pull request’s state: OPEN, CLOSED or MERGED; empty when none.
workspace.pr_finished_fordurationThe linked pull request’s pr.finished_for.
workspace.path_existsboolThe worktree path exists.
workspace.temporaryboolThe worktree lives under a temporary path.
workspace.duplicateboolNeither a main checkout nor the workspace the manager links to its pull request, while another non-main workspace is.
workspace.dirtyintModified tracked files. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.untrackedintUntracked files outside cleanup.disposable. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.unpushedintCommits on no remote. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.newest_turn_statestringThe state of the newest turn of the linked pull request’s book; empty when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.open_turnboolThe linked pull request’s book has an open turn. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.pendencylistWhat holds work: modified files, untracked files, commits on no remote, turn asked unanswered, turn failed, turn unrecorded, turn open. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.sessionsintAgent sessions in the workspace that are active, or dormant and active within cleanup.idle.
workspace.managerstringThe workspace manager that owns the worktree.
workspace.last_activitytimestampThe newest activity in the workspace. Zero when unset; test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.quiet_fordurationTime since last_activity. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.fingerprintstringThe worktree path and its head. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
workspace.repostringowner/repo; empty when unknown.
task fact (provider task)TypeMeaning
task.idstringThe task’s id.
task.statestringThe task’s state, one of the states tasks.toml declares. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.unitstringThe task’s first unit as provider:key: the unit it was captured or derived on, else its first attachment; empty for a task with none.
task.unit_providerstringThe provider of task.unit; empty for a task with none.
task.unitslistThe task’s units as provider:key, in order: the unit it was captured or derived on, then those attached to it in attach order, then any only its items name. The task itself is not one of them.
task.unit_providerslistThe providers of task.units, each once, in order.
task.unit_kindslistThe task kinds the plugins of task.units give their units’ tasks, each once, in order, such as pull-request for a task that holds a pull request, whatever its own kind.
task.open_unit_kindslistThe task kinds of the units of task.units that have not ended as their plugin says, each once, in order: pull-request while a pull request the task holds is open. Unset where nothing says whether a unit ended.
task.link_endedboolThe task has a unit, and every one of task.units has ended as its plugin says (pr.ended, slack.ended); a unit of a plugin that says nothing never ends.
task.turnsintTurns run on the task itself, such as a start; turns on its units are not counted.
task.captured_by_userboolThe user captured the task: origin user and kind capture. False for a task derived from a unit’s items, such as one from a Slack thread, or opened by another service.
task.link_started_by_meboolThe viewer started task.unit, from the facts the tasks receive. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_closure_postedboolA closure was posted on task.unit, from the facts the tasks receive. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.items_openintOpen items of the task’s units. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.items_resolvedintResolved items of the task’s units. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.items_changed_attimestampWhen an item the task holds, open or resolved, or any item of a unit it holds none of, was last created or changed; zero when none. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.settled_attimestampThe newest update of a settled draft the workflow proposed on the task, withdrawn ones included; zero when none. Test with > timestamp(0).
task.fingerprintstringThe task’s id, state and update time. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.categorystringThe category of the task’s state: inbox, ready, active, waiting, deferred, done or dropped. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.owed_bystringWho owes the task’s next step, as tasks.toml’s owed_by says: me, a person’s key, or empty when nobody does. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.turnstringWhose turn the task’s next step is, from task.owed_by: me, others (a person’s), or nobody. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.owed_sincetimestampSince when task.owed_by has owed the next step; zero when nobody does. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.moved_attimestampWhen the task, or a unit linked to it, last moved; zero when never. Test with > timestamp(0).
task.since_movementdurationTime since the task, or a unit linked to it, last moved: a state change, a source event, a run.
task.check_ontimestampWhen to check on the task: its check_on property, else, when the items it holds wait on someone else and not on you, tasks.stale_waiting_days working days after the oldest of them; zero when neither. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.gates_openintThe task’s open gates.
task.decisionslistThe decision kinds the task waits on the user for, as decisions.toml maps its open gates and, while it is open, its units’ situations and link signals; the oldest first. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.decision_sincetimestampSince when the oldest of task.decisions waits; zero when none. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.turns_open_by_handintThe open turns (sent, started or asked) someone started by hand on the task or a unit it links, but those of the chat intent tasks.toml names.
task.turn_by_hand_attimestampWhen the newest of task.turns_open_by_hand was sent; zero when none is open. Test with > timestamp(0).
task.turns_runningintThe turns the loop sent on the task or a unit it links that an agent is working on: sent or started, not yet asking or ended.
task.wake_untiltimestampWhen the task’s wake wakes it; zero when it has none, or one that waits on events or a condition only. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.wake_whenstringThe condition the task’s wake waits on; empty when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.placementstringowner/repo of the repository the task’s work runs in: its placement, else its units’ plugin’s; empty when unknown.
task.sequential_nextboolThe task is the first open child of a sequential parent. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.review_dueboolThe task is a parent whose review is due. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.children_readyboolThe task has a child in the ready category. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.children_mineboolThe task has a child in the ready category whose next step is yours: its task.owed_by is me. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.ask_agedurationThe age of the task’s oldest unanswered ask: the oldest open item it holds that waits on you; zero when none does. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.askerslistWho waits on you through the task: the requesters of the open items it holds that wait on you, each once, by key such as slack:U0123. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.asker_nameslistThe names of task.askers, as their items name them, each once; a requester with no name is its key. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.promisedtimestampWhen you promised the task by: the property of role promise, which acknowledge sets; zero when unset. Untrusted, since a profile may let an agent write that property. Test with > timestamp(0). Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.extraction_lagdurationHow long the oldest message of a unit linked to the task has waited to be extracted, as its plugin’s extraction health says; zero when none waits. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signalslistThe link signals the units the task links report, on or off, each once, by name: the profile reads whether a source keeps its own staleness, such as ‘stalled’ in task.link_signals. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.clarifiedboolThe task was shaped by hand: a person, or an agent through a session the user drives, ran a verb on it that moves it to a state or sets its parent, or a person wrote a property other than those of roles merged and related; no agent’s property write counts. The bundled merge verb’s survivor reads it.
task.refused_pairslistThe tasks of task.undone while no item either task holds was created or changed since they were taken apart; seeing, starring or filing a task changes no item: a proposal of either pair is not due again. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.undonelistThe tasks you took apart from this one, by id as they read now, whatever changed since: a merge or relate gate with it you rejected, a split of the two, an unrelate of the two; a task merged since into another names that one, and a split takes apart every task the split one held, through earlier merges, from every task it was in. A gate a workflow’s verb opens on such a pair waits for you whatever its approval says, and one a rule or a window released before runs nothing. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.candidateslistThe open tasks that may be the same work as this one, by id, the likeliest first: tasks sharing a person among their items’ requesters, assignees and waited-on, a link target, or a unit one of them holds that the other’s items cite, created within tasks.candidate_window of it, without task.refused_pairs and the tasks related to it; at most tasks.candidate_cap, and empty when none, so no judgment over them runs. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.linked_candidateslistThe tasks of task.candidates that share a link target or a cited unit with this one, not only a person, in its order. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.link_target_taskslistThe other open tasks holding a unit a review or merge link of this task’s items targets, such as the task of a pull request an ask in a thread links, by id, oldest first, without task.refused_pairs and the tasks related to it; neither side a project, a draft’s or a message’s task. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.link_target_unitslistThe units a review or merge link of this task’s items targets, each once, but the task’s own, whatever task holds them and whether or not it is refused or related: how many pull requests an ask links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. On demand: computed only for a when, step argument, view or wake that names it; any other reader that evaluates it fails with an error naming it.
task.titlestringThe task’s title; a derived task’s is its first item’s summary. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.notesstringThe task’s notes. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_oweslistWho the open items the task holds wait on, each once: me for the user, else a person’s key such as slack:U0123; a unit the task holds with none of its items, all the unit’s open items. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.stalledboolThe pull request’s situation lasted past its stalled threshold, in working days. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.in_loopboolA review workspace holds the pull request: the loop reviews it. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.readyboolThe work on the pull request is approved: my review approved its head, or my own can merge. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.workspaceboolA workspace of the pull request remains on disk, a review or an author one, whatever the pull request’s state. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.asked_reactedboolEvery open item of the unit has a check mark from whoever asked it or whom it waits on, other than you, on a message posted after its ask. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
task.link_signal.replied_lastboolYou posted the unit’s newest person’s message, after every open item’s ask, at least 3 days ago, and every open item waits on you or got a message from someone else after its ask. On when it is on for any unit the task links. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr fact (provider github)TypeMeaning
pr.mineboolThe pull request’s author is the viewer.
pr.authorstringThe pull request’s author login; empty when not stored.
pr.statestringThe pull request’s state on GitHub: OPEN, CLOSED or MERGED.
pr.slugstringowner/repo#number.
pr.ownerstringThe repository owner.
pr.repostringowner/repo.
pr.repo_namestringThe repository name, without its owner.
pr.basestringThe base branch.
pr.associationstringThe author’s association with the repository, from the Basics read.
pr.cross_repositoryboolThe head branch lives in a fork.
pr.visibilitystringThe repository’s visibility: public, private or internal, from the Basics read; empty before it.
pr.requested_teamslistThe teams a review of the pull request was requested through, as -.
pr.labelslistThe pull request’s labels, from the Basics read.
pr.address.reviewerslistThe reviewers the address round answers: on its turn, those it answers, empty on any other; in a workflow, those it would answer. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.address.checkslistThe failing checks the address round fixes: on its turn, those it fixes, empty on any other; in a workflow, those it would fix. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.address.conflictboolThe head conflicts with the base past the conflict window and the address round resolves it: on its turn, it does, false on any other; in a workflow, it would. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.draftboolThe pull request is a draft, from the inventory row.
pr.review_requested_meboolA review is requested from the viewer, from the inventory row.
pr.adoptedboolThe pull request was taken over into the loop.
pr.heldboolRounds on the pull request are held.
pr.nudge.wholistWhom a nudge would address, from nudge.targets.
pr.nudge.whystringWhy the pull request waits on them, from nudge.targets.
pr.nudge.refusalstringWhy a nudge is refused now: the mute while one holds, else the text nudge.prepare would refuse with; empty when a nudge may go.
pr.last_review.existsboolThe viewer reviewed the pull request before.
pr.last_review.verdictstringThe viewer’s newest review state, any state; empty when none.
pr.last_review.decisionstringThe viewer’s newest non-comment verdict; empty when none.
pr.merged_attimestampWhen the pull request merged; zero when it did not. Test with > timestamp(0).
pr.closed_attimestampWhen the pull request closed; zero when open. Test with > timestamp(0).
pr.finished_fordurationWorking time since it ended, max(merged_at, closed_at), the rule retention uses; zero while open.
pr.endedboolThe pull request merged or closed: the GitHub plugin’s word that the unit has ended.
pr.changed_filesintHow many files the pull request changes, as GitHub last reported it; 0 when not read.
pr.headstringThe head commit’s oid.
pr.conflicting_fordurationHow long the pull request has conflicted with its base, from when the inventory first saw it; zero when it does not.
pr.checksstringThe checks’ rollup on the head: success, failure, pending, error or expected; empty with no checks.
pr.stalledboolThe checks stalled on the head.
pr.agedurationTime since the pull request opened.
pr.has_workspaceboolA linked workspace holds the pull request.
pr.staleboolThe stored detail is older than sweep.slow + 2 x sweep.fast.
pr.open_turnstringThe state of the book’s open turn; empty when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.open_turn_seqintThe sequence of the book’s open turn; 0 when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.orphan_answer_idintThe id of an answer whose turn ended; 0 when none. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.review.actionstringWhat the review rules decide: empty, follow-up or complete. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.review.reasonstringWhy the review rules decide so. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.review.observedboolThe review rules observe without acting. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.first.dueboolA first round is due. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.first.reasonstringWhy a first round is due or not. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.address.dueboolAn address round is due. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.address.reasonstringWhy an address round is due or not. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.address.observedboolThe address rules observe without acting. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.last_interaction_attimestampThe newest comment, review, push or review request, by anyone. Zero when unset; test with > timestamp(0).
pr.silent_daysintCalendar days since last_interaction_at.
pr.waits_on_userboolThe row waits on the user, per situation.Derive. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
pr.fingerprintstringWhat the sweep records as handled until something new happens: recorded heads, review and check fingerprints, skips. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack fact (provider slack)TypeMeaning
slack.channelstringThe conversation’s channel id.
slack.conversationstringThe conversation’s kind: channel, dm or group.
slack.started_by_meboolThe viewer started the thread. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.closure_postedboolA closure was posted on the unit, or closed without a message, by the extraction or a draft’s unit.closed. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.live_taskboolA live task is attached to the unit: neither done, in the trash nor deferred, as a snoozed or muted task is. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.items_openintOpen items whose unit is this unit. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.items_resolvedintResolved items whose unit is this unit. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.items_unownedintOpen items of the unit with no assignee, nobody waited on and no basis. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.items_unowned_age_daysintWorking days, in the configured location, since the oldest unowned item appeared. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.endedboolThe Slack plugin’s word that the unit has ended: a closure was posted or marked (unit.closed), or its newest stored message is older than plugins.slack.ended_after.
slack.settled_attimestampThe newest update of a settled draft the workflow proposed on the unit, withdrawn ones included; zero when none. Test with > timestamp(0).
slack.fingerprintstringThe unit, its newest message and the update time of its items. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.languagestringThe language the thread’s people write in, an ISO 639-1 code; empty when its text does not tell. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
slack.memberslistThe person keys of the conversation’s members, you included: a DM’s two people, a group DM’s or a channel’s as conversations.members last read them, at most a day ago. Absent while the plugin cannot tell, such as before the first read or after a failed one.
brief factTypeMeaning
brief.goalstringThe brief’s goal; empty when the unit has no brief. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
brief.riskstringThe brief’s risk: low, medium or high. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
brief.kindstringThe brief’s kind, from the provider’s taxonomy. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
brief.sizestringThe brief’s size; GitHub briefs only. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
brief.tagslistThe brief’s normalized key:value tags. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
brief.missinglistThe brief intent’s extra fields the unit’s brief lacks: new or changed since it was written. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
draft factTypeMeaning
draft.person_waitedboolOne of the draft’s people, the person a per-person draft is to or those its text mentions, is still waited on by its task; true for a draft of no people.
draft.items_owedintItems of the draft still open and held by any of its people, or unowned for a draft of no people.
draft.items_assignedintItems of the draft that have an owner, someone waited on, or are no longer open.
draft.unit_openboolThe draft’s unit still exists: its task is neither done nor in the trash, or its unit is stored.
draft.person_asks_youboolEvery one of the draft’s people asked you something still open on the draft’s unit: an open item there that they requested waits on you, or is assigned to you and waits on nobody else. False for a draft of no people.
draft.people_outsideintThe draft’s people its unit’s plugin knows are not members of the conversation it posts in (a plugin’s members_fact); a draft posted in the direct conversation of the person it is to counts none, and a person whose membership the plugin cannot tell is not counted.
draft.target_joinedboolThe person a draft posted in their direct conversation is to is now, as the plugin knows, a member of the conversation the draft came from; false for any other draft.
gate factTypeMeaning
gate.kindstringThe gate’s kind: draft, plan, question, post, proposal, trust or step.
gate.namestringThe gate’s name in gates.toml; empty for a gate of no profile name.
gate.statusstringThe gate’s status: open, approved, rejected, answered, dismissed or superseded.
gate.deliverystringA draft gate’s delivery state, such as sending or failed; empty for any other gate.
trigger factTypeMeaning
trigger.kindstringsweep, event or schedule.
trigger.event.kindstringThe event’s kind; empty unless kind is event.
trigger.event.keystringThe event’s key.
trigger.event.idintThe event’s id, unique and growing; 0 unless kind is event.
trigger.event.datastringThe event’s data: a person’s or an agent’s text, such as an intake’s note, an answer or the mentions of a sent nudge. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it.
trigger.fired_attimestampWhen the schedule fired; zero unless kind is schedule. Test with > timestamp(0).
config factTypeMeaning
config.cleanup.idledurationThe cleanup.idle setting.
config.cleanup.asked_idledurationThe cleanup.asked_idle setting.
config.cleanup.workspace_gracedurationThe cleanup.workspace_grace setting, in working time.
config.cleanup.manual_idledurationThe cleanup.manual_idle setting.
config.cleanup.stale_workspacedurationThe cleanup.stale_workspace setting.
config.plugins.github.nudge.silent_daysintThe plugins.github.nudge.silent_days setting, in calendar days.
config.tasks.stale_waiting_daysintThe tasks.stale_waiting_days setting, in working days.
config.drafts.repeat_afterdurationThe drafts.repeat_after setting.
config.turns.per_dayintThe turns.per_day setting: automated turns on units whose plugin keeps no per-unit count, all workflows together.

A [gates.approval] rule of a draft gate reads these in its when, the facts of the draft, plus the gate’s (gate.kind, gate.name) and the facts of the unit the draft is on (a workflow’s: its provider’s), never brief.*, trigger.*, config.* or a fact marked Untrusted, whose value a third party’s text, read by the extraction, or the proposing turn itself sets. A rule that reads a draft’s facts applies to draft gates alone. A rule over the facts of another provider than the draft’s unit’s does not apply to it. A rule that releases a draft on its own (send, run or delay) applies to a draft whose delivery posts, as its plugin’s manifest marks it, only when its when has draft.delivery == "<delivery>" as a term of its top-level &&.

Approval factTypeMeaning
draft.deliverystringHow the unit’s plugin posts the draft: message, reaction or comment. A plugin that posts every text as a comment makes each draft that is not a reaction a comment, whatever its proposer asked for.
draft.proposerstringWhat proposed the draft: workflow: for a workflow’s draft.propose, intent: for a turn’s or a session’s, rule: for a plugin rule’s.
draft.effectslistThe effects the draft applies once sent when the loop named them, a workflow’s draft.propose or a plugin rule; empty for a turn’s or a session’s draft, whose agent names them. A workflow’s rules and the configuration’s read it; an intent’s do not.
draft.purposestringThe draft’s purpose when the loop named it, a workflow’s draft.propose or a plugin rule; empty for a turn’s or a session’s draft, whose agent names it. A workflow’s rules and the configuration’s read it; an intent’s do not.

The steps a [[step]] may name with use. wloop workflows steps prints them with their arguments.

StepUnitDoes
session.closesessionCloses the agent session.
workspace.removeworkspaceRemoves the workspace, after its guards. Never with force: a manifest that sets it fails to load.
workspace.unregisterworkspaceUnregisters a workspace whose path is gone.
turn.dismisssession, githubDismisses the open turn, recording the reason.
answer.refusegithubRefuses a queued answer whose route is gone.
session.mark_dormantsessionMarks dormant an active session whose process its manager’s census no longer lists, or has listed orphaned with no agent for a fast job (session.process_orphaned) when no turn is sent or started in it, its agent neither works nor waits for permission, its workspace is not focused and you did not prompt it since the loop’s last turn: the session stays open, and the next turn, or a census that shows its process in a window again, wakes it. It records the state and ends no process.
session.close_orphansessionSide effect: ends the process of an active session that the census proved a durable orphan (session.orphan_durable), a terminal no window of the app shows with no agent in it. It runs under session.close’s guards (no turn sent or started, the agent neither working nor waiting for permission, the workspace not focused, no prompt of yours since the loop’s last turn) and records nothing on the session: the censuses that then miss the process mark it dormant. Refused for good on a session gone, closed or dormant.
turn.startanyStarts a turn of intent on the unit, which the intent must serve; stage (first or follow-up) for a review; runner (session or headless), by default the intent’s first runner. On a pull request, caps, the brief, busy and held checks apply as for any automatic round; on any other unit, the workflow’s limits.per_day and turns.per_day.
draft.proposeanyProposes a draft in the Outbox: purpose (a label), delivery (message, reaction or comment), text (a template in the workflow’s directory, by default text.md.tmpl, over .Items, .Person and .Facts, the subject’s facts by name, such as {{index .Facts "task.promised"}}), reaction (an emoji name), items (owed, resolved, unowned, unowned_aged or all), per (unit or person), target (unit or item), effects (the effects sending it applies), repeat_after (the least time after a settled draft of the same person, a duration or a duration of the config such as config.drafts.repeat_after) repeat_after_sent (the same after a sent one, or forever) and ended (hold, the default, holds proposals of no task or of the same task while a draft’s task a verb ended stays ended; repeat holds them for repeat_after). Holds while a draft of the workflow, unit and person is open or failed; a run that leaves a person under a delay that ends with time stays pending until it ends.
classifyanyA headless classification whose output becomes facts, classify.<workflow>.<field> with each - of the workflow’s name an _, typed by the schema’s top-level properties: prompt (a file in the workflow’s directory, by default prompt.md) and schema (the JSON schema its answer follows, by default schema.json). With with, a list fact of task ids, it reads those tasks too and its prompt is a template over them. Event triggers only, cached by fingerprint, prompt and schema, under classify.per_day. Each run that reads its output records a classified event on the unit, whose data is the workflow’s name.
notify.selfanyA private notification: text (a template in the workflow’s directory, by default text.md.tmpl, over .Workflow, .Unit and .Facts, the unit’s facts by name, such as {{index .Facts "pr.slug"}}, none once the unit is gone).
task.verbtaskRuns a verb of tasks.toml on the task as the workflow: verb, one whose by.workflow lets a workflow run it, with the arguments its handler takes (until and on_activity for schedule, on and resurface for waiting, set for context and area, by for promise, task for merge, split, relate and unrelate). The plan blocks it while the task’s state or the verb’s by refuses it, and a verb that closes a task derived from a unit’s items, which closes when they resolve. A verb whose by.workflow is gate opens the verb’s gate instead, under the workflow’s [gates.approval]: released by a rule, the verb runs as the workflow; approved by you, as you; a pair you took apart (task.undone) waits for you. It records the verb_<verb> event with the workflow as its actor and the chain it runs in, so another workflow may react to it within trigger.depth.
gate.openanyOpens the gate name of gates.toml on the unit, a decision that waits for you with the intents gates.toml gives it.
items.resolvetaskResolves every open item the task holds, as the workflow, with resolution and the workflow as its evidence, so a task derived from its units’ items closes; an item you confirmed becomes a proposal, a gate on the task. Posts nothing.
task.settaskSets the task’s property prop of tasks.toml to value, written by the workflow; a property the workflow may not write is refused.

What a sent draft applies, once: the names a draft.propose step lists in effects and an intent lists in [drafts] allowed_effects. A turn’s own effects are on the language page.

EffectUnitDoes
plan.clearedanyDrops the unit’s pending plan items.
turn.guidance_handedanyHands the guidance queued on the unit to the turn, and queues it back when the turn is not sent.
turn.round_sentanyRecords the round-sent event on the unit when a person sends the turn.
task.nudgedanyWrites the last_nudge property of the draft’s task and of every open task holding one of the items it lists. It says the people were nudged, so it needs the draft’s post.
unit.closedanyRecords the closure of the draft’s unit through its plugin, which unwatches it after its warm period, then ends the open tasks that hold the unit. It applies without the draft’s post too.
pr.reviewedgithubWrites the plugin mark reviewed: the reviews the round covered, once its review is submitted.
pr.addressedgithubWrites the plugin marks addressed.*: the reviews, checks and conflict the address round covered.
pr.nudgedgithubRecords the nudged event on the pull request, which the nudge refusal reads: when its turn is sent, keyed by the turn so that a turn that ended before its agent started it does not count, or as the GitHub publisher posts its draft.

The marks the plugins’ rounds write that a workflow’s when may read with handled("<name>", <fact>), besides those a loaded workflow records. A plugin declares them in its manifest’s [[source.marks]].

MarkUnitCovers
addressed.reviewsgithubThe newest review an address round triaged on a pull request you develop, a time: handled("addressed.reviews", <time>).
addressed.checksgithubThe head whose failing checks an address round covered: handled("addressed.checks", pr.head).
addressed.conflictgithubThe head whose conflict with the base an address round covered: handled("addressed.conflict", pr.head).

This page is generated from the binary’s fact registry by make docs-ref.