Skip to content

feat: add issue auto-search and resolution verifier to PR review skill#119

Merged
Aureliolo merged 2 commits intomainfrom
feat/review-skill-issue-search
Mar 6, 2026
Merged

feat: add issue auto-search and resolution verifier to PR review skill#119
Aureliolo merged 2 commits intomainfrom
feat/review-skill-issue-search

Conversation

@Aureliolo
Copy link
Copy Markdown
Owner

Summary

  • When the PR review skill finds no closes #N keyword, it now searches for a matching issue by PR title keywords instead of immediately warning
  • High-confidence matches are auto-linked via gh pr edit --body; ambiguous matches are presented to the user for selection
  • Adds a new issue-resolution-verifier agent that runs whenever an issue is linked — checks acceptance criteria coverage, scope completeness, test coverage, and documentation requirements against the PR diff

Changes

Only .claude/skills/aurelio-review-pr/SKILL.md — no source code changes.

Phase 2 — Issue linkage

  • No closing keyword + no partial signals now triggers a 4-step search: query open/closed issues → evaluate candidates → auto-link or ask user → fall back to warning
  • Input validation rules extended to cover search-discovered issue numbers

Phase 3 — New agent

  • issue-resolution-verifier added to the agent table (runs when issue is linked)
  • Checks each acceptance criterion → RESOLVED / PARTIALLY_RESOLVED / NOT_RESOLVED with confidence scores
  • NOT_RESOLVED items surface in Phase 5 triage as CRITICAL findings

Test plan

  • Run /aurelio-review-pr on a PR with a closing keyword — verify existing behavior unchanged
  • Run /aurelio-review-pr on a PR without a closing keyword — verify it searches and auto-links
  • Run /aurelio-review-pr on a PR with ambiguous matches — verify AskUserQuestion is used
  • Verify issue-resolution-verifier agent launches and reports findings in triage

…skill

When no closing keyword is found, the review skill now searches for a
matching issue by PR title keywords before warning. High-confidence
matches are auto-linked; ambiguous ones are presented to the user.

Adds an issue-resolution-verifier agent that checks whether the PR
fully resolves the linked issue's acceptance criteria, scope, tests,
and documentation requirements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings March 6, 2026 08:16
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Mar 6, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 6, 2026

Warning

Rate limit exceeded

@Aureliolo has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 31 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b29b65bd-f464-4476-afd2-a6d545f37594

📥 Commits

Reviewing files that changed from the base of the PR and between 0afc67c and b66217e.

📒 Files selected for processing (1)
  • .claude/skills/aurelio-review-pr/SKILL.md
📝 Walkthrough

Walkthrough

This change updates the aurelio-review-pr skill documentation to introduce an auto-search workflow for matching issues before warning, and adds a new issue-resolution-verifier agent that validates linked issues against PR changes and acceptance criteria.

Changes

Cohort / File(s) Summary
Aurelio Review PR Skill Documentation
.claude/skills/aurelio-review-pr/SKILL.md
Replaces single-line warning with auto-search workflow for matching issues. Adds new issue-resolution-verifier agent that inspects linked issues against PR diff and acceptance criteria. Extends Phase 2 and Phase 3 descriptions to include new auto-search behavior and agent output format. Net change: +51/-2 lines.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main changes: adding issue auto-search functionality and an issue-resolution-verifier agent to the PR review skill.
Description check ✅ Passed The description is directly related to the changeset, clearly explaining the issue auto-search workflow, the new verification agent, specific changes to phases, and a test plan.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/review-skill-issue-search

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the PR review skill by introducing automated issue detection and resolution verification. It streamlines the process of linking pull requests to relevant GitHub issues, reducing manual effort and improving accuracy. Furthermore, it adds a robust mechanism to ensure that linked issues are thoroughly addressed by the pull request, thereby improving code quality and project maintainability.

Highlights

  • Issue Auto-Search: The PR review skill now automatically searches for matching GitHub issues using PR title keywords when no 'closes #N' keyword is present, instead of immediately issuing a warning.
  • Auto-Linking & User Selection: High-confidence issue matches are automatically linked to the PR, while ambiguous matches are presented to the user for selection.
  • Issue Resolution Verifier Agent: A new 'issue-resolution-verifier' agent has been added, which runs when an issue is linked to a PR to check acceptance criteria coverage, scope completeness, test coverage, and documentation requirements against the PR diff.
Changelog
  • .claude/skills/aurelio-review-pr/SKILL.md
    • Updated the logic for handling PRs without explicit issue references, detailing the new auto-search and auto-linking process.
    • Documented the new 'issue-resolution-verifier' agent, including its purpose, the checks it performs, and its output format.
    • Expanded input validation rules to cover search-discovered issue numbers.
Activity
  • No human activity has been recorded on this pull request since its creation.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces significant enhancements to the PR review skill by adding an auto-search mechanism for linking issues and a new agent for verifying issue resolution. The documentation clearly outlines the new functionalities, including the search process, confidence thresholds, and the detailed checks performed by the issue-resolution-verifier agent. The explicit mention of critical input validation for discovered issue numbers is a strong point for security.

Note: Security Review has been skipped due to the limited scope of the PR.

1. **Search open issues** by PR title keywords and branch name:

