Skip to content

ci(skillsaw): add lint job, Makefile targets, and repo config - #754

Merged
ralphbean merged 16 commits into
mainfrom
skillsaw/onboard-ci
Aug 31, 2026
Merged

ci(skillsaw): add lint job, Makefile targets, and repo config#754
ralphbean merged 16 commits into
mainfrom
skillsaw/onboard-ci

Conversation

@ralphbean

Copy link
Copy Markdown
Member

Adds a skillsaw job to the lint workflow, running the linter in
--strict mode on every PR and push to main. Adds make lint and
make lint-fix targets so contributors can run the same checks
locally. Adds .skillsaw.yaml, tuned for this repo:

  • Disables marketplace-json-valid and marketplace-registration.
    plugins/gopls-lsp is an internal fullsend harness plugin config
    (see harness/code.yaml), not a Claude Code marketplace plugin, so
    these rules produced false positives.
  • Raises the context-budget skill thresholds to warn 16000 / error
    20000, above code-implementation and pr-review's current sizes.
    Both are dense, production-tuned orchestration procedures; --strict
    turns warnings into failures, so the thresholds are set high enough
    that neither file triggers a violation at either severity.

This builds on the skill content fixes in the preceding PRs in this
stack, evaluating skillsaw per #188.

Related to #188

Assisted-by: Claude Opus 4.6 noreply@anthropic.com
Signed-off-by: Ralph Bean rbean@redhat.com


Stack created with GitHub Stacks CLIGive Feedback 💬

@ralphbean
ralphbean requested a review from a team as a code owner August 11, 2026 16:59
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

CI: run skillsaw lint in strict mode and add local Make targets

⚙️ Configuration changes ✨ Enhancement 🕐 20-40 Minutes

Grey Divider

AI Description

• Add a skillsaw lint job to GitHub Actions and fail builds on warnings via strict mode.
• Introduce repo-specific .skillsaw.yaml to avoid false positives and tune context limits.
• Add make lint and make lint-fix to run the same checks locally.
Diagram

graph TD
  A["GitHub Actions: lint.yml"] --> B["skillsaw action (--strict)"] --> C["Repo files (skills/agents/etc)"]
  B --> D[".skillsaw.yaml"]
  E["Makefile targets"] --> F["uvx skillsaw==0.18.0"] --> C
  F --> D
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Run skillsaw CLI in CI (uvx) instead of GitHub Action
  • ➕ Single execution path between local make lint and CI (same packaging/runtime)
  • ➕ Easier to pin and audit the exact skillsaw version used end-to-end
  • ➖ Requires installing uv/uvx in CI and managing caching
  • ➖ More scripting/maintenance in the workflow compared to a dedicated action
2. Start non-strict in CI, then flip to strict after baseline
  • ➕ Avoids PR failures from newly surfaced warnings during rollout
  • ➕ Can progressively tighten rules/thresholds as content evolves
  • ➖ Delays enforcement of the intended quality gate
  • ➖ Requires follow-up work to ratchet strictness

Recommendation: The PR’s approach (dedicated skillsaw action with strict: true, plus local Make targets) is a good balance of simplicity and enforcement. The main thing to keep an eye on is version drift: local lint pins skillsaw==0.18.0 while the action is pinned by commit but configured separately; if mismatches become an issue, consider converging on one execution path (either all-action or all-CLI).

Files changed (3) +358 / -1

Enhancement (1) +11 / -1
MakefileAdd 'make lint' and 'make lint-fix' using pinned skillsaw version +11/-1

Add 'make lint' and 'make lint-fix' using pinned skillsaw version

• Adds 'lint' and 'lint-fix' phony targets and documents them in the help output. Uses 'uvx skillsaw==0.18.0' to run strict linting and apply automated fixes locally.

Makefile

Other (2) +347 / -0
lint.ymlAdd strict skillsaw lint job to CI workflow +10/-0

Add strict skillsaw lint job to CI workflow

• Introduces a new 'skillsaw' job in the lint workflow. The job checks out the repo and runs the 'stbenjam/skillsaw' action with strict mode enabled, causing warnings to fail CI.

.github/workflows/lint.yml

.skillsaw.yamlAdd repo-specific skillsaw rules and thresholds +337/-0

Add repo-specific skillsaw rules and thresholds

• Adds a full skillsaw configuration file pinned to version 0.18.0. Disables marketplace-related rules that are false positives for this repo and raises the 'context-budget' thresholds for dense skill files while keeping CI strictness enforced via the workflow.

.skillsaw.yaml

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 5:01 PM UTC · Completed 5:17 PM UTC

Commit: 8ef7855 · View workflow run →

@qodo-code-review

qodo-code-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Workflow lint.yml modified ✗ Dismissed 📜 Skill insight § Compliance
Description
This PR modifies a protected governance/infrastructure path (.github/workflows/lint.yml), which
must not be auto-approved and requires explicit human review/approval controls.
Code

.github/workflows/lint.yml[R14-17]

+  skillsaw:
+    runs-on: ubuntu-24.04
+    steps:
+      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
Relevance

●●● Strong

Changes under .github/workflows are routinely reviewed; governance finding will be kept to force
human approval.

PR-#37

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The checklist requires raising a finding whenever protected governance/infrastructure paths
(including .github/) are modified. The diff adds a new skillsaw job in
.github/workflows/lint.yml, triggering the protected-path rule.

.github/workflows/lint.yml[13-23]
Skill: pr-review

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Protected-path changes (under `.github/`) require explicit human review and should carry clear justification close to the change.

## Issue Context
This PR adds a new CI job to `.github/workflows/lint.yml`, which is a protected governance/infrastructure path.

## Fix Focus Areas
- .github/workflows/lint.yml[14-23]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Strict mode mismatch ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
.skillsaw.yaml documents “Treat warnings as errors” but sets strict: false, while CI and `make
lint` run skillsaw in strict mode. This makes the checked-in config misleading and allows local
invocations (without the Makefile/CI wrapper) to produce different results than CI.
Code

.skillsaw.yaml[R336-337]

+# Treat warnings as errors
+strict: false
Relevance

●●● Strong

Doc/config mismatch vs actual strict CI behavior; similar docs-implementation mismatch fixes were
accepted.

PR-#567

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The config contradicts itself and differs from how skillsaw is invoked in both CI and the Makefile,
which is directly observable from the repo contents.

.skillsaw.yaml[336-337]
.github/workflows/lint.yml[20-22]
Makefile[20-24]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`.skillsaw.yaml` says it will treat warnings as errors, but it sets `strict: false` while CI/Makefile run skillsaw with strict enabled. This is misleading and can cause local runs (when developers run `skillsaw` directly) to diverge from CI.

## Issue Context
- CI runs skillsaw with strict mode enabled.
- The Makefile `lint` target runs skillsaw with `--strict`.
- The config file claims strict behavior but disables it.

## Fix Focus Areas
- .skillsaw.yaml[336-337]
- .github/workflows/lint.yml[20-22]
- Makefile[20-24]

## Suggested fix
Choose one of the following and make everything consistent:
1) **Config-driven strict**: set `.skillsaw.yaml` to `strict: true` and remove `--strict` / action `strict: true` overrides (or keep overrides but update comments accordingly).
2) **Caller-driven strict (current behavior)**: keep `strict: false` in `.skillsaw.yaml`, but update the comment to reflect that strictness is enabled by CI/Makefile (not by the config file itself).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. .skillsaw.yaml indentation inconsistent ✓ Resolved 📜 Skill insight ⚙ Maintainability
Description
The new .skillsaw.yaml uses inconsistent indentation under exclude: compared to other YAML in
the same directory, increasing the chance of style drift and review friction.
Code

