aboutsummaryrefslogtreecommitdiff
path: root/.ai/workflows/triage-intake.github-prs.org
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-05-26 01:57:48 -0500
committerCraig Jennings <c@cjennings.net>2026-05-26 01:57:48 -0500
commitf9c72c817290bb5433e593b2a8d1cfaa25431d20 (patch)
treefed103aec3faf75624a2a969fd67dea71e501a4d /.ai/workflows/triage-intake.github-prs.org
parent98382929852b213f8dc8b1ba720cc0d1861159b6 (diff)
downloadrulesets-f9c72c817290bb5433e593b2a8d1cfaa25431d20.tar.gz
rulesets-f9c72c817290bb5433e593b2a8d1cfaa25431d20.zip
refactor(workflows): split triage-intake into engine + source plugins
The triage-intake workflow had every source baked into one file, so adding or changing a source meant editing the workflow itself. I replaced it with a source-agnostic engine plus per-source plugins named triage-intake.<source>.org. The engine carries the anchor/sentinel logic, the four-bucket model, the Phase A-D orchestration, the todo.org persistence convention, and the exit criteria. Each source's scan, classify, render, and action knowledge moved into its own plugin. Four general plugins ship in the template: personal-gmail, personal-calendar, cmail, and github-prs. Project-specific sources live in the project's .ai/project-workflows/ and are never synced. Phase 0 globs both directories so a project source can't silently drop out of the sweep. I taught INDEX.org and the startup workflow-discovery drift check the namespace. A file matching <engine>.*.org is a plugin of that engine, not an orphan, and gets no trigger entry of its own. A "run the triage-intake workflow" request routes to the engine, never to a plugin.
Diffstat (limited to '.ai/workflows/triage-intake.github-prs.org')
-rw-r--r--.ai/workflows/triage-intake.github-prs.org71
1 files changed, 71 insertions, 0 deletions
diff --git a/.ai/workflows/triage-intake.github-prs.org b/.ai/workflows/triage-intake.github-prs.org
new file mode 100644
index 0000000..c1bc796
--- /dev/null
+++ b/.ai/workflows/triage-intake.github-prs.org
@@ -0,0 +1,71 @@
+#+TITLE: Triage Intake — Personal GitHub PRs Source
+#+AUTHOR: Craig Jennings & Claude
+#+DATE: 2026-05-26
+
+# Source plugin for the triage-intake engine. See triage-intake.org for the
+# contract and the Phase A-D orchestration. This file declares ONE source.
+#
+# This is the GENERAL (github.com) PR source. A work project on GitHub
+# Enterprise declares its own triage-intake.<work>-prs.org plugin with
+# --hostname and its own repos/conventions; it does not edit this file.
+
+* Source: github-prs
+:PROPERTIES:
+:ORDER: 40
+:ENABLED: command -v gh && gh auth status
+:ANCHOR: iso8601
+:SUBAGENT_OVER: 40
+:END:
+
+** Scan
+
+Open PRs needing Craig's attention across his personal GitHub projects. Two queries — PRs returns *state*, so the anchor is advisory (the engine substitutes =<anchor-iso8601>= into the optional =--updated= filter for recency; open-PR state is the real signal):
+
+#+begin_src bash
+# PRs Craig opened
+gh search prs --author=@me --state=open \
+ --json number,title,repository,state,isDraft,updatedAt,url
+
+# PRs awaiting Craig's review
+gh search prs --review-requested=@me --state=open \
+ --json number,title,repository,state,isDraft,updatedAt,url
+#+end_src
+
+=@me= resolves to the authenticated personal GitHub account, so no username is hardcoded. Add =--owner <account-or-org>= to scope to specific personal projects when the full-account search is too broad.
+
+=gh search prs= can't return =reviewDecision= or CI status. For the handful that survive Phase B as Action candidates, drill in per-PR:
+
+#+begin_src bash
+gh pr view <N> --repo <repo> --json reviewDecision,statusCheckRollup,mergeable
+#+end_src
+
+** Classify
+
+Action items, in priority order:
+
+- *Craig's PRs that are mergeable* — approved, or no review required on a solo project, with CI green and no outstanding CHANGES_REQUESTED.
+- *Craig's PRs with CHANGES_REQUESTED* — needs his response: rework and re-request, or push back with reasoning.
+- *PRs awaiting Craig's review* — review requested from him, or new commits since his last review on a PR he's reviewing.
+- *@mentions on any PR* — explicit ask.
+
+FYI: approval landings with no remaining action, merge events on PRs already shipped, comments without questions.
+
+Noise: stale draft updates, bot/CI status pings.
+
+** Render
+
+#+begin_example
+**PRs (<repo or "personal">) — N open.**
+- Mergeable now: <list>
+- Changes requested on yours: <list>
+- Review owed: <list>
+#+end_example
+
+Omit if nothing open needs attention.
+
+** Actions
+
+- merge :: =gh pr merge <N> --repo <repo> --squash --delete-branch= when no other PR stacks on the branch (verify via =gh pr list --repo <repo> --search "base:<branch-name>"=). If something stacks, =--squash= without =--delete-branch= and rebase the dependent PR afterward.
+- comment :: =gh pr comment <N> --repo <repo>=
+- review :: =gh pr review <N> --repo <repo>= (per Craig's call — approve / request-changes / comment)
+- branch-clean :: =git push origin --delete <branch>= when the merge happened earlier and only branch deletion remains.