```bash
# Search by key terms from the PR title (strip type prefix like "feat: ")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The comment "# Search by key terms from the PR title (strip type prefix like "feat: ")" implies a specific parsing logic for TITLE_KEYWORDS. To enhance clarity and ensure consistent behavior, it would be beneficial to explicitly state how TITLE_KEYWORDS are derived from the PR title (e.g., "TITLE_KEYWORDS are extracted by stripping conventional commit type prefixes like "feat:", "fix:", etc., and then tokenizing the remaining title."). This clarifies the expected input for the search.

@greptile-apps
Copy link
Copy Markdown

greptile-apps bot commented Mar 6, 2026

Greptile Summary

This PR enhances the aurelio-review-pr skill with two features: (1) automatic issue search when a PR lacks a closing keyword, with user-confirmed auto-linking via a safe --body-file procedure, and (2) a new issue-resolution-verifier agent that checks acceptance criteria coverage, scope completeness, test coverage, and documentation against the PR diff whenever an issue is linked. The additions fit naturally into the existing Phase 2 → Phase 3 pipeline, and the security concerns from previous rounds (shell injection, \n escaping) have been addressed by using --body-file.

However, three bugs remain in the newly introduced linking procedure:

  • JSON-encoded body written to temp filegh pr view --json body --jq '.body' emits a quoted, JSON-encoded string (e.g. "the body"). Without piping through jq -r '.', the PR body written to $tmpfile contains surrounding double-quotes and escaped special characters. gh pr edit --body-file then sets the PR body to that JSON-encoded text, corrupting it.
  • Case-sensitive idempotency check causes duplicate close keywordsgrep -q "Closes #N" will not match closes #123, fixes #123, resolves #123, or any other capitalisation GitHub natively accepts, so the check is bypassed and a duplicate closing keyword is appended.
  • Silent PR body destruction on gh pr view failure — if the fetch fails for any reason, $tmpfile will be empty (or contain an error string). The subsequent gh pr edit --body-file "$tmpfile" silently overwrites the PR body with that content, deleting all existing text. A trap + early-exit guard is needed.

Confidence Score: 2/5

  • Not safe to merge — the linking procedure contains a data-loss bug and a body-corruption bug that would silently damage PR bodies in production use.
  • The overall design and structure are solid, and the previous injection/newline issues from earlier rounds were correctly resolved. However, the three new bugs flagged are not hypothetical edge cases — they affect every invocation of the auto-link path: the body will always be JSON-encoded incorrectly, the idempotency guard will regularly miss existing lowercase keywords, and any transient network failure during the gh pr view fetch will wipe the PR body. These are blocking issues for a feature that modifies live PR content.
  • .claude/skills/aurelio-review-pr/SKILL.md lines 99–111 (the linking procedure)

Important Files Changed

Filename Overview
.claude/skills/aurelio-review-pr/SKILL.md Adds auto-issue-search and issue-resolution-verifier; the new linking procedure has three bugs: JSON-encoded body written to temp file (missing jq -r), case-sensitive idempotency grep that misses lowercase/alternate closing keywords and causes duplicates, and no error guard against gh pr view failure that could silently wipe the PR body.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Phase 2: Fetch PR body & title] --> B{Closing keyword found?}
    B -- Yes --> C{Non-closing signals?}
    C -- No --> D[Extract issue number → fetch issue context]
    C -- Yes --> E[Warn: partial-work PR\nAsk user to confirm closing keyword]
    B -- No --> F{Non-closing signals?}
    F -- Yes --> G[OK — no warning needed]
    F -- No --> H[Auto-search for matching issue]
    H --> I[gh issue list open/closed\nby PR title + branch keywords]
    I --> J[Fetch full details for up to 5 candidates\ngh issue view CANDIDATE_N]
    J --> K{Match confidence?}
    K -- High confidence --> L[Present match to user\nAsk confirmation]
    L -- Confirmed --> M[Linking Procedure\nmktemp → gh pr view → grep idempotency\n→ gh pr edit --body-file → rm]
    L -- Rejected --> N[Warn: no issue linked]
    K -- Ambiguous --> O[AskUserQuestion with top candidates]
    O -- User picks issue --> M
    O -- None apply --> N
    K -- No matches --> N
    M --> D
    D --> P[Phase 3: Launch review agents in parallel]
    P --> Q[code-reviewer\npr-test-analyzer\nsilent-failure-hunter\ncomment-analyzer\ntype-design-analyzer\nlogging-audit\nresilience-audit\ndocs-consistency]
    P --> R{Issue linked?}
    R -- Yes --> S[issue-resolution-verifier\nCheck acceptance criteria\nScope completeness\nTest coverage\nDocs requirements\nIssue comments]
    S --> T[NOT_RESOLVED items → CRITICAL in triage]
    Q --> U[Phase 4: Fetch external reviewer feedback]
    T --> U
Loading

Last reviewed commit: b66217e

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Updates the /aurelio-review-pr skill to automatically search for a likely matching GitHub issue when no closing keyword is present, and adds an “issue-resolution-verifier” agent to validate that linked issues are actually resolved by the PR diff.

Changes:

  • Adds a Phase 2 auto-search flow to find and optionally auto-link a matching issue when no closing keyword is present.
  • Extends Phase 2 guidance to apply the same input-validation rules to search-discovered issue numbers.
  • Adds an issue-resolution-verifier agent definition and checklist for validating acceptance criteria/scope/tests/docs vs the PR diff.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +71 to +75
# Search by key terms from the PR title (strip type prefix like "feat: ")
gh issue list --repo OWNER/REPO --state open --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}'

# Also search recently closed issues (in case PR was created after issue was closed)
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

Step 1 says to search "by PR title keywords and branch name", but the example commands only search TITLE_KEYWORDS and never incorporate the branch name. Either update the text to reflect the actual search inputs, or include branch-name terms in the search query (so the documented procedure matches what the skill will do).

Suggested change
# Search by key terms from the PR title (strip type prefix like "feat: ")
gh issue list --repo OWNER/REPO --state open --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}'
# Also search recently closed issues (in case PR was created after issue was closed)
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10
# Search by key terms from the PR title (strip type prefix like "feat: ") plus simple terms from the branch name
gh issue list --repo OWNER/REPO --state open --search "TITLE_KEYWORDS BRANCH_NAME_TERMS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}'
# Also search recently closed issues (in case PR was created after issue was closed)
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS BRANCH_NAME_TERMS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10

Copilot uses AI. Check for mistakes.
gh issue list --repo OWNER/REPO --state open --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}'

# Also search recently closed issues (in case PR was created after issue was closed)
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

The closed-issues example uses a | head -10 truncation. Prefer using gh issue list --limit 10 ... so the limit is applied by the CLI (avoids accidental truncation of JSON output and makes the command more portable/explicit).

Suggested change
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --limit 10 --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}'

Copilot uses AI. Check for mistakes.
gh issue list --repo OWNER/REPO --state closed --search "TITLE_KEYWORDS" --json number,title,labels --jq '.[] | {number, title, labels: [.labels[].name]}' | head -10
```

2. **Evaluate candidates.** For each candidate issue, compare:
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