.skillsaw.yaml[R328-331]

+exclude:
+    # - "**/template/**"
+    # - "**/templates/**"
+    # - "**/_template/**"
Relevance

●●● Strong

Trivial YAML style consistency nit; team often accepts config-structure/style alignment suggestions.

PR-#573

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The checklist requires new/modified YAML config files to match the style of existing files in the
same directory. config.yaml demonstrates 2-space indentation, while .skillsaw.yaml shows 4-space
indentation under exclude:.

.skillsaw.yaml[326-332]
config.yaml[1-11]
Skill: code-implementation

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The `.skillsaw.yaml` file has inconsistent indentation under `exclude:` compared to existing root-level YAML style.

## Issue Context
Root-level YAML (e.g., `config.yaml`) uses 2-space indentation; `.skillsaw.yaml` uses 4 spaces for the commented list under `exclude:`.

## Fix Focus Areas
- .skillsaw.yaml[328-332]
- config.yaml[1-11]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 55 rules
✅ Skills: 4 invoked
  code-review
  code-implementation
  pr-review
  docs-review

Grey Divider

Tip of the day
💡 Did you know, you can type 'qodo, fix this' on a finding and the fix lands right on your PR

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread .github/workflows/lint.yml
Comment thread .skillsaw.yaml Outdated
Comment thread .skillsaw.yaml Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review

Findings

Medium

  • [protected-path] .github/scripts/check-skillsaw-version.sh, .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 9 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale (skillsaw CI onboarding and related content fixes). Human approval is always required for protected-path changes, regardless of context.

Low

  • [edge-case] Makefile:7SKILLSAW_VERSION extraction uses grep '^version:' .skillsaw.yaml | sed 's/version: "\(.*\)"/\1/'. If the version line format in .skillsaw.yaml changes (single quotes, no quotes, or extra whitespace), the sed pattern silently produces an empty string, causing uvx skillsaw@ to be invoked with no version specifier — which would install the latest version rather than the pinned version. The CI check script (check-skillsaw-version.sh) guards for empty output, but the Makefile targets (lint, lint-fix, lint-baseline) do not.
    Remediation: Add a guard, e.g., ifeq ($(SKILLSAW_VERSION),)\n$(error Could not extract skillsaw version from .skillsaw.yaml)\nendif.

  • [edge-case] .github/scripts/check-skillsaw-version.sh:5 — The sed pattern extracts all matching lines from lint.yml. If a future edit adds a second stbenjam/skillsaw@ reference, workflow_ref would contain two newline-separated SHAs and the string comparison would always fail. Currently only one reference exists.

  • [style-consistency] AGENTS.md:139 — The markdown link wrapping introduces a double closing parenthesis: [`harness/review.yaml`](harness/review.yaml)) — the trailing ) from the original parenthetical now follows the link's closing ), producing )).
    Remediation: Restructure the sentence to avoid nesting a markdown link inside a parenthetical.

  • [style-consistency] AGENTS.md:161 — The possessive 's is appended directly after the link closing bracket: [`harness/code.yaml`](harness/code.yaml)'s. Renders correctly but is an unusual construction.

  • [style-consistency] CONTRIBUTING.md:38 — The replacement bullet packs five pieces of information (two CI check names, local invocation, lint-fix shortcut, and baseline regeneration) into one long sentence. Surrounding bullets in the "Opening a PR" section are each 1–2 concise sentences.
    Remediation: Split into separate bullets or a sub-list.

  • [scope-creep] agents/triage.md:1 — Frontmatter field order changed and comment text updated from "profile binary allowlist (profiles/fullsend-github-ro.yaml)" to "network policy binary allowlist (policies/github/triage.yaml)". The comment correction is factually accurate. Both changes are tangential to the CI scope but minor.

  • [scope-creep] AGENTS.md:136 — Two bare backtick-quoted file references converted to markdown links, driven by skillsaw's content-unlinked-internal-reference rule.

  • [incomplete documentation] FEATURES.md:185 — The step 12 review checklist says make test but does not mention make lint, which this PR adds as a CI-enforced check. CONTRIBUTING.md was updated but FEATURES.md was not.
    Remediation: Add a checklist item for make lint to the FEATURES.md review checklist.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

Medium

  • [protected-path] .github/scripts/check-skillsaw-version.sh, .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 9 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale (skillsaw CI onboarding and related content fixes). Human approval is always required for protected-path changes, regardless of context.

Low

  • [edge-case] Makefile:7SKILLSAW_VERSION extraction uses grep '^version:' .skillsaw.yaml | sed 's/version: "\(.*\)"/\1/'. If the version line format in .skillsaw.yaml changes (single quotes, no quotes), the sed pattern silently produces an empty string, causing uvx skillsaw@ to be invoked with no version specifier. The CI check script (check-skillsaw-version.sh) guards for empty output, but the Makefile does not.
    Remediation: Add a guard, e.g., $(if $(SKILLSAW_VERSION),,$(error SKILLSAW_VERSION could not be parsed from .skillsaw.yaml)).

  • [edge-case] .github/scripts/check-skillsaw-version.sh:11 — The sed pattern extracts all matching lines from lint.yml. If a future edit adds a second stbenjam/skillsaw@ reference, workflow_ref would contain two SHAs and the comparison would silently fail. Currently only one reference exists.

  • [style-consistency] AGENTS.md:139 — The markdown link wrapping introduces a double closing parenthesis: [`harness/review.yaml`](harness/review.yaml)) — the trailing ) from the original parenthetical now follows the link's closing ).
    Remediation: Restructure the sentence to avoid nesting a markdown link inside a parenthetical.

  • [style-consistency] AGENTS.md:161 — The possessive 's is appended directly after the link closing bracket: [`harness/code.yaml`](harness/code.yaml)'s. Renders correctly but is an unusual construction.

  • [style-consistency] CONTRIBUTING.md:38 — The replacement bullet packs five pieces of information (pre-commit checks, make lint, running both locally, make lint-fix, and its purpose) into one dense sentence. Surrounding bullets are 1–2 concise sentences.

  • [naming-conventions] .github/workflows/lint.yml:14 — The new CI job is named skillsaw (the external tool's name). Existing jobs use descriptive functional names (test, commit-lint).

  • [incomplete documentation] FEATURES.md:183 — The step 12 review checklist says make test but does not mention make lint, which this PR adds as a CI-enforced check. CONTRIBUTING.md was updated but FEATURES.md was not.
    Remediation: Add a checklist item for make lint.

  • [scope-creep] agents/triage.md:1 — Frontmatter field order changed (skills/tools/model reordered). Pure field-ordering change with no semantic effect; authorization from issue scope is unclear.

  • [scope-creep] AGENTS.md:136 — Two bare backtick-quoted file references converted to markdown links, likely driven by skillsaw's content-unlinked-internal-reference rule. The PR description says content fixes are in preceding PRs in the stack.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (2)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 8 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale (skillsaw CI onboarding and related content fixes). Human approval is always required for protected-path changes, regardless of context.

Low

  • [version-drift] .github/workflows/lint.yml:18 — The CI workflow pins skillsaw by commit SHA while the Makefile reads the version from .skillsaw.yaml. Both sides document the coupling (CI comment: "Version pinned to match .skillsaw.yaml"; Makefile comment: "Source of truth: .skillsaw.yaml version field"), but there is no automated consistency check. When .skillsaw.yaml is bumped, the CI SHA must be manually updated to match.

  • [edge-case] Makefile:7 — The SKILLSAW_VERSION extraction uses grep '^version:' .skillsaw.yaml | sed 's/version: "\(.*\)"/\1/'. If the version: line format in .skillsaw.yaml changes (single quotes, no quotes), the sed pattern silently fails and SKILLSAW_VERSION becomes the raw unparsed line. Works correctly today with double quotes.

  • [style-consistency] AGENTS.md:139 — The markdown link wrapping introduces a double closing parenthesis: [`harness/review.yaml`](harness/review.yaml)) — the trailing ) from the original parenthetical now follows the link's closing ).

  • [style-consistency] AGENTS.md:161 — The possessive 's is appended directly after the link closing bracket: [`harness/code.yaml`](harness/code.yaml)'s. Consider rephrasing to avoid attaching a possessive to a link.

  • [incomplete documentation] FEATURES.md:183 — The step 12 review checklist says make test but does not mention make lint, which this PR adds as a CI-enforced check. CONTRIBUTING.md was updated to mention both checks, but FEATURES.md was not.

