OptionalactionOptionalactionAll applicable action reasons, ordered by priority. Primary reason is first.
OptionalattentionUnified attention bucket (#1352), computed by classifyAttentionBucket()
from status/ciStatus/reviewDecision/daysSinceActivity. Stamped by the
dashboard data path so the SPA renders the same taxonomy the CLI brief
counts. Optional: absent on payloads from older producers.
OptionalauthorContributor issue comments posted after lastMaintainerActivityAt (unanswered pings).
OptionalbaseTarget branch name (e.g., "main", "master").
OptionalchecklistAggregate 5-state CI categorization (#1272). Derived from ciStatus,
failingCheckNames, and classifiedChecks via categorizeCIStatus()
— agents read this directly instead of re-deriving the truth table.
Always populated on a fresh fetch (v2 architecture has no cached
FetchedPR to migrate); pr-monitor's fetchPRDetails sets it on
every PR before construction.
Failing checks with category classification (#81). Separates actionable failures from fork limitations and auth gates.
OptionalcommitsHow many commits the PR branch is behind the base branch.
Calendar days since the most recent activity of any kind (updatedAt),
including the contributor's own comments, pushes and rebases. Used for
follow-up timing (don't nudge right after a ping) and stale-CI demotion.
NOT used for stalenessTier; see daysSinceMaintainerActivity.
OptionaldaysCalendar days since lastMaintainerActivityAt. This is the dormancy
clock: stalenessTier is computed from it, so the contributor's own
pings and rebases no longer keep an ignored PR "active".
Brief description of what's happening (#79). E.g., "3 checks failed", "@maintainer commented".
Human-readable status label for consistent display (#79). E.g., "[CI Failing]", "[Needs Response]".
Names of failing CI checks. Useful for distinguishing real CI failures from validation bots.
OptionalfirstEarliest maintainer (non-bot, non-contributor) comment or review on this PR (#1461). Computed by fetchPRDetails from the comment/review timeline it already fetches. Persisted with the digest's openPRs so merge/close detection can recover it for the outcome ledger after the PR leaves the open set. Undefined when no maintainer has responded yet.
True when the PR body contains unchecked required checkboxes.
True when a maintainer commented after the contributor's last comment or commit.
OptionalheadOptionalissueIssue the PR closes, parsed from the first closing keyword in its body
(same closingIssueUrl the merged/closed ledger uses, #1824). Lets the
daily run tell a closed PR that was superseded by a still-open PR on the
same issue from one whose work really ended (#1863). Undefined when the
body has no closing keyword.
OptionallastTimestamp of the latest maintainer activity, or createdAt when there is
none (see getLastMaintainerActivity). Maintainer activity is: an issue
comment by an OWNER / MEMBER / COLLABORATOR (any non-contributor non-bot
author when the association is unknown); a review or inline review
comment by any non-contributor non-bot user; a commit or force-push by
someone else, including a maintainer's GitHub App but not auto-fixer or
dependency bots; a review request or label by a non-contributor non-bot.
Optional: absent on payloads from older producers.
OptionallastOptionallatestISO timestamp of the latest commit. Used to determine if changes were pushed after review feedback.
OptionallocalAbsolute path to local clone, if the repo is cloned on this machine.
Hints extracted from maintainer comments about what actions they are requesting.
OptionalmentionedEvery issue or PR the title and body mention, closing keyword or not
(#12, owner/repo#12, issue or pull URL), as canonical issue URLs
(mentionedIssueUrls, #1863). Widens the supersede check: a follow-up
PR that says "supersedes #8" or "another take on #12" counts as the
successor of a closed PR even without Fixes #12. Parsed at assembly
time so the daily run needs no extra API calls; empty when nothing is
mentioned.
OptionalmissingRequired files the PR is missing (e.g., ["changeset", "CLA"]).
How stale the PR is, from daysSinceMaintainerActivity (not the contributor's own activity). Independent of status — a PR can be both needs_addressing and dormant.
Computed by determineStatus() based on the fields below.
OptionalwaitGranular reason for waiting_on_maintainer status. Undefined when needs_addressing.
Granular reason for needs_addressing status. Undefined when waiting_on_maintainer.