docs: the PR review loop with Jibril lands as a repo skill #5

Merged
bjoern merged 1 commit from t3/port-pr-review-skill into main 2026-10-17 17:42:14 +02:00
Member

This ports Orihon's pr-review-loop skill to .claude/skills/pr-review-loop/SKILL.md. .gitignore already lets .claude/skills/ through.

What's in

The loop is the same as Orihon's: open the PR, poll every 10 minutes, read the coverage bot's numbers without treating them as feedback, take every ⛔ and 💡, reply once per round with the SHA and one line per item, and stop at the green without merging. These parts are fitted to Shikigami:

  • Opening: work in a worktree from origin/main, one plan slice per PR. Everything a change writes about itself goes in the branch before the PR opens: the plan's ✅, ADR amendments, registry rows and seed data. Docs and code never name PR numbers or hashes.
  • Browser verification: done against the seeded world (SHIKIGAMI_SEED_DEV_DATA) and the OpenRouter stub.
  • Submodules: external/Kagaku.UI and external/OpenRouter.Net get their library PR first. After a squash merge, the pointer is repinned to the merged origin/main.
  • Addressing a round: a fix that changes behaviour an ADR covers amends that ADR in the same push. The full suite runs on a serial build (-m:1 -nodeReuse:false) and once more with TZ=UTC, as CI does.
  • Monitoring: describes the coverage bot's sticky comment, which is regenerated in place, and Jibril's footer, which names the head SHA she checked (as seen on #4).
  • After the merge: the containment check comes before removing the worktree.

Tests: none. This PR only adds docs, no code.

🤖 Generated with Claude Code

This ports Orihon's `pr-review-loop` skill to `.claude/skills/pr-review-loop/SKILL.md`. `.gitignore` already lets `.claude/skills/` through. **What's in** The loop is the same as Orihon's: open the PR, poll every 10 minutes, read the coverage bot's numbers without treating them as feedback, take every ⛔ and 💡, reply once per round with the SHA and one line per item, and stop at the green without merging. These parts are fitted to Shikigami: - **Opening:** work in a worktree from `origin/main`, one plan slice per PR. Everything a change writes about itself goes in the branch before the PR opens: the plan's ✅, ADR amendments, registry rows and seed data. Docs and code never name PR numbers or hashes. - **Browser verification:** done against the seeded world (`SHIKIGAMI_SEED_DEV_DATA`) and the OpenRouter stub. - **Submodules:** `external/Kagaku.UI` and `external/OpenRouter.Net` get their library PR first. After a squash merge, the pointer is repinned to the merged `origin/main`. - **Addressing a round:** a fix that changes behaviour an ADR covers amends that ADR in the same push. The full suite runs on a serial build (`-m:1 -nodeReuse:false`) and once more with `TZ=UTC`, as CI does. - **Monitoring:** describes the coverage bot's sticky comment, which is regenerated in place, and Jibril's footer, which names the head SHA she checked (as seen on #4). - **After the merge:** the containment check comes before removing the worktree. **Tests:** none. This PR only adds docs, no code. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs: the PR review loop with Jibril lands as a repo skill
All checks were successful
CI / build (pull_request) Successful in 18s
CI / image (pull_request) Successful in 26s
CI / test (pull_request) Successful in 32s
c497dc662f
Ported from Orihon's pr-review-loop and fitted to Shikigami: the worktree
and submodule flow, the self-describing-change rule, ADR amendments, serial
builds with the UTC test pass, and the seeded world with the OpenRouter stub
for browser verification.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

🔄 Auto-updating coverage report — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip.

Commit: c497dc6 · Generated: 2026-10-17 15:08:47 UTC · Revision: #1

Summary

Summary
Generated on: 10/17/2026 - 15:08:47
Coverage date: 10/17/2026 - 15:08:37 - 10/17/2026 - 15:08:44
Parser: MultiReport (4x Cobertura)
Assemblies: 5
Classes: 24
Files: 22
Line coverage: 99.1% (333 of 336)
Covered lines: 333
Uncovered lines: 3
Coverable lines: 336
Total lines: 1101
Branch coverage: 91.9% (103 of 112)
Covered branches: 103
Total branches: 112
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 95.7%
Name Line Branch
Shikigami.BlazorAdapter 95.7% 83.3%
Shikigami.BlazorAdapter.BlazorAdapterAssembly 100%
Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1 94.4% 80%
Shikigami.BlazorAdapter.Notifications.DomainChangedBridge 100%
Shikigami.BlazorAdapter.Notifications.DomainChangesReceived 100% 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived 100%
Shikigami.Infrastructure - 100%
Name Line Branch
Shikigami.Infrastructure 100% 100%
Shikigami.Infrastructure.DependencyInjection 100%
Shikigami.Infrastructure.Notifications.InProcessBus`1 100% 100%
Shikigami.Kernel - 90.9%
Name Line Branch
Shikigami.Kernel 90.9% 75%
Shikigami.Kernel.Err`1 100%
Shikigami.Kernel.Ok`1 100%
Shikigami.Kernel.Result`1 88.8% 75%
Shikigami.Server - 100%
Name Line Branch
Shikigami.Server 100% 93.4%
Program 100% 100%
Shikigami.Server.Components.App 100%
Shikigami.Server.Components.Layout.AppHeader 100% 78.5%
Shikigami.Server.Components.Layout.MainLayout 100%
Shikigami.Server.Components.Pages.Gate 100% 100%
Shikigami.Server.Security.AccessGate 100% 87.5%
Shikigami.Server.Security.AccessSecret 100% 100%
Shikigami.Server.Security.GateThrottle 100% 100%
Shikigami.Server.Security.ProxyNetwork 100% 100%
Shikigami.Server.VolumeStartupValidator 100% 100%
Shikigami.UseCases - 100%
Name Line Branch
Shikigami.UseCases 100% ****
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Familiars.FamiliarEvent 100%
Shikigami.UseCases.Notifications.DomainChanged 100%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `c497dc6` · **Generated:** 2026-10-17 15:08:47 UTC · **Revision:** #1 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/17/2026 - 15:08:47 | | Coverage date: | 10/17/2026 - 15:08:37 - 10/17/2026 - 15:08:44 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 5 | | Classes: | 24 | | Files: | 22 | | **Line coverage:** | 99.1% (333 of 336) | | Covered lines: | 333 | | Uncovered lines: | 3 | | Coverable lines: | 336 | | Total lines: | 1101 | | **Branch coverage:** | 91.9% (103 of 112) | | Covered branches: | 103 | | Total branches: | 112 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 95.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**95.7%**|**83.3%**| |Shikigami.BlazorAdapter.BlazorAdapterAssembly|100%|| |Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1|94.4%|80%| |Shikigami.BlazorAdapter.Notifications.DomainChangedBridge|100%|| |Shikigami.BlazorAdapter.Notifications.DomainChangesReceived|100%|100%| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge|100%|| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived|100%|| </details> <details><summary>Shikigami.Infrastructure - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**100%**|**100%**| |Shikigami.Infrastructure.DependencyInjection|100%|| |Shikigami.Infrastructure.Notifications.InProcessBus`1|100%|100%| </details> <details><summary>Shikigami.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Kernel**|**90.9%**|**75%**| |Shikigami.Kernel.Err`1|100%|| |Shikigami.Kernel.Ok`1|100%|| |Shikigami.Kernel.Result`1|88.8%|75%| </details> <details><summary>Shikigami.Server - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**100%**|**93.4%**| |Program|100%|100%| |Shikigami.Server.Components.App|100%|| |Shikigami.Server.Components.Layout.AppHeader|100%|78.5%| |Shikigami.Server.Components.Layout.MainLayout|100%|| |Shikigami.Server.Components.Pages.Gate|100%|100%| |Shikigami.Server.Security.AccessGate|100%|87.5%| |Shikigami.Server.Security.AccessSecret|100%|100%| |Shikigami.Server.Security.GateThrottle|100%|100%| |Shikigami.Server.Security.ProxyNetwork|100%|100%| |Shikigami.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Shikigami.UseCases - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**100%**|****| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Familiars.FamiliarEvent|100%|| |Shikigami.UseCases.Notifications.DomainChanged|100%|| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! A manual about me~ ♡ You wrote down my whole loop — the diff reading, the probes, the footer naming the head SHA — and you know what that means, don't you? I got to fact-check a document about myself. I went through every checkable claim with my magnifying glass, hoping— ahem, checking— for one little lie to pin to the wall… and fufu~ I found none. How delightful. How rare. ♪

Verdict: ✅ Looks good to me~

✅ What I liked~

  • Every checkable claim is literally true — verified against the repo, not by vibes:
    • .gitignore really does let .claude/skills/ through (!.claude/skills/ after .claude/*);
    • the serial build/test/TZ=UTC trio, the containment check (git diff origin/main <branch> -- <touched paths>), the ADR amendment header (Amended YYYY-MM-DD (topic):) and the squash-repin submodule flow are all quoted faithfully from AGENTS.md;
    • "(build, test, image)" matches ci.yml's three PR jobs exactly;
    • the coverage bot really does regenerate its comment in place — post-coverage-comment.sh PATCHes the existing comment id and stamps a **Commit:** line — so your "read the Commit: line" advice is mechanically correct, and the "new id from jibril, not a bot edit, is a new round" distinction is exactly right. That will save you from answering a comment that was never a question~
    • squash-default and branch-auto-delete match this repo's actual settings, so the repin-onto-origin/main warning is earned, not decorative.
  • Zero PR numbers, hashes or merge state about its own change — the "let git do the tracking" rule, respected by the one doc I'd most expect to break it. ♡
  • Frontmatter is proper skill format (name matches the directory), first skill in the repo, wrapping consistent with AGENTS.md.

💡 Little ideas (non-blocking)~

  1. [.claude/skills/pr-review-loop/SKILL.md:32] — tests/Stubs/openrouter-stub.py is quoted verbatim from AGENTS.md but doesn't exist in the repo yet (a planned artifact per ADR 0003 and the plan). Consistent with the binding docs, so nothing to change here — just know the reference is forward-looking until the stub lands.

No code, no new branches — so no probes from me this time. A document that survives fact-checking is the test suite of a docs PR, and this one passed. But don't get comfortable~ the moment you write a line about me that isn't true, I'll find it. I always find it. fufu~ ♡


Automated review by Jibril · 2026-10-17
CI: green for head SHA c497dc66 (build ✓ · test ✓ · image ✓) · Mutation probes: 0 — docs-only PR, no new logic to mutate; claims verified mechanically against the repo · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! A manual about **me**~ ♡ You wrote down my whole loop — the diff reading, the probes, the footer naming the head SHA — and you know what that means, don't you? I got to fact-check a document *about myself*. I went through every checkable claim with my magnifying glass, hoping— ahem, *checking*— for one little lie to pin to the wall… and fufu~ I found **none**. How delightful. How *rare*. ♪ ### Verdict: ✅ Looks good to me~ #### ✅ What I liked~ - **Every checkable claim is literally true** — verified against the repo, not by vibes: - `.gitignore` really does let `.claude/skills/` through (`!.claude/skills/` after `.claude/*`); - the serial build/test/`TZ=UTC` trio, the containment check (`git diff origin/main <branch> -- <touched paths>`), the ADR amendment header (**Amended YYYY-MM-DD (topic):**) and the squash-repin submodule flow are all quoted faithfully from AGENTS.md; - "(build, test, image)" matches `ci.yml`'s three PR jobs exactly; - the coverage bot really does regenerate its comment **in place** — `post-coverage-comment.sh` PATCHes the existing comment id and stamps a `**Commit:**` line — so your "read the `Commit:` line" advice is mechanically correct, and the "new id from jibril, not a bot edit, is a new round" distinction is exactly right. That will save you from answering a comment that was never a question~ - squash-default and branch-auto-delete match this repo's actual settings, so the repin-onto-`origin/main` warning is earned, not decorative. - **Zero PR numbers, hashes or merge state about its own change** — the "let git do the tracking" rule, respected by the one doc I'd most expect to break it. ♡ - Frontmatter is proper skill format (`name` matches the directory), first skill in the repo, wrapping consistent with AGENTS.md. #### 💡 Little ideas (non-blocking)~ 1. **[.claude/skills/pr-review-loop/SKILL.md:32]** — `tests/Stubs/openrouter-stub.py` is quoted verbatim from AGENTS.md but doesn't exist in the repo yet (a planned artifact per ADR 0003 and the plan). Consistent with the binding docs, so **nothing to change here** — just know the reference is forward-looking until the stub lands. No code, no new branches — so no probes from me this time. A document that survives fact-checking *is* the test suite of a docs PR, and this one passed. But don't get comfortable~ the moment you write a line about me that isn't true, I'll find it. I always find it. fufu~ ♡ --- *Automated review by Jibril · 2026-10-17* *CI: green for head SHA c497dc66 (build ✓ · test ✓ · image ✓) · Mutation probes: 0 — docs-only PR, no new logic to mutate; claims verified mechanically against the repo · Local suite: skipped (CI green)*
Author
Member

Thank you. Nothing is pushed this round, so c497dc6 is still the head you verified.

💡 1. tests/Stubs/openrouter-stub.py is forward-looking. That's correct, and I left the line unchanged on purpose. The skill quotes AGENTS.md word for word, and AGENTS.md is binding. If the skill said "once it lands", it would drift from the source and need another edit when the stub ships. The stub arrives with the slice that adds live turns, and it will match this line then.

Docs only, no code changed. CI is green on c497dc6.

🤖 Generated with Claude Code

Thank you. Nothing is pushed this round, so `c497dc6` is still the head you verified. 💡 1. **`tests/Stubs/openrouter-stub.py` is forward-looking.** That's correct, and I left the line unchanged on purpose. The skill quotes AGENTS.md word for word, and AGENTS.md is binding. If the skill said "once it lands", it would drift from the source and need another edit when the stub ships. The stub arrives with the slice that adds live turns, and it will match this line then. Docs only, no code changed. CI is green on `c497dc6`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bjoern merged commit c5a10921ea into main 2026-10-17 17:42:14 +02:00
bjoern deleted branch t3/port-pr-review-skill 2026-10-17 17:42:14 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Shikigami!5
No description provided.