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.
Intent facts
Section titled “Intent facts”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.
The pull request (pr.*)
Section titled “The pull request (pr.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
pr.mine | bool | action, turn | The pull request’s author is the viewer. |
pr.author | string | action, turn | The pull request’s author login; empty when not stored. |
pr.state | string | action, turn | The pull request’s state on GitHub: OPEN, CLOSED or MERGED. |
pr.slug | string | action, turn | owner/repo#number. |
pr.owner | string | action, turn | The repository owner. |
pr.repo | string | action, turn | owner/repo. |
pr.repo_name | string | action, turn | The repository name, without its owner. |
pr.base | string | action, turn | The base branch. |
pr.association | string | turn | The author’s association with the repository, from the Basics read. |
pr.cross_repository | bool | action, turn | The head branch lives in a fork. |
pr.visibility | string | turn | The repository’s visibility: public, private or internal, from the Basics read; empty before it. |
pr.requested_teams | list | turn | The teams a review of the pull request was requested through, as |
pr.labels | list | turn | The pull request’s labels, from the Basics read. |
pr.address.reviewers | list | turn | The reviewers the address round answers: on its turn, those it answers, empty on any other; in a workflow, those it would answer. |
pr.address.checks | list | turn | The 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.conflict | bool | turn | The 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.draft | bool | action | The pull request is a draft, from the inventory row. |
pr.review_requested_me | bool | action | A review is requested from the viewer, from the inventory row. |
pr.adopted | bool | action | The pull request was taken over into the loop. |
pr.held | bool | action | Rounds on the pull request are held. |
pr.nudge.who | list | action | Whom a nudge would address, from nudge.targets. |
pr.nudge.why | string | action | Why the pull request waits on them, from nudge.targets. |
pr.nudge.refusal | string | action | Why 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.exists | bool | turn | The viewer reviewed the pull request before. |
pr.last_review.verdict | string | turn | The viewer’s newest review state, any state; empty when none. |
pr.last_review.decision | string | turn | The viewer’s newest non-comment verdict; empty when none. |
The row (row.*)
Section titled “The row (row.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
row.kind | string | action | The row’s situation kind; a plugin’s row_kinds close it on its units. |
row.open | bool | action | The pull request is open: kind is not done, or, untracked, its GitHub state is open. |
row.tracked | bool | action | The pull request is in the inventory. |
row.question | bool | action | A turn waits on the user’s answer. |
row.pending | bool | action | A round is pending. |
row.capped | bool | action | The daily budget held the row’s automatic round. |
row.intake | bool | action | An intake is open on the pull request. |
row.intake_seq | int | action | The number of the open intake, the waiting one first; 0 when none is open. |
row.author_workspace | bool | action | A linked workspace holds the author role. |
row.yours | bool | action | The 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_workspace | bool | action | A linked workspace holds the review role. |
row.trust_folder | string | action | The folder whose trust lifts the row’s start block; empty for a block on another question. |
row.trust_homes | list | action | The agent homes trusting row.trust_folder writes in. |
row.remove_refusal | string | action | What refused removing the row’s workspace, which a force remove overrides; empty when nothing did. |
row.recommended | string | action | The runner recommended for the row’s items: session or headless; empty when none is. |
The task (task.*)
Section titled “The task (task.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
task.captured_by_user | bool | action | The user captured the task: origin user and kind capture; false for a derived task, such as one from a Slack thread. |
task.title | string | name | The task’s title. |
task.short_id | string | name | The task’s id, short: its first six hex digits. |
The turn (turn.*, unit.*)
Section titled “The turn (turn.*, unit.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
turn.automated | bool | turn | The sweep started the turn. |
turn.owned | bool | turn | The viewer owns the pull request’s loop. |
turn.needs_take_over | bool | turn | owner_only, not owned, and no input with before = “take_over” set. |
turn.resume | bool | turn | The turn resumes an earlier one. |
turn.try | bool | turn | The turn is a dry run (profile try). |
turn.planned | string | turn | The round the request planned: first, follow-up, or empty for none. |
turn.stage | string | turn | first or follow-up; only intents with dims = [“stage”] may read it. |
unit.ref | string | turn | The unit as the instructions name it, such as owner/repo#12. |
unit.label | string | name | The 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)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
session.title | string | name | The manifest’s session.title. |
workspace.name | string | name | The name of the worktree created for the unit; empty when the turn creates none or before it is named. |
session.started | timestamp | name | When 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). |
A draft’s actions (draft.*)
Section titled “A draft’s actions (draft.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
draft.state | string | draft_action | The draft’s state. |
draft.provider | string | draft_action | The provider of the draft’s unit. |
draft.refusal | string | draft_action | Why 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_posted | bool | draft_action | The 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)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
proposal.op | string | proposal | The operation proposed on the item: update, resolve, reopen and the others an op names. |
proposal.item | string | proposal | The id of the item the operation changes. |
proposal.unit | string | proposal | The item’s unit, as a person reads it. |
proposal.reason | string | proposal | Why the operation was proposed; empty when its proposer gave no reason. |
proposal.provenance | string | proposal | Who proposed it, as the ledger names its provenance: extracted, turn or derived. |
proposal.verb | string | proposal | On a verb’s gate, the verb it runs once approved; empty on an item proposal’s. |
proposal.task | string | proposal | On a verb’s gate, the title of the task the verb runs on. |
proposal.other | string | proposal | On the gate of a verb that takes another task, that task’s title; empty otherwise. |
proposal.keep | string | proposal | On a merge’s gate, the title of the task the survivor rule keeps as the gate opens; empty otherwise. |
proposal.fold | string | proposal | On 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)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
copy.title | string | copy | The unit’s title. |
copy.link | string | copy | The unit’s web address; empty when it has none that is http or https. |
copy.label | string | copy | The unit as people read it, such as owner/repo#12. |
copy.brief.goal | string | copy | The brief’s goal; empty when the unit has no brief. |
copy.brief.context | string | copy | The brief’s context; empty when the unit has no brief. |
copy.brief.kind | string | copy | The brief’s kind; empty when the unit has no brief. |
copy.brief.size | string | copy | The brief’s size; empty when the unit has no brief. |
copy.brief.risk | string | copy | The brief’s risk: low, medium or high; empty when the unit has no brief. |
copy.brief.risk_why | string | copy | Why the brief rates its risk so; empty when the unit has no brief. |
copy.brief.open_questions | list | copy | The brief’s open questions; empty when the unit has no brief. |
The configuration (config.*)
Section titled “The configuration (config.*)”| Fact | Type | Slots | Meaning |
|---|---|---|---|
config.plugins.github.address_reviews | bool | action, turn | The plugins.github.address_reviews setting for the pull request. |
config.plugins.github.address_checks | bool | action, turn | The plugins.github.address_checks setting for the pull request. |
config.plugins.github.followups_without_workspace | bool | action, turn | The plugins.github.followups_without_workspace setting for the pull request. |
config.plugins.github.address_without_workspace | bool | action, turn | The plugins.github.address_without_workspace setting for the pull request. |
Workflow facts
Section titled “Workflow facts”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.
Sessions (session.*)
Section titled “Sessions (session.*)”session fact (provider session) | Type | Meaning |
|---|---|---|
session.state | string | active (it has a live process), dormant (no process; its manager can wake it) or closed. |
session.manager | string | The workspace manager that owns the session, such as orca or claude-desktop. |
session.managed | bool | The session was started by the loop (sessions.managed). |
session.listed | bool | The session’s manager lists its process as usable. |
session.orphaned | bool | The session’s manager lists its process as not usable. |
session.agent_state | string | The 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_active | bool | The user acts in the session now. |
session.user_typed_after_turn | bool | The user typed in the session after the loop’s last turn. |
session.prompt_knowable | bool | Whether the user typed can be known, from the hook or the transcript. |
session.prompted_while_idle | bool | A 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_turn | string | The 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_state | string | The 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_age | duration | Time since the newest turn was sent or started. |
session.newest_intent | string | The intent of the newest turn. |
session.closes_when_done | bool | The newest turn’s intent closes its session when done. |
session.idle_since | timestamp | When 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_for | duration | Time since idle_since. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
session.unread_gates | int | Gates 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_since | timestamp | When the notice of the oldest unread answer of unread_gates reached the session; zero when none. Test with > timestamp(0). |
session.unread_for | duration | Time since unread_since; 0 when none. |
session.pr_state | string | The state of the book’s pull request: OPEN, CLOSED or MERGED; empty when none. |
session.duplicate | bool | Another listed session resumes the same agent session; the focused one, one the user prompted, and else the oldest are never duplicates. |
session.worktree_gone | bool | The session’s worktree path no longer exists. |
session.closed_by_manager | bool | The 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_gone | bool | The agent’s transcript of the session, as its hooks reported it, no longer exists. |
session.process_gone | bool | The active session’s process was missed by two complete censuses of its manager. |
session.process_orphaned | bool | Complete 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_durable | bool | The 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.fingerprint | string | The 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.repo | string | owner/repo of the book’s pull request; empty when none. |
session.name | string | What people call the session: its workspace’s display name, else its worktree’s folder, else its terminal’s title, else its id. |
Workspaces (workspace.*)
Section titled “Workspaces (workspace.*)”workspace fact (provider workspace) | Type | Meaning |
|---|---|---|
workspace.role | string | author (a taken-over workspace included), review or none. |
workspace.main | bool | The workspace is the repository’s main checkout. |
workspace.pr | string | The linked pull request, owner/repo#number; empty when none. |
workspace.pr_state | string | The linked pull request’s state: OPEN, CLOSED or MERGED; empty when none. |
workspace.pr_finished_for | duration | The linked pull request’s pr.finished_for. |
workspace.path_exists | bool | The worktree path exists. |
workspace.temporary | bool | The worktree lives under a temporary path. |
workspace.duplicate | bool | Neither a main checkout nor the workspace the manager links to its pull request, while another non-main workspace is. |
workspace.dirty | int | Modified tracked files. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
workspace.untracked | int | Untracked files outside cleanup.disposable. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
workspace.unpushed | int | Commits on no remote. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
workspace.newest_turn_state | string | The 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_turn | bool | The 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.pendency | list | What 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.sessions | int | Agent sessions in the workspace that are active, or dormant and active within cleanup.idle. |
workspace.manager | string | The workspace manager that owns the worktree. |
workspace.last_activity | timestamp | The 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_for | duration | Time since last_activity. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
workspace.fingerprint | string | The worktree path and its head. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
workspace.repo | string | owner/repo; empty when unknown. |
Tasks (task.*)
Section titled “Tasks (task.*)”task fact (provider task) | Type | Meaning |
|---|---|---|
task.id | string | The task’s id. |
task.state | string | The 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.unit | string | The 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_provider | string | The provider of task.unit; empty for a task with none. |
task.units | list | The 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_providers | list | The providers of task.units, each once, in order. |
task.unit_kinds | list | The 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_kinds | list | The 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_ended | bool | The 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.turns | int | Turns run on the task itself, such as a start; turns on its units are not counted. |
task.captured_by_user | bool | The 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_me | bool | The 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_posted | bool | A 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_open | int | Open 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_resolved | int | Resolved 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_at | timestamp | When 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_at | timestamp | The newest update of a settled draft the workflow proposed on the task, withdrawn ones included; zero when none. Test with > timestamp(0). |
task.fingerprint | string | The 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.category | string | The 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_by | string | Who 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.turn | string | Whose 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_since | timestamp | Since 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_at | timestamp | When the task, or a unit linked to it, last moved; zero when never. Test with > timestamp(0). |
task.since_movement | duration | Time since the task, or a unit linked to it, last moved: a state change, a source event, a run. |
task.check_on | timestamp | When 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_open | int | The task’s open gates. |
task.decisions | list | The 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_since | timestamp | Since 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_hand | int | The 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_at | timestamp | When the newest of task.turns_open_by_hand was sent; zero when none is open. Test with > timestamp(0). |
task.turns_running | int | The 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_until | timestamp | When 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_when | string | The 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.placement | string | owner/repo of the repository the task’s work runs in: its placement, else its units’ plugin’s; empty when unknown. |
task.sequential_next | bool | The 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_due | bool | The 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_ready | bool | The 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_mine | bool | The 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_age | duration | The 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.askers | list | Who 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_names | list | The 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.promised | timestamp | When 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_lag | duration | How 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_signals | list | The 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.clarified | bool | The 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_pairs | list | The 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.undone | list | The 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.candidates | list | The 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_candidates | list | The 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_tasks | list | The 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_units | list | The 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.title | string | The 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.notes | string | The task’s notes. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
task.link_owes | list | Who 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.stalled | bool | The 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_loop | bool | A 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.ready | bool | The 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.workspace | bool | A 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_reacted | bool | Every 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_last | bool | You 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. |
Pull requests (pr.*)
Section titled “Pull requests (pr.*)”pr fact (provider github) | Type | Meaning |
|---|---|---|
pr.mine | bool | The pull request’s author is the viewer. |
pr.author | string | The pull request’s author login; empty when not stored. |
pr.state | string | The pull request’s state on GitHub: OPEN, CLOSED or MERGED. |
pr.slug | string | owner/repo#number. |
pr.owner | string | The repository owner. |
pr.repo | string | owner/repo. |
pr.repo_name | string | The repository name, without its owner. |
pr.base | string | The base branch. |
pr.association | string | The author’s association with the repository, from the Basics read. |
pr.cross_repository | bool | The head branch lives in a fork. |
pr.visibility | string | The repository’s visibility: public, private or internal, from the Basics read; empty before it. |
pr.requested_teams | list | The teams a review of the pull request was requested through, as |
pr.labels | list | The pull request’s labels, from the Basics read. |
pr.address.reviewers | list | The 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.checks | list | The 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.conflict | bool | The 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.draft | bool | The pull request is a draft, from the inventory row. |
pr.review_requested_me | bool | A review is requested from the viewer, from the inventory row. |
pr.adopted | bool | The pull request was taken over into the loop. |
pr.held | bool | Rounds on the pull request are held. |
pr.nudge.who | list | Whom a nudge would address, from nudge.targets. |
pr.nudge.why | string | Why the pull request waits on them, from nudge.targets. |
pr.nudge.refusal | string | Why 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.exists | bool | The viewer reviewed the pull request before. |
pr.last_review.verdict | string | The viewer’s newest review state, any state; empty when none. |
pr.last_review.decision | string | The viewer’s newest non-comment verdict; empty when none. |
pr.merged_at | timestamp | When the pull request merged; zero when it did not. Test with > timestamp(0). |
pr.closed_at | timestamp | When the pull request closed; zero when open. Test with > timestamp(0). |
pr.finished_for | duration | Working time since it ended, max(merged_at, closed_at), the rule retention uses; zero while open. |
pr.ended | bool | The pull request merged or closed: the GitHub plugin’s word that the unit has ended. |
pr.changed_files | int | How many files the pull request changes, as GitHub last reported it; 0 when not read. |
pr.head | string | The head commit’s oid. |
pr.conflicting_for | duration | How long the pull request has conflicted with its base, from when the inventory first saw it; zero when it does not. |
pr.checks | string | The checks’ rollup on the head: success, failure, pending, error or expected; empty with no checks. |
pr.stalled | bool | The checks stalled on the head. |
pr.age | duration | Time since the pull request opened. |
pr.has_workspace | bool | A linked workspace holds the pull request. |
pr.stale | bool | The stored detail is older than sweep.slow + 2 x sweep.fast. |
pr.open_turn | string | The 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_seq | int | The 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_id | int | The 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.action | string | What 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.reason | string | Why the review rules decide so. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
pr.review.observed | bool | The review rules observe without acting. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
pr.first.due | bool | A first round is due. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
pr.first.reason | string | Why 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.due | bool | An address round is due. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
pr.address.reason | string | Why 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.observed | bool | The 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_at | timestamp | The newest comment, review, push or review request, by anyone. Zero when unset; test with > timestamp(0). |
pr.silent_days | int | Calendar days since last_interaction_at. |
pr.waits_on_user | bool | The 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.fingerprint | string | What 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 conversations (slack.*)
Section titled “Slack conversations (slack.*)”slack fact (provider slack) | Type | Meaning |
|---|---|---|
slack.channel | string | The conversation’s channel id. |
slack.conversation | string | The conversation’s kind: channel, dm or group. |
slack.started_by_me | bool | The viewer started the thread. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
slack.closure_posted | bool | A 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_task | bool | A 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_open | int | Open 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_resolved | int | Resolved 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_unowned | int | Open 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_days | int | Working 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.ended | bool | The 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_at | timestamp | The newest update of a settled draft the workflow proposed on the unit, withdrawn ones included; zero when none. Test with > timestamp(0). |
slack.fingerprint | string | The 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.language | string | The 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.members | list | The 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. |
Briefs (brief.*)
Section titled “Briefs (brief.*)”brief fact | Type | Meaning |
|---|---|---|
brief.goal | string | The 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.risk | string | The 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.kind | string | The 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.size | string | The brief’s size; GitHub briefs only. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
brief.tags | list | The brief’s normalized key:value tags. Untrusted: no [gates.approval] rule of a draft gate, nor one that releases a gate, reads it. |
brief.missing | list | The 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. |
Drafts (draft.*)
Section titled “Drafts (draft.*)”draft fact | Type | Meaning |
|---|---|---|
draft.person_waited | bool | One 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_owed | int | Items of the draft still open and held by any of its people, or unowned for a draft of no people. |
draft.items_assigned | int | Items of the draft that have an owner, someone waited on, or are no longer open. |
draft.unit_open | bool | The draft’s unit still exists: its task is neither done nor in the trash, or its unit is stored. |
draft.person_asks_you | bool | Every 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_outside | int | The 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_joined | bool | The 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. |
Gates (gate.*)
Section titled “Gates (gate.*)”gate fact | Type | Meaning |
|---|---|---|
gate.kind | string | The gate’s kind: draft, plan, question, post, proposal, trust or step. |
gate.name | string | The gate’s name in gates.toml; empty for a gate of no profile name. |
gate.status | string | The gate’s status: open, approved, rejected, answered, dismissed or superseded. |
gate.delivery | string | A draft gate’s delivery state, such as sending or failed; empty for any other gate. |
Triggers (trigger.*)
Section titled “Triggers (trigger.*)”trigger fact | Type | Meaning |
|---|---|---|
trigger.kind | string | sweep, event or schedule. |
trigger.event.kind | string | The event’s kind; empty unless kind is event. |
trigger.event.key | string | The event’s key. |
trigger.event.id | int | The event’s id, unique and growing; 0 unless kind is event. |
trigger.event.data | string | The 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_at | timestamp | When the schedule fired; zero unless kind is schedule. Test with > timestamp(0). |
The configuration (config.*)
Section titled “The configuration (config.*)”config fact | Type | Meaning |
|---|---|---|
config.cleanup.idle | duration | The cleanup.idle setting. |
config.cleanup.asked_idle | duration | The cleanup.asked_idle setting. |
config.cleanup.workspace_grace | duration | The cleanup.workspace_grace setting, in working time. |
config.cleanup.manual_idle | duration | The cleanup.manual_idle setting. |
config.cleanup.stale_workspace | duration | The cleanup.stale_workspace setting. |
config.plugins.github.nudge.silent_days | int | The plugins.github.nudge.silent_days setting, in calendar days. |
config.tasks.stale_waiting_days | int | The tasks.stale_waiting_days setting, in working days. |
config.drafts.repeat_after | duration | The drafts.repeat_after setting. |
config.turns.per_day | int | The turns.per_day setting: automated turns on units whose plugin keeps no per-unit count, all workflows together. |
Draft approval facts
Section titled “Draft approval facts”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 fact | Type | Meaning |
|---|---|---|
draft.delivery | string | How 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.proposer | string | What proposed the draft: workflow: |
draft.effects | list | The 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.purpose | string | The 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. |
Workflow steps
Section titled “Workflow steps”The steps a [[step]] may name with use. wloop workflows steps prints them with their arguments.
| Step | Unit | Does |
|---|---|---|
session.close | session | Closes the agent session. |
workspace.remove | workspace | Removes the workspace, after its guards. Never with force: a manifest that sets it fails to load. |
workspace.unregister | workspace | Unregisters a workspace whose path is gone. |
turn.dismiss | session, github | Dismisses the open turn, recording the reason. |
answer.refuse | github | Refuses a queued answer whose route is gone. |
session.mark_dormant | session | Marks 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_orphan | session | Side 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.start | any | Starts 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.propose | any | Proposes 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. |
classify | any | A 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.self | any | A 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.verb | task | Runs 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.open | any | Opens the gate name of gates.toml on the unit, a decision that waits for you with the intents gates.toml gives it. |
items.resolve | task | Resolves 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.set | task | Sets the task’s property prop of tasks.toml to value, written by the workflow; a property the workflow may not write is refused. |
Draft effects
Section titled “Draft effects”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.
| Effect | Unit | Does |
|---|---|---|
plan.cleared | any | Drops the unit’s pending plan items. |
turn.guidance_handed | any | Hands the guidance queued on the unit to the turn, and queues it back when the turn is not sent. |
turn.round_sent | any | Records the round-sent event on the unit when a person sends the turn. |
task.nudged | any | Writes 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.closed | any | Records 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.reviewed | github | Writes the plugin mark reviewed: the reviews the round covered, once its review is submitted. |
pr.addressed | github | Writes the plugin marks addressed.*: the reviews, checks and conflict the address round covered. |
pr.nudged | github | Records 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]].
| Mark | Unit | Covers |
|---|---|---|
addressed.reviews | github | The newest review an address round triaged on a pull request you develop, a time: handled("addressed.reviews", <time>). |
addressed.checks | github | The head whose failing checks an address round covered: handled("addressed.checks", pr.head). |
addressed.conflict | github | The 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.