Skip to content

docs(harnesses): summarize the 2026 landscape of AI agent harnesses (closes #95) #325

docs(harnesses): summarize the 2026 landscape of AI agent harnesses (closes #95)

docs(harnesses): summarize the 2026 landscape of AI agent harnesses (closes #95) #325

# Thin caller for the shared reusable workflow in Morrison-Lab/gha.
#
# This used to be a hand-rolled copy of the review job (the "qwt" Quarto
# website template's original version, before gha's reusable workflow was
# ported FROM it -- see gha's own claude-code-review.yml header). That copy
# never got migrated to consume its own canonical port, so it carried two
# config gaps the gha version has since fixed centrally: the plugin's own
# `/code-review` command needs `gh pr list`/`gh issue view`/`gh issue list`/
# `gh search` (its declared `allowed-tools`, not just view/diff/comment) or
# its 4 parallel sub-agents rack up permission denials; and having the AGENT
# itself call `gh pr comment` is fragile -- gha's version denies that tool
# outright and has the WORKFLOW post the review from the agent's final
# message instead, plus a same-run retry when a stub (no verdict) is
# detected. Both were root causes of the repeated stub reviews on #48/#49.
#
# See https://github.com/Morrison-Lab/gha for inputs and versioning.
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]
# Allow claude.yml to dispatch a fresh review (e.g. after an @claude run
# pushes commits, or on an `@claude review` comment). GITHUB_TOKEN pushes
# don't fire `synchronize`, so an explicit dispatch path is needed.
workflow_dispatch:
inputs:
pr_number:
description: 'Pull request number to review'
required: true
type: number
jobs:
# Keep the job id (claude-review) matching the previous standalone workflow
# so the status-check context doesn't change, per this repo's own
# convention (see check-links.yml, check-bibliography-dois.yml,
# check-non-standard-chars.yaml).
claude-review:
permissions:
contents: read
pull-requests: write
issues: write
id-token: write # required by claude-code-action for the App-token
# exchange it performs even with OAuth auth
actions: read # lets the reviewer read CI/check-run status
uses: Morrison-Lab/gha/.github/workflows/claude-code-review.yml@v2
secrets:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} # empty; this repo uses OAuth
SUBMODULES_TOKEN: ${{ secrets.SUBMODULES_TOKEN }} # empty; the macros submodule is public
with:
# Wires the workflow_dispatch input through so claude.yml can re-dispatch
# a review on Claude's own commits; empty (and ignored) on pull_request
# runs.
pr-number: ${{ inputs.pr_number }}
# This repo vendors the macros submodule; the previous standalone
# workflow checked it out (`submodules: recursive`) so the reviewer
# could read its contents instead of reporting it as uninitialized.
checkout-submodules: true
prompt-addendum: |
In addition to the standard checks above, this is the qwt Quarto
website template -- small, prose-heavy, and re-used as a template
for downstream books -- so also prioritize:
1. **Quarto / prose correctness**
- `.qmd` syntax: chunk options use `#|` directives, fenced
blocks are balanced, cross-refs (`@fig-`, `@tbl-`, `@sec-`)
resolve to defined labels.
- Bullet-list rule: 3+ items use bullets with a blank line above.
- `code-fold: true` is used on chunks where the output (not the
code) is the point, and avoided on tutorial code.
2. **R code**
- Conforms to `.lintr.R` settings (snake_case, line length, etc.).
- No new package dependencies without justification -- every
dependency added here lands in every downstream book.
3. **Build hygiene**
- No accidental commits of `_site/`, `_freeze/`, or `.quarto/`.
- `README.md` is generated; edits should go to `README.Rmd`.
- Bibliography entries in `references.bib` are well-formed BibTeX.
4. **CI / template impact**
- Workflow changes don't break the `copilot-setup-steps.yml`
contract or the publish/preview pipelines.
- Spell-check / link-check failures are fixed at the source
(wordlist or content) rather than suppressed.