The candidate-evaluation step includes comparing issue "title/body", but the preceding gh issue list commands only fetch number,title,labels (no body/milestone). To make this actionable/accurate, document fetching each candidate's full details (e.g., gh issue view <n> --json title,body,labels,milestone,comments) before doing the comparison criteria listed here.

Suggested change
2. **Evaluate candidates.** For each candidate issue, compare:
2. **Evaluate candidates.** For each candidate issue, first fetch its full details, then compare:
```bash
# For each candidate issue number CANDIDATE_N, fetch full context
gh issue view CANDIDATE_N \
--repo OWNER/REPO \
--json title,body,labels,milestone,comments

Then compare:

Copilot uses AI. Check for mistakes.
- Is there a strong keyword overlap between the issue title and the PR branch name or title?

3. **Confidence threshold:**
- **High confidence** (single strong match, clear title/scope alignment): auto-link the issue by updating the PR body with `gh pr edit NUMBER --body "EXISTING_BODY\n\nCloses #N"`. Inform the user: "Auto-linked closes #N — issue title closely matches this PR."
Copy link

Copilot AI Mar 6, 2026

Choose a reason for hiding this comment

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

The suggested auto-link command gh pr edit ... --body "EXISTING_BODY\n\nCloses #N" is fragile because it requires correctly escaping arbitrary existing PR body content (quotes/backticks/newlines) and can easily corrupt or truncate the body. Consider documenting a safer approach (e.g., write the updated body to a temp file and use gh pr edit --body-file, and ensure the operation is idempotent so you don’t append a duplicate closing line if one is already present).

Suggested change
- **High confidence** (single strong match, clear title/scope alignment): auto-link the issue by updating the PR body with `gh pr edit NUMBER --body "EXISTING_BODY\n\nCloses #N"`. Inform the user: "Auto-linked closes #N — issue title closely matches this PR."
- **High confidence** (single strong match, clear title/scope alignment): auto-link the issue by **safely updating the PR body**:
1. Read the existing body into a temp file:
```bash
tmpfile="$(mktemp)"
gh pr view NUMBER --json body --jq '.body' > "$tmpfile"
```
2. Make the operation **idempotent** by only appending the closing line if it's not already present:
```bash
if ! grep -q "Closes #N" "$tmpfile"; then
printf '\n\nCloses #N\n' >> "$tmpfile"
fi
```
3. Update the PR using `--body-file` (avoids fragile shell quoting of the existing body):
```bash
gh pr edit NUMBER --body-file "$tmpfile"
rm "$tmpfile"
```
Inform the user: "Auto-linked closes #N — issue title closely matches this PR."

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.claude/skills/aurelio-review-pr/SKILL.md:
- Around line 83-86: The ambiguous-flow currently calls AskUserQuestion to let
the user pick an issue but does not persist that selection, so Phase 2 later
still treats the PR as unlinked; after AskUserQuestion returns a chosen issue,
call the same persistence/update path used for high-confidence matches (execute
the gh pr edit NUMBER --body "EXISTING_BODY\n\nCloses `#N`" pattern) and record
the chosen issue ID in whatever PR-link state you maintain so subsequent runs
see it as linked; update the code paths that handle AskUserQuestion results and
the Phase 2 linkage check to use the same "Closes `#N`" append and state write as
the high-confidence branch.
- Around line 68-81: Update Step 2 to explicitly fetch full issue details for
shortlisted candidates before scoring: after using the gh issue list command,
call gh issue view for each candidate to retrieve title, body, labels and
milestone (so the comparison logic in "Evaluate candidates" can inspect the
issue body and milestone), then run the three checks (title/body match,
milestone/labels match, keyword overlap) against that full metadata instead of
relying only on number/title/labels from gh issue list.
- Around line 138-146: Update the SKILL.md text so that any criterion marked
NOT_RESOLVED always overrides the later confidence-to-severity mapping and is
surfaced as CRITICAL in Phase 5 triage; specifically modify the paragraph under
"If the verifier finds NOT_RESOLVED items" and the Phase 5 triage description
for the issue-resolution-verifier to state that NOT_RESOLVED triggers a hard
override to CRITICAL (blocking merge) rather than being subject to the generic
confidence mapping. Ensure the doc references the NOT_RESOLVED token, Phase 5
triage, and issue-resolution-verifier so readers know this override applies
end-to-end.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 36ffa107-da06-44cc-a3d3-189342bdbc39

📥 Commits

Reviewing files that changed from the base of the PR and between a49ee46 and 0afc67c.

📒 Files selected for processing (1)
  • .claude/skills/aurelio-review-pr/SKILL.md
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Agent
  • GitHub Check: Greptile Review
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2026-01-24T16:33:29.354Z
Learnt from: CR
Repo: Aureliolo/story-factory PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-01-24T16:33:29.354Z
Learning: Applies to {src/agents/**/*.py,src/services/**/*.py,src/memory/**/*.py,src/utils/**/*.py,src/settings.py} : 100% test coverage is MANDATORY for every commit on core modules (`src/agents/`, `src/services/`, `src/memory/`, `src/utils/`, `src/settings.py`), CI enforces this coverage requirement

Applied to files:

  • .claude/skills/aurelio-review-pr/SKILL.md
📚 Learning: 2026-01-26T08:59:32.818Z
Learnt from: CR
Repo: Aureliolo/story-factory PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2026-01-26T08:59:32.818Z
Learning: Applies to {src/agents/**/*.py,src/services/**/*.py,src/memory/**/*.py,src/utils/**/*.py,src/settings.py} : 100% test coverage is MANDATORY for every commit. The CI enforces 100% coverage on core modules (`src/agents/`, `src/services/`, `src/memory/`, `src/utils/`, `src/settings.py`).

Applied to files:

  • .claude/skills/aurelio-review-pr/SKILL.md
🔇 Additional comments (1)
.claude/skills/aurelio-review-pr/SKILL.md (1)

88-92: Good safety hardening on issue refs.

Extending the numeric/repo-pattern validation to auto-discovered issues and full GitHub issue URLs closes the main shell-input trust gap in this workflow.

- Fix shell injection: replace inline --body with --body-file for safe
  PR body updates (CRITICAL, flagged by 3 sources)
- Add --limit to issue search commands, use --limit instead of head -10
- Fetch full issue details (body, milestone) before candidate scoring
- Require user confirmation for high-confidence auto-linking
- Persist user-selected issue in ambiguous path via same linking procedure
- Add idempotency check (grep before appending Closes #N)
- Add partial-work context guidance for issue-resolution-verifier
- NOT_RESOLVED items now hard-override to CRITICAL in Phase 5 triage
- Include branch name terms in search keywords
- Add guidance on extracting TITLE_KEYWORDS from PR title

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@Aureliolo Aureliolo merged commit deecc39 into main Mar 6, 2026
8 of 9 checks passed
@Aureliolo Aureliolo deleted the feat/review-skill-issue-search branch March 6, 2026 08:28
```bash
# 1. Write the existing body to a temp file
tmpfile="$(mktemp)"
gh pr view NUMBER --json body --jq '.body' > "$tmpfile"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

gh --jq '.body' outputs JSON-encoded string without -r

gh pr view NUMBER --json body --jq '.body' routes through the gojq library and, for a string value, emits the JSON-encoded form — i.e. surrounded by double quotes and with special characters escaped (\", \\, etc.). Writing that output directly to $tmpfile means the file starts with a literal " and ends with a ", so gh pr edit --body-file will set the PR body to "original content" rather than original content. Any backslashes or quotes in the original body will also be double-escaped.

Use jq -r (piped) or gh's --template flag to get the raw string:

Suggested change
gh pr view NUMBER --json body --jq '.body' > "$tmpfile"
gh pr view NUMBER --json body --jq '.body' | jq -r '.' > "$tmpfile"
Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/skills/aurelio-review-pr/SKILL.md
Line: 101

Comment:
**`gh --jq '.body'` outputs JSON-encoded string without `-r`**

`gh pr view NUMBER --json body --jq '.body'` routes through the `gojq` library and, for a string value, emits the JSON-encoded form — i.e. surrounded by double quotes and with special characters escaped (`\"`, `\\`, etc.). Writing that output directly to `$tmpfile` means the file starts with a literal `"` and ends with a `"`, so `gh pr edit --body-file` will set the PR body to `"original content"` rather than `original content`. Any backslashes or quotes in the original body will also be double-escaped.

Use `jq -r` (piped) or `gh`'s `--template` flag to get the raw string:

```suggestion
   gh pr view NUMBER --json body --jq '.body' | jq -r '.' > "$tmpfile"
```

How can I resolve this? If you propose a fix, please make it concise.

gh pr view NUMBER --json body --jq '.body' > "$tmpfile"

# 2. Idempotent: only append if not already present
if ! grep -q "Closes #N" "$tmpfile"; then
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Case-sensitive idempotency check causes duplicate close keywords

grep -q "Closes #N" is case-sensitive. GitHub accepts any capitalisation of the closing keyword (closes, CLOSES, Closes, fixes, resolves, etc.). If the body already contains closes #123 (all lowercase), this guard will not match, and the script will append a second Closes #123 — resulting in two closing keywords for the same issue.

Suggested change
if ! grep -q "Closes #N" "$tmpfile"; then
if ! grep -qi "closes\s*#N\|fixes\s*#N\|resolves\s*#N" "$tmpfile"; then
Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/skills/aurelio-review-pr/SKILL.md
Line: 104

Comment:
**Case-sensitive idempotency check causes duplicate close keywords**

`grep -q "Closes #N"` is case-sensitive. GitHub accepts any capitalisation of the closing keyword (`closes`, `CLOSES`, `Closes`, `fixes`, `resolves`, etc.). If the body already contains `closes #123` (all lowercase), this guard will not match, and the script will append a second `Closes #123` — resulting in two closing keywords for the same issue.

```suggestion
   if ! grep -qi "closes\s*#N\|fixes\s*#N\|resolves\s*#N" "$tmpfile"; then
```

How can I resolve this? If you propose a fix, please make it concise.

Comment on lines +99 to +111
# 1. Write the existing body to a temp file
tmpfile="$(mktemp)"
gh pr view NUMBER --json body --jq '.body' > "$tmpfile"

# 2. Idempotent: only append if not already present
if ! grep -q "Closes #N" "$tmpfile"; then
printf '\n\nCloses #N\n' >> "$tmpfile"
fi

# 3. Update using --body-file (avoids shell interpolation)
gh pr edit NUMBER --body-file "$tmpfile"
rm -f "$tmpfile"
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

PR body is silently destroyed if gh pr view fails

There is no error guard between writing the existing body to $tmpfile (line 101) and pushing it back with --body-file (line 109). If gh pr view fails for any reason (network blip, permissions, rate-limit), $tmpfile will be empty (or contain an error message). The subsequent gh pr edit NUMBER --body-file "$tmpfile" will then overwrite the PR body with an empty string — or just \n\nCloses #N\n — silently deleting all existing content.

Additionally, if any later command fails, rm -f "$tmpfile" is never reached, leaving the temp file on disk. Add trap to handle both concerns:

tmpfile="$(mktemp)"
trap 'rm -f "$tmpfile"' EXIT

# Capture the body; abort if the fetch fails
if ! gh pr view NUMBER --json body --jq '.body' | jq -r '.' > "$tmpfile"; then
  echo "Error: could not fetch PR body. Aborting auto-link to avoid data loss." >&2
  exit 1
fi

if ! grep -qi "closes\s*#N\|fixes\s*#N\|resolves\s*#N" "$tmpfile"; then
  printf '\n\nCloses #N\n' >> "$tmpfile"
fi

gh pr edit NUMBER --body-file "$tmpfile"
Prompt To Fix With AI
This is a comment left during a code review.
Path: .claude/skills/aurelio-review-pr/SKILL.md
Line: 99-111

Comment:
**PR body is silently destroyed if `gh pr view` fails**

There is no error guard between writing the existing body to `$tmpfile` (line 101) and pushing it back with `--body-file` (line 109). If `gh pr view` fails for any reason (network blip, permissions, rate-limit), `$tmpfile` will be empty (or contain an error message). The subsequent `gh pr edit NUMBER --body-file "$tmpfile"` will then overwrite the PR body with an empty string — or just `\n\nCloses #N\n` — silently deleting all existing content.

Additionally, if any later command fails, `rm -f "$tmpfile"` is never reached, leaving the temp file on disk. Add `trap` to handle both concerns:

```bash
tmpfile="$(mktemp)"
trap 'rm -f "$tmpfile"' EXIT

# Capture the body; abort if the fetch fails
if ! gh pr view NUMBER --json body --jq '.body' | jq -r '.' > "$tmpfile"; then
  echo "Error: could not fetch PR body. Aborting auto-link to avoid data loss." >&2
  exit 1
fi

if ! grep -qi "closes\s*#N\|fixes\s*#N\|resolves\s*#N" "$tmpfile"; then
  printf '\n\nCloses #N\n' >> "$tmpfile"
fi

gh pr edit NUMBER --body-file "$tmpfile"
```

How can I resolve this? If you propose a fix, please make it concise.

Aureliolo added a commit that referenced this pull request Mar 10, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.1.1](ai-company-v0.1.0...ai-company-v0.1.1)
(2026-03-10)