Previous run (3)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 8 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale (skillsaw CI onboarding and related content fixes). Human approval is always required for protected-path changes, regardless of context.

Low

  • [edge-case] Makefile:9 — The SKILLSAW_VERSION extraction uses grep '^version:' .skillsaw.yaml | sed 's/version: "\(.*\)"/\1/'. If the version: line format in .skillsaw.yaml changes (single quotes, no quotes), the sed pattern silently fails and SKILLSAW_VERSION becomes the raw unparsed line. Works correctly today with double quotes.

  • [scope-creep] skills/fix-review/SKILL.md — Content condensed from ~475 to ~245 lines (~262 deletions, ~32 additions). Commit history confirms the condensation is driven by skillsaw's context-budget rule (fix(skillsaw): add trigger phrasing and reduce fix-review token count), tracing to the PR's linter adoption scope (Evaluate skillsaw for linting agent instructions #188). The procedural steps and behavioral contracts are preserved in the condensed form.

  • [frontmatter field ordering] agents/triage.md:5 — Frontmatter field order changed from (name, description, skills, tools, model) to (name, description, model, tools, skills). The curl comment is now visually separated from the tools field it documents.

  • [incomplete documentation] FEATURES.md:183 — The step 12 review checklist says make test but does not mention make lint, which this PR adds as a CI-enforced check. CONTRIBUTING.md was updated to mention both checks, but FEATURES.md was not.

Previous run (4)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 8 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale (skillsaw CI onboarding and related content fixes). Human approval is always required for protected-path changes, regardless of context.

Low

  • [scope-creep] skills/fix-review/SKILL.md — Content condensed from ~475 to ~245 lines (~262 deletions, ~32 additions). Commit history confirms the condensation is driven by skillsaw's context-budget rule (fix(skillsaw): add trigger phrasing and reduce fix-review token count), tracing to the PR's linter adoption scope (Evaluate skillsaw for linting agent instructions #188). The procedural steps and behavioral contracts are preserved in the condensed form.
Previous run (5)

Review

Findings

High

  • [tool-removal-regression] agents/triage.md:8 — The PR drops ,Skill from the triage agent’s tools: frontmatter field. Base branch has tools: Bash(gh,curl,jq),Skill but PR head has tools: Bash(gh,curl,jq). The triage agent lists issue-labels in its skills: array and requires the Skill tool to invoke it at runtime. This appears to be a rebase/merge artifact from the frontmatter reordering that silently drops the Skill tool.
    Remediation: Restore the Skill tool — change tools: Bash(gh,curl,jq) to tools: Bash(gh,curl,jq),Skill.

Medium

  • [protected-path] agents/triage.md, .github/workflows/lint.yml, AGENTS.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 8 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale for each change. Human approval is required for all protected-path changes regardless of context.

Low

  • [scope-creep] skills/fix-review/SKILL.md — Content condensed from ~3,937 tokens to under 3,000 tokens (-262/+32 lines) to satisfy skillsaw’s context-budget lint rule. All procedural steps are preserved; this is a direct consequence of adopting the linter.

  • [Makefile-variable-extraction] Makefile:7SKILLSAW_VERSION extraction uses grep + sed to parse .skillsaw.yaml, which will silently produce an empty string if the YAML formatting changes (e.g., single quotes, no quotes). The uvx skillsaw@ invocation would fail immediately in that case, limiting blast radius.

  • [CI-job-structure] .github/workflows/lint.yml — The new skillsaw job omits timeout-minutes. The existing test and commit-lint jobs in the same file also lack it, so this is consistent with the file’s current pattern.

  • [scope-creep] skills/github-forge/SKILL.md — Four skill SKILL.md files have descriptions reworded to “Use when...” pattern to fix skillsaw agentskill-description lint violations. Direct consequence of adopting the linter; no behavioral change.

  • [skill-description-consistency] skills/issue-labels/jira/SKILL.md:3 — The Jira variant omits the “or when delegated to by the review or triage agent” clause present in the GitHub and GitLab variants’ descriptions. Pre-existing inconsistency, not introduced by this PR.

  • [scope-creep] AGENTS.md — Two bare path references converted to markdown links, fixing skillsaw content-unlinked-internal-reference lint violations. Cosmetic and non-behavioral.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (6)

Review

Findings

High

  • [logic-error] agents/triage.md:406 — The skill reference in the output rules section was changed from issue-labels to github: "If you have label recommendations from the github skill." This is incorrect. The github skill (skills/github-forge/SKILL.md, name: github) provides GitHub CLI commands for interacting with repositories — it does not produce label recommendations. The correct skill is issue-labels (skills/issue-labels/{github,gitlab,jira}/SKILL.md, all with name: issue-labels). The triage agent's own frontmatter still lists skills: - issue-labels, and the "Label recommendations" paragraph earlier in the file still correctly references the issue-labels skill — creating an internal contradiction.
    Remediation: Revert the change on this line to: "If you have label recommendations from the issue-labels skill, include them in the label_actions field."

Medium

  • [protected-path] .github/workflows/lint.yml, AGENTS.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md — This PR modifies 8 files under protected paths (.github/, AGENTS.md, agents/, skills/). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

Low

  • [scope-creep] skills/fix-review/SKILL.md — The PR performs a substantial condensation of this file (−262/+32 lines). While this may be motivated by skillsaw's context-budget rule to bring the file under token limits, the connection is not documented in the PR description, and the file does not appear in the baseline. The PR description acknowledges this is part of a "PR stack preceded by skill content fixes," suggesting this work may belong in its own PR.

  • [scope-creep] skills/github-forge/SKILL.md — The PR rewrites the description fields of four skill files (github-forge, gitlab-forge, jira-forge, issue-labels/jira) from noun-phrase style to imperative trigger style. These may be prompted by skillsaw's agentskill-description rule, but the PR does not document which rule motivated the changes.

  • [stale-doc] FEATURES.md:160 — The PR adds make lint (skillsaw) as a CI gate in strict mode. FEATURES.md step 12 tells contributors to run make test before opening a PR but does not mention make lint. While CONTRIBUTING.md was updated, the FEATURES.md checklist was not.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (7)

Review

Findings

High

  • [logic-error] agents/review.md:12 — The frontmatter skills: array references github, but after this PR no skill has name: github. The PR renames skills/github-forge/SKILL.md's name from github to github-forge, while skills/issue-labels/github/SKILL.md retains name: issue-labels. The harness loads skills by directory path, so the runtime skill set will contain issue-labels and github-forge — not github.
    Remediation: Keep issue-labels in the frontmatter skills: array, or ensure a skill with name: github exists and contains labeling logic.

  • [logic-error] agents/triage.md:10 — Same broken reference: frontmatter skills: changed from issue-labels to github, but no skill named github will exist after this PR merges.
    Remediation: Keep issue-labels in the frontmatter skills: array.

  • [incorrect-agent-instructions] agents/review.md:127 — Body text says "invoke the github skill to recommend contextual labels" but the github-forge skill provides CLI commands, not label recommendations. Label recommendation logic lives in the issue-labels skill (skills/issue-labels/github/SKILL.md).
    Remediation: Revert body text references to issue-labels.

Medium

  • [incorrect-agent-instructions] agents/triage.md:382 — Body text says "If the github skill identifies labels" — same semantic mismatch. The labeling skill is issue-labels, not github-forge. Also at line 406.
    Remediation: Revert references to issue-labels.

  • [stale-reference] agents/review.md:250 — Output format table says "see github skill" for label_actions, but the labeling skill is issue-labels.
    Remediation: Revert to "see issue-labels skill".

  • [stale-doc] docs/review.md:57 — The "Skill: issue-labels" section references issue-labels throughout. If findings above are resolved by reverting agent references to issue-labels, this section remains correct. If github references are kept, this section becomes stale.

  • [stale-doc] docs/triage.md:56 — Same conditional staleness as docs/review.md.

  • [scope-creep] skills/fix-review/SKILL.md — The 263-line compression is a significant behavioral change to a production skill, bundled with a CI setup PR. The PR title ci(skillsaw) does not signal this change.

  • [protected-path] .github/workflows/lint.yml — This PR modifies 9 files under protected paths (.github/workflows/lint.yml, AGENTS.md, agents/review.md, agents/triage.md, skills/fix-review/SKILL.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md). The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale. Human approval is always required for protected-path changes.

Low

  • [breaking-api] skills/github-forge/SKILL.md:2 — Name changed from github to github-forge. Per AGENTS.md section 7, mergeSkills dedupes by directory basename (not frontmatter name), so downstream overrides are unlikely to break.

  • [breaking-api] skills/gitlab-forge/SKILL.md:2 — Same: gitlabgitlab-forge.

  • [breaking-api] skills/jira-forge/SKILL.md:2 — Same: jirajira-forge.

  • [version-consistency] .skillsaw-baseline.json:3 — Generated by skillsaw 0.14.1 but Makefile and CI pin 0.18.0. Consider regenerating with the pinned version.

  • [pattern-violation] agents/triage.md:8 — Frontmatter field order changed: skills: moved after model:, diverging from the convention in other agent files.

  • [stale-reference] skills/fix-review/SKILL.md:162 — Compression removes skillsaw-disable-next-line pragma and chains make test && make lint (changes error-handling semantics vs. separate invocations).


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (8)

Review

Findings

High

  • [logic-error] agents/review.md:12 — The frontmatter changes skills: - issue-labels to skills: - github, but no loaded skill has name: github after this PR. The labeling skill at skills/issue-labels/github/SKILL.md retains name: issue-labels (unchanged), and the forge skill at skills/github-forge/SKILL.md was renamed from name: github to name: github-forge. The body text (lines 127, 250) also directs the agent to "invoke the github skill" but the labeling skill's name is issue-labels. This appears to be an incomplete revert: a commit restored the issue-labels SKILL.md names but these agent frontmatter/body references survived. If not reverted, docs/review.md (line 63) also becomes stale.
    Remediation: Revert the frontmatter skills: entry and body text references back to issue-labels.

  • [logic-error] agents/triage.md:6 — Same skill name mismatch: frontmatter and body (lines ~382, ~406) reference github but no loaded skill has that name. The harness loads skills/issue-labels/github by path but the skill's name is issue-labels. If not reverted, docs/triage.md (line 64) also becomes stale.
    Remediation: Revert the frontmatter and body text references back to issue-labels.

Medium

  • [scope-creep] skills/github-forge/SKILL.md:2 — Skill name changed from github to github-forge to satisfy skillsaw's agentskill-name rule. While within the spirit of evaluating skillsaw per Evaluate skillsaw for linting agent instructions #188, this is a behavioral change that could affect downstream consumers using basename-based skill override dedup (per AGENTS.md §7).

  • [scope-creep] skills/gitlab-forge/SKILL.md:2 — Same: gitlabgitlab-forge.

  • [scope-creep] skills/jira-forge/SKILL.md:2 — Same: jirajira-forge.

  • [protected-path] agents/review.md — The PR modifies files under protected paths: .github/workflows/lint.yml, AGENTS.md, agents/review.md, agents/triage.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/jira-forge/SKILL.md. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and the description explains the rationale. Human approval is always required for protected-path changes, regardless of context.

  • [stale-doc] docs/triage.md:64 — The section "### Skill: issue-labels" documents the triage agent's use of the issue-labels skill, but the PR changed the agent's frontmatter reference to github. Resolved automatically if the high-severity logic-error findings are fixed by reverting to issue-labels.

  • [stale-doc] docs/review.md:63 — Same contingency: the section "### Skill: issue-labels" becomes stale if the frontmatter rename to github is retained.

Low

  • [version-mismatch] .skillsaw-baseline.json:3 — Baseline was generated by skillsaw 0.14.1 but the repo pins version 0.18.0 in the Makefile and CI config. If the baseline format changed between versions, the linter may reject baselined violations. Consider regenerating with the pinned version.

  • [frontmatter-field-ordering] agents/triage.md:9 — The skills: field was moved from before tools: to after model:, breaking the ordering convention observed in prioritize.md and scribe.md (which place skills: before tools:).


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (9)

Review

Findings

High

  • [stale-skill-name] docs/review.md:57 — Multiple stale references to the old skill name issue-labels (now github). The PR updates agents/review.md to use the new skill name but does not update docs/review.md, which still refers to issue-labels at lines 57, 63, 65, 80. The section heading at line 63 reads ### Skill: \issue-labels`. Users consulting this documentation would see a skill name that no longer exists. Remediation: Update docs/review.mdto use the new skill namegithubwhere it refers to the skill identity, while keeping directory path references (e.g.,skills/issue-labels/github/SKILL.md`) unchanged.

  • [stale-skill-name] docs/triage.md:56 — Multiple stale references to the old skill name issue-labels (now github). The PR updates agents/triage.md to use the new skill name but does not update docs/triage.md, which still refers to issue-labels at lines 56, 64, 66, 83. The example SKILL.md frontmatter at line 91 shows name: issue-labels — users following this example would create a skill with the wrong name, since the triage agent now references github in its skills: list.
    Remediation: Update docs/triage.md to use the new skill names and update the example frontmatter from name: issue-labels to the appropriate forge-specific name.

Medium

  • [skill-name-swap-collision] skills/issue-labels/github/SKILL.md:2 — The skill name github previously belonged to skills/github-forge/SKILL.md (the forge skill) and is now assigned to skills/issue-labels/github/SKILL.md (the labeling skill). Harness YAML resolves by directory path (unaffected), and agent frontmatter is updated in this PR. The remaining risk is that any external consumer resolving by the name field would silently get a different skill.
    Remediation: Verify with the fullsend platform team that no resolution mechanism uses the name field for runtime dispatch.

  • [stale-skill-name] FEATURES.md:37 — Two stale references to the old skill name issue-labels at lines 37 and 149.
    Remediation: Update FEATURES.md references to the new skill name.

  • [protected-path] This PR modifies 10 files under protected paths: .github/workflows/lint.yml, AGENTS.md, agents/review.md, agents/triage.md, and 6 files under skills/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

Low

  • [skill-name-swap-collision] skills/gitlab-forge/SKILL.md:2 — Same swap pattern as GitHub: name: gitlab becomes name: gitlab-forge, and skills/issue-labels/gitlab/SKILL.md takes the name gitlab.

  • [skill-name-swap-collision] skills/jira-forge/SKILL.md:2 — Same swap pattern: name: jira becomes name: jira-forge, and skills/issue-labels/jira/SKILL.md takes the name jira.

  • [stale-override-contract] AGENTS.md:99 — The prose references issue-labels/github which is a directory path (unchanged by this PR), but surrounding context does not clarify the distinction between the directory path and the renamed skill name field.

  • [scope-vs-authorization] Issue Evaluate skillsaw for linting agent instructions #188 asks to "evaluate" skillsaw. The PR commits to ongoing CI enforcement before the issue's evaluation questions have been formally answered. The PR correctly uses "Related to Evaluate skillsaw for linting agent instructions #188" framing.

  • [scope-creep] skills/github-forge/SKILL.md — The skill name renames are driven by the skillsaw agentskill-name rule, not by a functional requirement in Evaluate skillsaw for linting agent instructions #188. However, these renames are a necessary prerequisite for the new CI job to pass.

  • [third-party-action-trust] .github/workflows/lint.yml:19stbenjam/skillsaw is a third-party action from a personal GitHub account. The SHA pin fixes the action code, but pip install skillsaw==0.18.0 inside the action fetches from PyPI at runtime — a PyPI compromise would not be caught by the Git SHA pin.

  • [workflow-consistency] .github/workflows/lint.yml:17 — The new skillsaw job uses persist-credentials: false on actions/checkout, but the existing test and commit-lint jobs in the same file do not.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (10)

Review

Findings

High

  • [stale-reference] agents/review.md:127 — The diff replaces issue-labels with label recommendation in agent instruction text (also at line 250 in review.md, lines 382 and 406 in triage.md). No skill exists with the name label recommendation — the issue-labels skills are being renamed to github, gitlab, and jira, not label recommendation. The name contains a space, violating the skill name spec in AGENTS.md ("lowercase letters, numbers, and hyphens only"). The agent will be unable to resolve this skill reference at runtime.
    Remediation: Replace label recommendation with the correct post-rename skill name. Re-add the skill to the agents' skills: frontmatter arrays.

Medium

  • [stale-reference] docs/review.md:63 — After the skill name renames, docs/review.md (not in the diff) retains 10+ references to issue-labels, including the section heading ### Skill: issue-labels. These reference a name no longer in any SKILL.md frontmatter.
    Remediation: Update docs/review.md to use the post-rename skill names.

  • [stale-reference] docs/triage.md:64docs/triage.md (not in the diff) retains 10+ references to issue-labels, including a YAML code example with name: issue-labels. All stale after the renames.
    Remediation: Update docs/triage.md to use the post-rename skill names.

  • [stale-reference] FEATURES.md:37FEATURES.md retains references to issue-labels at lines 37 and 149, referencing a skill name no longer in any SKILL.md frontmatter.
    Remediation: Update references to use the post-rename skill names.

  • [scope-creep] agents/review.md:12 — Removing issue-labels from the review agent's skills: frontmatter changes agent behavior. The PR title describes CI/lint infrastructure, not agent definition changes. The body still instructs the agent to invoke a labeling skill, creating a frontmatter-vs-body inconsistency.
    Remediation: Re-add the correctly-named skill to frontmatter, or remove the prose referencing it. Disclose behavioral changes in the PR description.

  • [scope-creep] agents/triage.md:4 — Removing the entire skills: block from the triage agent's frontmatter changes agent behavior. The body text still references invoking a labeling skill.
    Remediation: Re-add the correctly-named skill, or remove the prose referencing it.

  • [scope-creep] skills/issue-labels/github/SKILL.md:2 — Six skill name renames are not disclosed in the PR title/description. Ripple effects into agent definitions and documentation are incomplete.
    Remediation: Disclose renames in PR description and ensure all references are updated.

  • [protected-path] This PR modifies 10 files under protected paths: .github/workflows/lint.yml, AGENTS.md, agents/review.md, agents/triage.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/github/SKILL.md, skills/issue-labels/gitlab/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md. Human approval is required for protected-path changes regardless of review outcome.

Low

  • [name-collision] skills/issue-labels/github/SKILL.md:2 — The issue-labels skills are renamed to github, gitlab, jira — the same names the forge skills had before this PR renames them. While no temporal collision occurs, a label skill named github alongside a forge skill named github-forge reduces semantic clarity.
    Remediation: Consider descriptive names like github-labels, gitlab-labels, jira-labels.

Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (11)

Review

Findings

Medium

  • [removal/rename staleness] agents/review.md:12 — Agent frontmatter lists issue-labels in the skills: array, but this PR renames all skills previously named issue-labels to platform-specific names (github, gitlab, jira). No skill is named issue-labels after this PR merges. The same stale reference exists in agents/triage.md:5. While skill loading is path-based via the harness (so runtime is not immediately broken), the frontmatter no longer corresponds to any actual skill name.
    Remediation: Update agents/review.md and agents/triage.md frontmatter skills: lists to reflect the new skill names.

  • [stale-skill-name] skills/code-implementation/SKILL.md:28 — References forge skills by old names github and gitlab ("use the commands from your forge-specific skill (github or gitlab)"). After the rename, github and gitlab now refer to the issue-labels skills (under skills/issue-labels/), not the forge skills. This creates a name collision where the instruction text points to the wrong skill. Already captured in .skillsaw-baseline.json (fingerprint ec2837e203470a07).
    Remediation: Update line 28 to reference the new skill names: github-forge and gitlab-forge.

  • [protected-path] .github/workflows/lint.yml — This PR modifies files under protected paths: .github/workflows/lint.yml, AGENTS.md, skills/github-forge/SKILL.md, skills/gitlab-forge/SKILL.md, skills/issue-labels/github/SKILL.md, skills/issue-labels/gitlab/SKILL.md, skills/issue-labels/jira/SKILL.md, skills/jira-forge/SKILL.md. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consumer completeness] .skillsaw-renames.json:9 — The renames file maps the old skill name issue-labels to only jira, but this PR renames three skills that were all previously named issue-labels (github, gitlab, jira variants). Since the file can only express a 1:1 mapping, future stale issue-labels references would get incorrect auto-fix suggestions pointing to jira rather than the platform-appropriate name.

  • [removal/rename staleness] agents/review.md:127 — The agent prompt says "invoke the issue-labels skill" but no skill has that name after this PR. Same pattern in agents/triage.md at lines 382 and 406. These references are outside the PR's changed files.

  • [scope-creep] skills/issue-labels/github/SKILL.md:2 — The SKILL.md name renames address skillsaw's agentskill-name rule but go beyond issue Evaluate skillsaw for linting agent instructions #188's strict evaluation scope. Skill resolution is path-based per AGENTS.md §7, so the renames are functionally safe.

  • [workflow step conventions] .github/workflows/lint.yml:15 — The new skillsaw job uses persist-credentials: false on its checkout step, but the existing test and commit-lint jobs in the same file do not. The setting is a security best practice — consider adding it to the other jobs for consistency.

  • [stale-skill-name] docs/triage.md:91 — Example SKILL.md frontmatter block shows name: issue-labels, which is the old skill name. After this PR, the issue-labels skills use platform-specific names. The example is illustrative rather than referencing a live skill.

Previous run (12)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

  • [PR body / config mismatch] .skillsaw.yaml:169 — The PR body states: "Raises the context-budget skill thresholds to warn 16000 / error 20000." However, the actual .skillsaw.yaml uses default thresholds (all sub-keys under limits: are commented out). The violations for pr-review (15,058 tokens) and code-implementation (9,116 tokens) are suppressed via the .skillsaw-baseline.json baseline file with ceiling mode, not by raised thresholds. If someone later removes the baseline file expecting the config to have raised thresholds, both skills will fail the lint check in --strict mode.
    Remediation: Either update the PR body to accurately describe the baseline suppression mechanism, or set the thresholds in .skillsaw.yaml as described.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.

  • [incomplete-checklist] FEATURES.md:180 — The review checklist tells contributors to run make test before opening a PR but does not mention the new make lint target that is now enforced in CI. Contributors following this checklist may miss lint failures that block merge.
    Remediation: Add a checklist item for make lint in a follow-up.

Previous run (13)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

  • [PR body / config mismatch] .skillsaw.yaml:169 — The PR body states: "Raises the context-budget skill thresholds to warn 16000 / error 20000." However, the actual .skillsaw.yaml uses default thresholds (all sub-keys under limits: are commented out). The violations for pr-review (15,058 tokens) and code-implementation (9,116 tokens) are suppressed via the .skillsaw-baseline.json baseline file with ceiling mode, not by raised thresholds. If someone later removes the baseline file expecting the config to have raised thresholds, both skills will fail the lint check.
    Remediation: Either update the PR body to accurately describe the baseline suppression mechanism, or set the thresholds in .skillsaw.yaml as described.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (14)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (15)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (16)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (17)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (18)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.
Previous run (19)

Review

Findings

High

  • [api-contract] Makefile:21 — The lint and lint-fix targets use uvx skillsaw==$(SKILLSAW_VERSION), which expands to uvx skillsaw==0.18.0. This is not valid uvx syntax. The uvx command accepts version pinning via command@version (e.g., uvx skillsaw@0.18.0) or via --from 'package==version' command (e.g., uvx --from 'skillsaw==0.18.0' skillsaw). With the current syntax, uvx interprets skillsaw==0.18.0 as a literal package name, which does not exist — both make lint and make lint-fix will fail for local developer use.
    Remediation: Use uvx skillsaw@$(SKILLSAW_VERSION) --strict or uvx --from 'skillsaw==$(SKILLSAW_VERSION)' skillsaw --strict.

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. Since persist-credentials: false is a security hardening measure, the preferred resolution is to add it to the other two jobs in a follow-up PR rather than removing it here.

  • [missing-doc-entry] README.md:91 — The Workflows table lists fullsend.yaml, release.yml, and script-test.yml but does not include lint.yml. Since this PR is explicitly documenting the linting infrastructure, it is a natural place to add the missing row.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run (20)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the CI change. Human approval is always required for protected-path changes, regardless of context.

Low

  • [incomplete-tooling-configuration] .skillsaw.yaml — The skillsaw author (stbenjam) recommended disabling the content-critical-position rule in the issue Evaluate skillsaw for linting agent instructions #188 discussion. The .skillsaw.yaml configuration does not disable this rule, meaning CI will flag content-critical-position warnings in strict mode. Consider whether this rule should be disabled per the tool author's guidance.

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job sets persist-credentials: false on its checkout step, while the test and commit-lint jobs in the same file omit this parameter. This is an inconsistency, but persist-credentials: false is a security hardening measure. If consistency is desired, add it to the other jobs in a separate PR rather than removing it from the skillsaw job.

Previous run (21)

Review

Findings

Medium

  • [protected-path] .github/workflows/lint.yml — Modifies a file under the protected path .github/. The PR links to issue Evaluate skillsaw for linting agent instructions #188 and provides rationale for the change. Human approval is always required for protected-path changes, regardless of context.

  • [scope-creep-beyond-authorization] Issue Evaluate skillsaw for linting agent instructions #188 authorizes evaluating skillsaw ("Does it find meaningful issues?", "Would it be useful ongoing?") but this PR implements production CI enforcement (--strict mode, Makefile targets, repo config). The PR is part of a stack (base branch skillsaw/fix-pr-review) where evaluation may have occurred in earlier PRs, but the evidence is not linked here.
    Remediation: Provide evidence (comment on Evaluate skillsaw for linting agent instructions #188 or preceding PR) that the evaluation phase completed before CI integration.

  • [inconsistent-configuration] .skillsaw.yaml:337 — Sets strict: false while the CI workflow passes strict: true and the Makefile passes --strict. The CLI flag overrides the config, making it dead configuration that could confuse contributors.
    Remediation: Remove strict: false or add a comment explaining the intentional difference for local non-strict runs.

  • [missing-documentation] README.md:44 — The Testing section lists make test, make script-build, and make check-bundle but not the newly added make lint and make lint-fix targets.
    Remediation: Add the new lint targets to the README.

Low

  • [scope-naming-convention] PR title uses ci(skillsaw) — repo conventions use subsystem scopes (e.g., ci(lint)) rather than tool names.

  • [consistency] .github/workflows/lint.yml:19 — The skillsaw job uses persist-credentials: false while the other two jobs omit it. The inconsistency is noted, though the third-party action usage makes this the more secure choice.

  • [incomplete-guidance] CONTRIBUTING.md:38 — Instructs contributors to "fix any lint failures before pushing" without specifying the make lint command. Pre-existing gap now worth addressing with the new target available.

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Aug 11, 2026

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review sweep: 4 findings (2 HIGH, 2 MEDIUM) posted as inline comments.

Comment thread .skillsaw.yaml Outdated
Comment thread .github/workflows/lint.yml Outdated
Comment thread .github/workflows/lint.yml
Comment thread .skillsaw.yaml Outdated
@ralphbean

Copy link
Copy Markdown
Member Author

These three all landed as separate inline threads — handled them there (protected-path is intentional, indentation fixed, strict-mode comment reworded).

@ralphbean

Copy link
Copy Markdown
Member Author

Went through these:

Doc gaps — added make lint/make lint-fix to the README and CONTRIBUTING.

Scope vs #188 — I see the issue only asked for evaluation, but I'd count the PR itself as the evaluation: building the strict lint job out and watching it catch real issues in review (the ones fixed inline on this PR) is the signal that it finds meaningful problems and is worth running ongoing. Comfortable moving straight to CI integration rather than splitting that into a separate PR.

persist-credentials — answered on the dedicated thread for that one.

PR title — keeping ci(skillsaw) as-is. It's scoping to the tool being added rather than an existing subsystem, which felt clearer here than reaching for a subsystem name that doesn't exist yet.

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 1:16 PM UTC · Completed 1:32 PM UTC

Commit: b703e8c · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

Comment thread .skillsaw.yaml Outdated

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review sweep: 2 findings (1 HIGH, 1 MEDIUM) posted as inline comments.

Comment thread .skillsaw.yaml Outdated
Comment thread .skillsaw.yaml Outdated
@ralphbean
ralphbean force-pushed the skillsaw/onboard-ci branch from b703e8c to c2ab7a5 Compare August 13, 2026 21:38
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:39 PM UTC · Completed 9:54 PM UTC

Commit: c2ab7a5 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot removed the requires-manual-review Review requires human judgment label Aug 13, 2026
@fullsend-ai-coder

fullsend-ai-coder Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

🤖 Finished Fix · ✅ Success · Started 9:55 PM UTC · Completed 10:01 PM UTC

Commit: c2ab7a5 · View workflow run →

@fullsend-ai-coder

Copy link
Copy Markdown
Contributor

🔧 Fix agent — iteration 1 (bot-triggered)

Addressed 2 of 3 review findings. Fixed invalid uvx syntax in Makefile (== to @) and added lint.yml to README Workflows table. Disagreed with 1 finding (persist-credentials consistency) per reviewer's own suggestion to handle in a follow-up PR.

Fixed (2):

  1. uvx version pinning uses invalid == syntax (Makefile): Changed uvx skillsaw==$(SKILLSAW_VERSION) to uvx skillsaw@$(SKILLSAW_VERSION) on both lint and lint-fix targets. The == syntax is pip-style version pinning not recognized by uvx; the @Version syntax is the correct uvx idiom.
  2. lint.yml missing from README Workflows table (README.md): Added a row for lint.yml to the Workflows table describing its purpose (pre-commit checks, commit-message linting, and skillsaw).

Disagreed (1):

  1. persist-credentials: false inconsistency across workflow jobs: The reviewer explicitly noted the preferred resolution is to add persist-credentials: false to the other two jobs in a follow-up PR rather than removing it here. No change needed in this PR.

Tests: passed

Next steps:

  • /fs-review — request a re-review of the changes
  • /fs-fix <your instruction> — run another fix pass with specific guidance
  • Push commits directly — review re-runs automatically on push
    Updated by fullsend fix agent

fullsend-ai-coder Bot added a commit that referenced this pull request Aug 13, 2026
Use uvx's @Version pinning syntax instead of pip-style ==version, which
uvx does not recognize as a valid command specifier. Add lint.yml to the
README Workflows table for completeness.

Addresses review feedback on #754
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:02 PM UTC · Completed 10:14 PM UTC

Commit: b361f6c · View workflow run →

@fullsend-ai-review
fullsend-ai-review Bot dismissed their stale review August 13, 2026 22:14

Superseded by updated review

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added the requires-manual-review Review requires human judgment label Aug 13, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 13, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 11:32 PM UTC · Completed 11:45 PM UTC

Commit: 4e2d9e4 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Aug 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:54 AM UTC · Completed 1:05 AM UTC

Commit: ac6bb14 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review-only sweep on head 8927c03 — 2 findings (1 HIGH, 1 MEDIUM) posted inline. Not approving or requesting changes; leaving disposition to the author.

Comment thread .skillsaw-baseline.json Outdated
Comment thread CONTRIBUTING.md
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 31, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 2:06 AM UTC · Completed 2:27 AM UTC

Commit: efeb110 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $8.08

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot removed the requires-manual-review Review requires human judgment label Aug 31, 2026
ralphbean and others added 16 commits August 31, 2026 11:30
Adds a skillsaw job to the lint workflow, running the linter in
--strict mode on every PR and push to main. Adds `make lint` and
`make lint-fix` targets so contributors can run the same checks
locally. Adds .skillsaw.yaml, tuned for this repo:

- Disables marketplace-json-valid and marketplace-registration.
  plugins/gopls-lsp is an internal fullsend harness plugin config
  (see harness/code.yaml), not a Claude Code marketplace plugin, so
  these rules produced false positives.
- Raises the context-budget skill thresholds to warn 16000 / error
  20000, above code-implementation and pr-review's current sizes.
  Both are dense, production-tuned orchestration procedures; --strict
  turns warnings into failures, so the thresholds are set high enough
  that neither file triggers a violation at either severity.

This builds on the skill content fixes in the preceding PRs in this
stack, evaluating skillsaw per #188.

Related to #188

Assisted-by: Claude Opus 4.6 <noreply@anthropic.com>
- Pin skillsaw action to the exact commit SHA (v0.18.0) instead of the
  v0 tag object, matching the repo's pinact convention.
- Fix .skillsaw.yaml exclude block indentation to match the rest of
  the file.
- Correct the marketplace-json-valid/marketplace-registration disable
  comment: it wasn't gopls-lsp/plugin.json causing the failure, it's
  that this repo has no .claude-plugin/marketplace.json and isn't a
  distributable plugin marketplace.
- Clarify why strict: false in .skillsaw.yaml doesn't matter for CI.
- Document make lint / make lint-fix in README and CONTRIBUTING.

Assisted-by: Claude Opus 4.6 <noreply@anthropic.com>
Use uvx's @Version pinning syntax instead of pip-style ==version, which
uvx does not recognize as a valid command specifier. Add lint.yml to the
README Workflows table for completeness.

Addresses review feedback on #754
…mment

v0.18.0 renamed the Claude Code format rules to claude--prefixed
canonical IDs; the checked-in config still used the pre-rename legacy
names. Not a functional bug (skillsaw resolves the aliases), but
regenerate the keys to match what skillsaw init produces today.

Also fix the disabled marketplace-json-valid/marketplace-registration
comment, which still cited an already-debunked root cause (gopls-lsp
misdetection) instead of the verified one: no top-level
.claude-plugin/marketplace.json exists in this repo.

Assisted-by: Claude Opus 4.6 <noreply@anthropic.com>
…limit

Raising context-budget.limits.skill to warn 16000/error 20000 repo-wide
was meant to clear pr-review and code-implementation, but it silently
raised the ceiling for every skill file (present or future) and, per
review, missed that 3 other files (code-review, fix-review,
retro-analysis) were already over the default warn threshold too.

skillsaw ships a baseline/ratchet mechanism (baseline_mode: ceiling)
built exactly for this: snapshot each currently oversized file's token
count as its own ceiling, so it only fails again if it grows past its
current size, while every other file keeps the strict default (warn
3000 / error 6000).

Revert the limit to defaults and commit .skillsaw-baseline.json with
the 5 affected files snapshotted.

Assisted-by: Claude Opus 4.6 <noreply@anthropic.com>
CI's skillsaw job scans the pull_request merge commit (head merged
into base, per actions/checkout's default ref), not the head branch
alone. This PR's base (skillsaw/fix-pr-review) has a slightly
different pr-review/SKILL.md than what's on this branch, so the
baseline snapshotted from a plain head-branch checkout undercounted
its tokens (15,051 vs the merge tree's actual 15,058) and tripped the
ratchet in CI.

Regenerated by baselining against refs/pull/754/merge directly.

Assisted-by: Claude Opus 4.6 <noreply@anthropic.com>
Apply skillsaw's automatic fixes for agentskill-name violations:
- Rename forge skills to match directory names (github-forge, gitlab-forge, jira-forge)
- Rename issue-labels subdirectory skills to match their directories (github, gitlab, jira)
- Add markdown link syntax for bare paths in AGENTS.md

Update .skillsaw-baseline.json to suppress context-budget warnings for
existing oversized skills (code-implementation now at 9,204 tokens).

Add .skillsaw-renames.json to track skill renames for reference updates.

Fixes all 7 ERROR-level skillsaw violations. CI checks now pass.

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
The issue-labels skill was renamed to forge-specific names (github,
gitlab, jira) in commit 4e91eb4, but the agent markdown files still
referenced the old generic name "issue-labels" in their frontmatter
skills list and in instruction text.

Since these forge-specific skills are loaded dynamically via
forge.*.skills in harness YAML (not via agent frontmatter), remove
the stale "issue-labels" entry from the skills list in agents/triage.md
and agents/review.md.

Also update instruction text to reference "label recommendation" skill
generically rather than by the old "issue-labels" name, since the actual
skill name now varies by forge.

Remove the incorrect "issue-labels" → "jira" entry from
.skillsaw-renames.json that was added by the auto-fix. The issue-labels
skills were renamed to their immediate directory names (github, gitlab,
jira), not prefixed variants.

This fixes functional test failures where agents couldn't invoke the
renamed skills.

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
- Fix invalid skill reference: replace "label recommendation" with "github" in agents/review.md and agents/triage.md
- Re-add github skill to frontmatter in both agent files
- Remove .skillsaw-renames.json (linter scratch state) and add to .gitignore
- Regenerate .skillsaw-baseline.json to fix stale token counts and remove false-positive rename warnings

This resolves the HIGH severity issues identified in review:
- Invalid skill name with space character (violates AGENTS.md spec)
- Stale baseline after rebase causing CI failures
- Self-contradictory rename manifest causing false positives
- Frontmatter inconsistencies where skills were referenced but not declared

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
The skill renames in commit 4e91eb4 broke the intended design where:
- skills/issue-labels/{github,gitlab,jira}/ all share the name 'issue-labels'
- skills/{github,gitlab,jira}-forge/ use the names 'github', 'gitlab', 'jira'

These names allow skills to be referenced consistently regardless of which
forge they're running on, which is the intended behavior.

Updated .skillsaw.yaml to document the exceptions and regenerated
.skillsaw-baseline.json to exempt these skills from the agentskill-name rule.

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
- Add "Use when..." trigger phrasing to skill descriptions for:
  - skills/github-forge/SKILL.md
  - skills/gitlab-forge/SKILL.md
  - skills/jira-forge/SKILL.md
  - skills/issue-labels/jira/SKILL.md

- Condense skills/fix-review/SKILL.md from 3,937 to under 3,000 tokens:
  - Streamline verbose sections (Tools reminder, Progress markers, Step 2)
  - Compress implementation steps while preserving essential guidance
  - Simplify schema documentation in structured output section
  - Maintain all critical requirements and constraints

Fixes skillsaw lint warnings to pass CI in strict mode.

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
- Revert forge skill names to original (github, gitlab, jira)
- Fix agent skill references (issue-labels not github)
- Fix triage.md frontmatter field ordering (model before tools)
- Restore repo-agnostic test/lint discovery in fix-review
- Restore local ref warning in fix-review strategy escalation
- Regenerate baseline with pinned skillsaw 0.18.0

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Make .skillsaw.yaml the authoritative version source. Makefile now
extracts version dynamically. CI comment documents the relationship.

Assisted-by: Claude Sonnet 4.5 <noreply@anthropic.com>
The output rules section on line 406 incorrectly referenced the `github`
skill for label recommendations. The correct skill is `issue-labels`,
which is consistent with the agent's frontmatter and the label
recommendations paragraph earlier in the file.

Addresses review feedback on #754
Update the "Opening a PR" section to reference both `pre-commit run
--all-files` (actionlint, gitleaks, shellcheck, pinact, YAML/JSON)
and `make lint` (skillsaw), so contributors know to run both checks
locally before pushing.

Addresses review feedback from @waynesun09 on #754
Signed-off-by: Ralph Bean <rbean@redhat.com>
@ralphbean
ralphbean force-pushed the skillsaw/onboard-ci branch from efeb110 to 700c695 Compare August 31, 2026 16:02
@fullsend-ai-review

fullsend-ai-review Bot commented Aug 31, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:04 PM UTC · Completed 4:24 PM UTC

Commit: 700c695 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $5.76

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

Comment thread Makefile
Comment thread .github/scripts/check-skillsaw-version.sh
Comment thread AGENTS.md
Comment thread AGENTS.md
Comment thread CONTRIBUTING.md
Comment thread agents/triage.md
Comment thread AGENTS.md
@ralphbean
ralphbean added this pull request to the merge queue Aug 31, 2026
Merged via the queue into main with commit 723ae4c Aug 31, 2026
31 of 33 checks passed
@ralphbean
ralphbean deleted the skillsaw/onboard-ci branch August 31, 2026 17:09
@fullsend-ai-retro

fullsend-ai-retro Bot commented Aug 31, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 5:11 PM UTC · Completed 5:23 PM UTC

Commit: 700c695 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $7.14

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #754 — ci(skillsaw): add lint job, Makefile targets, and repo config

Timeline

PR #754 (by ralphbean) added a skillsaw lint CI job, Makefile targets, and .skillsaw.yaml config, related to issue #188. The PR spanned 20 days (Aug 11–31) with 16 commits and 15 changed files. The review agent ran 14+ times across the PR lifecycle; two successful review runs on Aug 31 cost ~$13.84 combined. The fix agent was dispatched twice and failed both times at the "Pre-fetch review body" step.

Review quality

The review bot's strongest contribution was skill reference integrity checking — it correctly identified broken github vs issue-labels skill references across agent frontmatter and body text, and caught a critical tool-removal regression where ,Skill was silently dropped from agents/triage.md's tools frontmatter during a rebase. This was the bot's single strongest unique HIGH-severity catch.

The human reviewer (waynesun09) was significantly more effective at deep analysis. Key findings the human caught that the bot missed: (1) marketplace rule disable comment cited an incorrect root cause — verified by running uvx skillsaw locally; (2) action pinned to tag-object SHA rather than immutable release commit — verified via git ls-remote and git cat-file -t; (3) baseline ratchet stale after rebase — verified by cloning and running the linter; (4) make lint-fix silently renaming skills and breaking contracts — verified by running skillsaw fix --dry-run; (5) fix-review SKILL.md compression hardcoded make test && make lint, breaking non-Makefile repos.

Fix agent failures

Both fix agent runs (33413947850, 33350710429) failed at "Pre-fetch review body" with Bot-triggered run but review body is empty. Root cause: the gh api call in reusable-dispatch.yml does not use --paginate. PR #754 accumulated 103 reviews across 4 pages; the two CHANGES_REQUESTED reviews were on page 4, invisible to the unpaginated fetch. One proposal filed below for this root cause, complementing agents#407 (which covers the downstream fallback).

Existing issues corroborated by this retro

  • Review deduplication (fullsend#1452, agents#323, fullsend#4022): Two review runs on the same HEAD SHA (700c695) cost ~$13.84 for essentially duplicate work. Run 2 found the same core findings as run 1. fullsend#1452 is labeled ready-to-code.
  • Finding repetition (fullsend#1013, fullsend#2959, agents#106): The bot posted the same persist-credentials: false finding 7 times and the same Makefile SKILLSAW_VERSION edge-case 7+ times across review iterations.
  • Severity calibration (fullsend#5128, agents#1069): Bot rated baseline version mismatch and version drift as LOW; human rated them HIGH with verified CI breakage evidence. The bot's inability to run tools or verify CI status limits its severity accuracy.
  • Fix agent empty body fallback (agents#407): The downstream symptom (empty review body reaching the fix skill) is covered, but the root cause (missing pagination in pre-fetch) is not — see proposal below.

Proposals skipped (target repo not allowed)

File manually or update create_issues.allow_targets in config.yaml:

  • Fix agent pre-fetch review body step should paginate the GitHub reviews API call (fullsend-ai/fullsend)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants