feat: add issue auto-search and resolution verifier to PR review skill#119
feat: add issue auto-search and resolution verifier to PR review skill#119
Conversation
…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>
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.Scanned FilesNone |
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the 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 configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughThis 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
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Summary of ChangesHello, 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
Changelog
Activity
Using Gemini Code AssistThe 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
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 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
|
There was a problem hiding this comment.
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: ") |
There was a problem hiding this comment.
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 SummaryThis PR enhances the However, three bugs remain in the newly introduced linking procedure:
Confidence Score: 2/5
Important Files Changed
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
Last reviewed commit: b66217e |
There was a problem hiding this comment.
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-verifieragent 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.
| # 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 |
There was a problem hiding this comment.
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).
| # 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 |
| 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 |
There was a problem hiding this comment.
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).
| 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]}' |
| 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: |
There was a problem hiding this comment.
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.
| 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:
| - 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." |
There was a problem hiding this comment.
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).
| - **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." |
There was a problem hiding this comment.
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
📒 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>
| ```bash | ||
| # 1. Write the existing body to a temp file | ||
| tmpfile="$(mktemp)" | ||
| gh pr view NUMBER --json body --jq '.body' > "$tmpfile" |
There was a problem hiding this 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:
| 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 |
There was a problem hiding this 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.
| 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.| # 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" | ||
| ``` |
There was a problem hiding this 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:
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.🤖 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).
🤖 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>
Summary
closes #Nkeyword, it now searches for a matching issue by PR title keywords instead of immediately warninggh pr edit --body; ambiguous matches are presented to the user for selectionChanges
Only
.claude/skills/aurelio-review-pr/SKILL.md— no source code changes.Phase 2 — Issue linkage
No closing keyword + no partial signalsnow triggers a 4-step search: query open/closed issues → evaluate candidates → auto-link or ask user → fall back to warningPhase 3 — New agent
issue-resolution-verifieradded to the agent table (runs when issue is linked)Test plan
/aurelio-review-pron a PR with a closing keyword — verify existing behavior unchanged/aurelio-review-pron a PR without a closing keyword — verify it searches and auto-links/aurelio-review-pron a PR with ambiguous matches — verify AskUserQuestion is used