### Features

* add autonomy levels and approval timeout policies
([#42](#42),
[#126](#126))
([#197](#197))
([eecc25a](eecc25a))
* add CFO cost optimization service with anomaly detection, reports, and
approval decisions
([#186](#186))
([a7fa00b](a7fa00b))
* add code quality toolchain (ruff, mypy, pre-commit, dependabot)
([#63](#63))
([36681a8](36681a8))
* add configurable cost tiers and subscription/quota-aware tracking
([#67](#67))
([#185](#185))
([9baedfa](9baedfa))
* add container packaging, Docker Compose, and CI pipeline
([#269](#269))
([435bdfe](435bdfe)),
closes [#267](#267)
* add coordination error taxonomy classification pipeline
([#146](#146))
([#181](#181))
([70c7480](70c7480))
* add cost-optimized, hierarchical, and auction assignment strategies
([#175](#175))
([ce924fa](ce924fa)),
closes [#173](#173)
* add design specification, license, and project setup
([8669a09](8669a09))
* add env var substitution and config file auto-discovery
([#77](#77))
([7f53832](7f53832))
* add FastestStrategy routing + vendor-agnostic cleanup
([#140](#140))
([09619cb](09619cb)),
closes [#139](#139)
* add HR engine and performance tracking
([#45](#45),
[#47](#47))
([#193](#193))
([2d091ea](2d091ea))
* add issue auto-search and resolution verification to PR review skill
([#119](#119))
([deecc39](deecc39))
* add memory retrieval, ranking, and context injection pipeline
([#41](#41))
([873b0aa](873b0aa))
* add pluggable MemoryBackend protocol with models, config, and events
([#180](#180))
([46cfdd4](46cfdd4))
* add pluggable MemoryBackend protocol with models, config, and events
([#32](#32))
([46cfdd4](46cfdd4))
* add pluggable PersistenceBackend protocol with SQLite implementation
([#36](#36))
([f753779](f753779))
* add progressive trust and promotion/demotion subsystems
([#43](#43),
[#49](#49))
([3a87c08](3a87c08))
* add retry handler, rate limiter, and provider resilience
([#100](#100))
([b890545](b890545))
* add SecOps security agent with rule engine, audit log, and ToolInvoker
integration ([#40](#40))
([83b7b6c](83b7b6c))
* add shared org memory and memory consolidation/archival
([#125](#125),
[#48](#48))
([4a0832b](4a0832b))
* design unified provider interface
([#86](#86))
([3e23d64](3e23d64))
* expand template presets, rosters, and add inheritance
([#80](#80),
[#81](#81),
[#84](#84))
([15a9134](15a9134))
* implement agent runtime state vs immutable config split
([#115](#115))
([4cb1ca5](4cb1ca5))
* implement AgentEngine core orchestrator
([#11](#11))
([#143](#143))
([f2eb73a](f2eb73a))
* implement basic tool system (registry, invocation, results)
([#15](#15))
([c51068b](c51068b))
* implement built-in file system tools
([#18](#18))
([325ef98](325ef98))
* implement communication foundation — message bus, dispatcher, and
messenger ([#157](#157))
([8e71bfd](8e71bfd))
* implement company template system with 7 built-in presets
([#85](#85))
([cbf1496](cbf1496))
* implement conflict resolution protocol
([#122](#122))
([#166](#166))
([e03f9f2](e03f9f2))
* implement core entity and role system models
([#69](#69))
([acf9801](acf9801))
* implement crash recovery with fail-and-reassign strategy
([#149](#149))
([e6e91ed](e6e91ed))
* implement engine extensions — Plan-and-Execute loop and call
categorization
([#134](#134),
[#135](#135))
([#159](#159))
([9b2699f](9b2699f))
* implement enterprise logging system with structlog
([#73](#73))
([2f787e5](2f787e5))
* implement graceful shutdown with cooperative timeout strategy
([#130](#130))
([6592515](6592515))
* implement hierarchical delegation and loop prevention
([#12](#12),
[#17](#17))
([6be60b6](6be60b6))
* implement LiteLLM driver and provider registry
([#88](#88))
([ae3f18b](ae3f18b)),
closes [#4](#4)
* implement LLM decomposition strategy and workspace isolation
([#174](#174))
([aa0eefe](aa0eefe))
* implement meeting protocol system
([#123](#123))
([ee7caca](ee7caca))
* implement message and communication domain models
([#74](#74))
([560a5d2](560a5d2))
* implement model routing engine
([#99](#99))
([d3c250b](d3c250b))
* implement parallel agent execution
([#22](#22))
([#161](#161))
([65940b3](65940b3))
* implement per-call cost tracking service
([#7](#7))
([#102](#102))
([c4f1f1c](c4f1f1c))
* implement personality injection and system prompt construction
([#105](#105))
([934dd85](934dd85))
* implement single-task execution lifecycle
([#21](#21))
([#144](#144))
([c7e64e4](c7e64e4))
* implement subprocess sandbox for tool execution isolation
([#131](#131))
([#153](#153))
([3c8394e](3c8394e))
* implement task assignment subsystem with pluggable strategies
([#172](#172))
([c7f1b26](c7f1b26)),
closes [#26](#26)
[#30](#30)
* implement task decomposition and routing engine
([#14](#14))
([9c7fb52](9c7fb52))
* implement Task, Project, Artifact, Budget, and Cost domain models
([#71](#71))
([81eabf1](81eabf1))
* implement tool permission checking
([#16](#16))
([833c190](833c190))
* implement YAML config loader with Pydantic validation
([#59](#59))
([ff3a2ba](ff3a2ba))
* implement YAML config loader with Pydantic validation
([#75](#75))
([ff3a2ba](ff3a2ba))
* initialize project with uv, hatchling, and src layout
([39005f9](39005f9))
* initialize project with uv, hatchling, and src layout
([#62](#62))
([39005f9](39005f9))
* Litestar REST API, WebSocket feed, and approval queue (M6)
([#189](#189))
([29fcd08](29fcd08))
* make TokenUsage.total_tokens a computed field
([#118](#118))
([c0bab18](c0bab18)),
closes [#109](#109)
* parallel tool execution in ToolInvoker.invoke_all
([#137](#137))
([58517ee](58517ee))
* testing framework, CI pipeline, and M0 gap fixes
([#64](#64))
([f581749](f581749))
* wire all modules into observability system
([#97](#97))
([f7a0617](f7a0617))


### Bug Fixes

* address Greptile post-merge review findings from PRs
[#170](https://github.com/Aureliolo/ai-company/issues/170)-[#175](https://github.com/Aureliolo/ai-company/issues/175)
([#176](#176))
([c5ca929](c5ca929))
* address post-merge review feedback from PRs
[#164](https://github.com/Aureliolo/ai-company/issues/164)-[#167](https://github.com/Aureliolo/ai-company/issues/167)
([#170](#170))
([3bf897a](3bf897a)),
closes [#169](#169)
* enforce strict mypy on test files
([#89](#89))
([aeeff8c](aeeff8c))
* harden Docker sandbox, MCP bridge, and code runner
([#50](#50),
[#53](#53))
([d5e1b6e](d5e1b6e))
* harden git tools security + code quality improvements
([#150](#150))
([000a325](000a325))
* harden subprocess cleanup, env filtering, and shutdown resilience
([#155](#155))
([d1fe1fb](d1fe1fb))
* incorporate post-merge feedback + pre-PR review fixes
([#164](#164))
([c02832a](c02832a))
* pre-PR review fixes for post-merge findings
([#183](#183))
([26b3108](26b3108))
* strengthen immutability for BaseTool schema and ToolInvoker boundaries
([#117](#117))
([7e5e861](7e5e861))


### Performance

* harden non-inferable principle implementation
([#195](#195))
([02b5f4e](02b5f4e)),
closes [#188](#188)


### Refactoring

* adopt NotBlankStr across all models
([#108](#108))
([#120](#120))
([ef89b90](ef89b90))
* extract _SpendingTotals base class from spending summary models
([#111](#111))
([2f39c1b](2f39c1b))
* harden BudgetEnforcer with error handling, validation extraction, and
review fixes
([#182](#182))
([c107bf9](c107bf9))
* harden personality profiles, department validation, and template
rendering ([#158](#158))
([10b2299](10b2299))
* pre-PR review improvements for ExecutionLoop + ReAct loop
([#124](#124))
([8dfb3c0](8dfb3c0))
* split events.py into per-domain event modules
([#136](#136))
([e9cba89](e9cba89))


### Documentation

* add ADR-001 memory layer evaluation and selection
([#178](#178))
([db3026f](db3026f)),
closes [#39](#39)
* add agent scaling research findings to DESIGN_SPEC
([#145](#145))
([57e487b](57e487b))
* add CLAUDE.md, contributing guide, and dev documentation
([#65](#65))
([55c1025](55c1025)),
closes [#54](#54)
* add crash recovery, sandboxing, analytics, and testing decisions
([#127](#127))
([5c11595](5c11595))
* address external review feedback with MVP scope and new protocols
([#128](#128))
([3b30b9a](3b30b9a))
* expand design spec with pluggable strategy protocols
([#121](#121))
([6832db6](6832db6))
* finalize 23 design decisions (ADR-002)
([#190](#190))
([8c39742](8c39742))
* update project docs for M2.5 conventions and add docs-consistency
review agent
([#114](#114))
([99766ee](99766ee))


### Tests

* add e2e single agent integration tests
([#24](#24))
([#156](#156))
([f566fb4](f566fb4))
* add provider adapter integration tests
([#90](#90))
([40a61f4](40a61f4))


### CI/CD

* add Release Please for automated versioning and GitHub Releases
([#278](#278))
([a488758](a488758))
* bump actions/checkout from 4 to 6
([#95](#95))
([1897247](1897247))
* bump actions/upload-artifact from 4 to 7
([#94](#94))
([27b1517](27b1517))
* harden CI/CD pipeline
([#92](#92))
([ce4693c](ce4693c))
* split vulnerability scans into critical-fail and high-warn tiers
([#277](#277))
([aba48af](aba48af))


### Maintenance

* add /worktree skill for parallel worktree management
([#171](#171))
([951e337](951e337))
* add design spec context loading to research-link skill
([8ef9685](8ef9685))
* add post-merge-cleanup skill
([#70](#70))
([f913705](f913705))
* add pre-pr-review skill and update CLAUDE.md
([#103](#103))
([92e9023](92e9023))
* add research-link skill and rename skill files to SKILL.md
([#101](#101))
([651c577](651c577))
* bump aiosqlite from 0.21.0 to 0.22.1
([#191](#191))
([3274a86](3274a86))
* bump pyyaml from 6.0.2 to 6.0.3 in the minor-and-patch group
([#96](#96))
([0338d0c](0338d0c))
* bump ruff from 0.15.4 to 0.15.5
([a49ee46](a49ee46))
* fix M0 audit items
([#66](#66))
([c7724b5](c7724b5))
* pin setup-uv action to full SHA
([#281](#281))
([4448002](4448002))
* post-audit cleanup — PEP 758, loggers, bug fixes, refactoring, tests,
hookify rules
([#148](#148))
([c57a6a9](c57a6a9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Aureliolo added a commit that referenced this pull request Mar 11, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.1.0](v0.0.0...v0.1.0)
(2026-03-11)


### Features

* add autonomy levels and approval timeout policies
([#42](#42),
[#126](#126))
([#197](#197))
([eecc25a](eecc25a))
* add CFO cost optimization service with anomaly detection, reports, and
approval decisions
([#186](#186))
([a7fa00b](a7fa00b))
* add code quality toolchain (ruff, mypy, pre-commit, dependabot)
([#63](#63))
([36681a8](36681a8))
* add configurable cost tiers and subscription/quota-aware tracking
([#67](#67))
([#185](#185))
([9baedfa](9baedfa))
* add container packaging, Docker Compose, and CI pipeline
([#269](#269))
([435bdfe](435bdfe)),
closes [#267](#267)
* add coordination error taxonomy classification pipeline
([#146](#146))
([#181](#181))
([70c7480](70c7480))
* add cost-optimized, hierarchical, and auction assignment strategies
([#175](#175))
([ce924fa](ce924fa)),
closes [#173](#173)
* add design specification, license, and project setup
([8669a09](8669a09))
* add env var substitution and config file auto-discovery
([#77](#77))
([7f53832](7f53832))
* add FastestStrategy routing + vendor-agnostic cleanup
([#140](#140))
([09619cb](09619cb)),
closes [#139](#139)
* add HR engine and performance tracking
([#45](#45),
[#47](#47))
([#193](#193))
([2d091ea](2d091ea))
* add issue auto-search and resolution verification to PR review skill
([#119](#119))
([deecc39](deecc39))
* add mandatory JWT + API key authentication
([#256](#256))
([c279cfe](c279cfe))
* add memory retrieval, ranking, and context injection pipeline
([#41](#41))
([873b0aa](873b0aa))
* add pluggable MemoryBackend protocol with models, config, and events
([#180](#180))
([46cfdd4](46cfdd4))
* add pluggable MemoryBackend protocol with models, config, and events
([#32](#32))
([46cfdd4](46cfdd4))
* add pluggable output scan response policies
([#263](#263))
([b9907e8](b9907e8))
* add pluggable PersistenceBackend protocol with SQLite implementation
([#36](#36))
([f753779](f753779))
* add progressive trust and promotion/demotion subsystems
([#43](#43),
[#49](#49))
([3a87c08](3a87c08))
* add retry handler, rate limiter, and provider resilience
([#100](#100))
([b890545](b890545))
* add SecOps security agent with rule engine, audit log, and ToolInvoker
integration ([#40](#40))
([83b7b6c](83b7b6c))
* add shared org memory and memory consolidation/archival
([#125](#125),
[#48](#48))
([4a0832b](4a0832b))
* design unified provider interface
([#86](#86))
([3e23d64](3e23d64))
* expand template presets, rosters, and add inheritance
([#80](#80),
[#81](#81),
[#84](#84))
([15a9134](15a9134))
* implement agent runtime state vs immutable config split
([#115](#115))
([4cb1ca5](4cb1ca5))
* implement AgentEngine core orchestrator
([#11](#11))
([#143](#143))
([f2eb73a](f2eb73a))
* implement AuditRepository for security audit log persistence
([#279](#279))
([94bc29f](94bc29f))
* implement basic tool system (registry, invocation, results)
([#15](#15))
([c51068b](c51068b))
* implement built-in file system tools
([#18](#18))
([325ef98](325ef98))
* implement communication foundation — message bus, dispatcher, and
messenger ([#157](#157))
([8e71bfd](8e71bfd))
* implement company template system with 7 built-in presets
([#85](#85))
([cbf1496](cbf1496))
* implement conflict resolution protocol
([#122](#122))
([#166](#166))
([e03f9f2](e03f9f2))
* implement core entity and role system models
([#69](#69))
([acf9801](acf9801))
* implement crash recovery with fail-and-reassign strategy
([#149](#149))
([e6e91ed](e6e91ed))
* implement engine extensions — Plan-and-Execute loop and call
categorization
([#134](#134),
[#135](#135))
([#159](#159))
([9b2699f](9b2699f))
* implement enterprise logging system with structlog
([#73](#73))
([2f787e5](2f787e5))
* implement graceful shutdown with cooperative timeout strategy
([#130](#130))
([6592515](6592515))
* implement hierarchical delegation and loop prevention
([#12](#12),
[#17](#17))
([6be60b6](6be60b6))
* implement LiteLLM driver and provider registry
([#88](#88))
([ae3f18b](ae3f18b)),
closes [#4](#4)
* implement LLM decomposition strategy and workspace isolation
([#174](#174))
([aa0eefe](aa0eefe))
* implement meeting protocol system
([#123](#123))
([ee7caca](ee7caca))
* implement message and communication domain models
([#74](#74))
([560a5d2](560a5d2))
* implement model routing engine
([#99](#99))
([d3c250b](d3c250b))
* implement parallel agent execution
([#22](#22))
([#161](#161))
([65940b3](65940b3))
* implement per-call cost tracking service
([#7](#7))
([#102](#102))
([c4f1f1c](c4f1f1c))
* implement personality injection and system prompt construction
([#105](#105))
([934dd85](934dd85))
* implement single-task execution lifecycle
([#21](#21))
([#144](#144))
([c7e64e4](c7e64e4))
* implement subprocess sandbox for tool execution isolation
([#131](#131))
([#153](#153))
([3c8394e](3c8394e))
* implement task assignment subsystem with pluggable strategies
([#172](#172))
([c7f1b26](c7f1b26)),
closes [#26](#26)
[#30](#30)
* implement task decomposition and routing engine
([#14](#14))
([9c7fb52](9c7fb52))
* implement Task, Project, Artifact, Budget, and Cost domain models
([#71](#71))
([81eabf1](81eabf1))
* implement tool permission checking
([#16](#16))
([833c190](833c190))
* implement YAML config loader with Pydantic validation
([#59](#59))
([ff3a2ba](ff3a2ba))
* implement YAML config loader with Pydantic validation
([#75](#75))
([ff3a2ba](ff3a2ba))
* initialize project with uv, hatchling, and src layout
([39005f9](39005f9))
* initialize project with uv, hatchling, and src layout
([#62](#62))
([39005f9](39005f9))
* Litestar REST API, WebSocket feed, and approval queue (M6)
([#189](#189))
([29fcd08](29fcd08))
* make TokenUsage.total_tokens a computed field
([#118](#118))
([c0bab18](c0bab18)),
closes [#109](#109)
* parallel tool execution in ToolInvoker.invoke_all
([#137](#137))
([58517ee](58517ee))
* testing framework, CI pipeline, and M0 gap fixes
([#64](#64))
([f581749](f581749))
* wire all modules into observability system
([#97](#97))
([f7a0617](f7a0617))


### Bug Fixes

* address Greptile post-merge review findings from PRs
[#170](https://github.com/Aureliolo/ai-company/issues/170)-[#175](https://github.com/Aureliolo/ai-company/issues/175)
([#176](#176))
([c5ca929](c5ca929))
* address post-merge review feedback from PRs
[#164](https://github.com/Aureliolo/ai-company/issues/164)-[#167](https://github.com/Aureliolo/ai-company/issues/167)
([#170](#170))
([3bf897a](3bf897a)),
closes [#169](#169)
* enforce strict mypy on test files
([#89](#89))
([aeeff8c](aeeff8c))
* harden Docker sandbox, MCP bridge, and code runner
([#50](#50),
[#53](#53))
([d5e1b6e](d5e1b6e))
* harden git tools security + code quality improvements
([#150](#150))
([000a325](000a325))
* harden subprocess cleanup, env filtering, and shutdown resilience
([#155](#155))
([d1fe1fb](d1fe1fb))
* incorporate post-merge feedback + pre-PR review fixes
([#164](#164))
([c02832a](c02832a))
* pre-PR review fixes for post-merge findings
([#183](#183))
([26b3108](26b3108))
* resolve circular imports, bump litellm, fix release tag format
([#286](#286))
([a6659b5](a6659b5))
* strengthen immutability for BaseTool schema and ToolInvoker boundaries
([#117](#117))
([7e5e861](7e5e861))


### Performance

* harden non-inferable principle implementation
([#195](#195))
([02b5f4e](02b5f4e)),
closes [#188](#188)


### Refactoring

* adopt NotBlankStr across all models
([#108](#108))
([#120](#120))
([ef89b90](ef89b90))
* extract _SpendingTotals base class from spending summary models
([#111](#111))
([2f39c1b](2f39c1b))
* harden BudgetEnforcer with error handling, validation extraction, and
review fixes
([#182](#182))
([c107bf9](c107bf9))
* harden personality profiles, department validation, and template
rendering ([#158](#158))
([10b2299](10b2299))
* pre-PR review improvements for ExecutionLoop + ReAct loop
([#124](#124))
([8dfb3c0](8dfb3c0))
* split events.py into per-domain event modules
([#136](#136))
([e9cba89](e9cba89))


### Documentation

* add ADR-001 memory layer evaluation and selection
([#178](#178))
([db3026f](db3026f)),
closes [#39](#39)
* add agent scaling research findings to DESIGN_SPEC
([#145](#145))
([57e487b](57e487b))
* add CLAUDE.md, contributing guide, and dev documentation
([#65](#65))
([55c1025](55c1025)),
closes [#54](#54)
* add crash recovery, sandboxing, analytics, and testing decisions
([#127](#127))
([5c11595](5c11595))
* address external review feedback with MVP scope and new protocols
([#128](#128))
([3b30b9a](3b30b9a))
* expand design spec with pluggable strategy protocols
([#121](#121))
([6832db6](6832db6))
* finalize 23 design decisions (ADR-002)
([#190](#190))
([8c39742](8c39742))
* update project docs for M2.5 conventions and add docs-consistency
review agent
([#114](#114))
([99766ee](99766ee))


### Tests

* add e2e single agent integration tests
([#24](#24))
([#156](#156))
([f566fb4](f566fb4))
* add provider adapter integration tests
([#90](#90))
([40a61f4](40a61f4))


### CI/CD

* add Release Please for automated versioning and GitHub Releases
([#278](#278))
([a488758](a488758))
* bump actions/checkout from 4 to 6
([#95](#95))
([1897247](1897247))
* bump actions/upload-artifact from 4 to 7
([#94](#94))
([27b1517](27b1517))
* bump anchore/scan-action from 6.5.1 to 7.3.2
([#271](#271))
([80a1c15](80a1c15))
* bump docker/build-push-action from 6.19.2 to 7.0.0
([#273](#273))
([dd0219e](dd0219e))
* bump docker/login-action from 3.7.0 to 4.0.0
([#272](#272))
([33d6238](33d6238))
* bump docker/metadata-action from 5.10.0 to 6.0.0
([#270](#270))
([baee04e](baee04e))
* bump docker/setup-buildx-action from 3.12.0 to 4.0.0
([#274](#274))
([5fc06f7](5fc06f7))
* bump sigstore/cosign-installer from 3.9.1 to 4.1.0
([#275](#275))
([29dd16c](29dd16c))
* harden CI/CD pipeline
([#92](#92))
([ce4693c](ce4693c))
* split vulnerability scans into critical-fail and high-warn tiers
([#277](#277))
([aba48af](aba48af))


### Maintenance

* add /worktree skill for parallel worktree management
([#171](#171))
([951e337](951e337))
* add design spec context loading to research-link skill
([8ef9685](8ef9685))
* add post-merge-cleanup skill
([#70](#70))
([f913705](f913705))
* add pre-pr-review skill and update CLAUDE.md
([#103](#103))
([92e9023](92e9023))
* add research-link skill and rename skill files to SKILL.md
([#101](#101))
([651c577](651c577))
* bump aiosqlite from 0.21.0 to 0.22.1
([#191](#191))
([3274a86](3274a86))
* bump pyyaml from 6.0.2 to 6.0.3 in the minor-and-patch group
([#96](#96))
([0338d0c](0338d0c))
* bump ruff from 0.15.4 to 0.15.5
([a49ee46](a49ee46))
* fix M0 audit items
([#66](#66))
([c7724b5](c7724b5))
* **main:** release ai-company 0.1.1
([#282](#282))
([2f4703d](2f4703d))
* pin setup-uv action to full SHA
([#281](#281))
([4448002](4448002))
* post-audit cleanup — PEP 758, loggers, bug fixes, refactoring, tests,
hookify rules
([#148](#148))
([c57a6a9](c57a6a9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: Aurelio <19254254+Aureliolo@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants