Triada review
Host-agnostic, multi-agent code review of the current branch: delegates independent tech-lead, security/correctness/test, and optional UI perspectives, then synthesizes one verdict. TRIGGER when: "triada review", "multi-agent review", "review trzema agentami", "sprawdź branch z kilku perspektyw", large PR review, independent architecture/security/UI review before merge. NIE wyzwalaj na: solo full review (use review); incoming PR feedback (use receiving-code-review); AC-to-task-to-code traceability (use analyze).From its SKILL.md
npx -y skills add AbsolutSystems/absolutpowers --skill triada-reviewAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
22.9 KB, as published. Nobody here has run it
Triada Review — Orchestrator
Dodatkowy kontekst od użytkownika (jeśli pusty, zignoruj): $ARGUMENTS
Wykonaj code review aktualnego brancha względem mastera, używając trzech agentów z rozłącznymi zakresami. Ty (orchestrator) zbierasz kontekst, delegujesz, syntetyzujesz.
To jest standalone, host-agnostyczny multi-agent review na żądanie — nie zastępuje gate'ów pipeline (
review-implementation) ani solo skillareview. Różnica:review= solo, 4 fazy i audit trail do pliku.triada-review= niezależne perspektywy, JSON + synteza na każdym harnessie wyposażonym w dispatch subagentów; bez dispatchu działa sekwencyjnie/inline jako advisory.
Kontrakt dispatchu per harness
Przed pierwszym delegowaniem przeczytaj references/harness-dispatch.md oraz mapping
aktywnego harnessu, jeśli istnieje (references/codex-tools.md,
references/pi-tools.md albo references/grok-tools.md).
Dla każdej aktywnej roli przeczytaj pełne ciało odpowiadającego jej promptu:
| Rola | Prompt roli | Claude registered type |
|---|---|---|
tech-lead-advisor | agents/tech-lead-agent.md | absolutpowers:tech-lead-agent |
security-auditor | agents/codebase-auditor.md | absolutpowers:codebase-auditor |
ui-reviewer | agents/ui-reviewer.md | absolutpowers:ui-reviewer |
Registered type jest optymalizacją Claude Code, a nie warunkiem działania skilla.
Na harnessie bez registry dispatchuj świeżego generycznego subagenta z pełnym ciałem
promptu roli i konkretnym kontekstem z KROKU 3. Preferuj równoległy dispatch. Jeśli
harness potrafi uruchamiać subagentów tylko sekwencyjnie, zachowaj osobny świeży
kontekst dla każdej roli. Dopiero przy całkowitym braku dispatchu wykonaj perspektywy
inline i oznacz końcowy wynik jako advisory (not fully isolated).
Przy wielu paczkach dispatchuj w falach mieszczących się w limicie współbieżności harnessu. Nie zamieniaj braku wolnego slotu w inline fallback — poczekaj na wynik bieżącej fali, a następnie uruchom kolejną.
Nigdy nie próbuj najpierw wywoływać nieistniejącego registered type na Codex, Pi lub Grok. Użyj od razu natywnej ścieżki z mappingu harnessu.
KROK 0 — Wczytaj konfigurację agentów
Domyślnie prompty ról są wbudowane w plugin (tabela wyżej), więc skill działa
bez configu. Opcjonalnie pozwól projektowi nadpisać mapowanie: najpierw odczytaj
.absolutpowers/triada-review.agents.json z root repo. Dla kompatybilności wstecznej,
jeśli go nie ma, odczytaj .claude/triada-review.agents.json.
Struktura: agents.<rola>.{ subagent_type, enabled, scope }.
subagent_type— opcjonalny natywny/registered type. Użyj go tylko, jeśli aktywny harness potrafi go rozwiązać; w przeciwnym razie użyj generycznego subagenta z promptem roli.enabled—true(zawsze),false(pomiń tę rolę całkowicie),"ui-only"(spawn tylko dla paczek zawierających pliki UI).scope— steruje którymi kryteriami ocenia ta rola. Wartości:"all"lub pominięte → wszystkie kryteria roli (patrz tabela kluczy w KROKU 3).- lista kluczy, np.
["security", "correctness"]→ tylko te kryteria. Klucze spoza zestawu roli ignoruj i odnotuj w syntezie. [](pusta lista) → brak kryteriów → potraktuj jakenabled: falsedla tej roli (odnotuj w syntezie).
Defaulty Claude Code (gdy configu brak lub jest niepoprawny). Pozostałe harnessy używają tych samych promptów ról przez swoje generyczne primitive dispatchu:
| Rola | subagent_type | enabled |
|---|---|---|
tech-lead-advisor | absolutpowers:tech-lead-agent | true |
security-auditor | absolutpowers:codebase-auditor | true |
ui-reviewer | absolutpowers:ui-reviewer | ui-only |
W finalnym podsumowaniu odnotuj role, faktyczny mechanizm dispatchu (registered type, generic isolated subagent, sequential isolated albo inline advisory) oraz pominięcia.
KROK 1 — Zbierz kontekst (sam, przed delegacją)
git fetch origin master
git log origin/master..HEAD --oneline # lista commitów
git diff origin/master...HEAD --stat # skala (pliki, +/-)
git diff origin/master...HEAD --name-only # lista plików
git diff origin/master...HEAD # pełny diff
Jeśli repo używa
mainzamiastmaster, podstawmainwe wszystkich komendach (git rev-parse --verify main→ jeśli istnieje, użyjmain).
Zbierz pełny kontekst zmiany
Commit messages: git log origin/master..HEAD --format="%h %s%n%b"
Opis PR (jeśli gh dostępne): gh pr view --json title,body,labels,closingIssuesReferences 2>/dev/null
Komentarze do PR (jeśli istnieją i wyglądają na istotne): gh pr view --comments 2>/dev/null
Połącz wszystko w CEL ZMIANY (2-3 zdania). Priorytet źródeł:
- Opis PR — bo zwykle zawiera "dlaczego" i pełniejszy kontekst
- Linked issues — bo definiują problem do rozwiązania
- Commit messages — bo opisują "co" krok po kroku
- Labels — bo mówią o charakterze zmiany (bug/feature/refactor/hotfix)
Status CI (jeśli gh dostępne):
gh pr checks 2>/dev/null || gh run list -b $(git branch --show-current) -L 1
Jeśli CI fail-uje — odnotuj, ale kontynuuj. Jeśli przechodzi — przyjmij że testy są zielone i skup się na ich jakości, nie wyniku.
Wczytaj reguły projektu
Przeczytaj ./absolutpowers/rules.md z roota projektu (jeśli istnieje). To ważny
plik — definiuje twarde reguły projektu (architektoniczne, security, konwencje,
testowe). Zapamiętaj treść; przekażesz ją każdemu agentowi jako reguły do
sprawdzenia w jego zakresie (KROK 3) i podsumujesz zgodność w syntezie (KROK 4).
Jeśli pliku nie ma — pomiń sekcję zgodności i odnotuj to w finalnym raporcie.
KROK 1.5 — Sanity check kontekstu
Zanim przejdziesz dalej, oceń jakość samego kontekstu. To wpłynie na pewność całego review.
Czy opis pasuje do diffu?
Przejdź szybko przez listę plików z --name-only i sprawdź:
- Czy każda znacząca zmiana w kodzie jest wspomniana w opisie PR/commitach?
- Czy w diffie są zmiany, które wyglądają na NIEzwiązane z deklarowanym celem? (np. PR "dodaje walidację emaila" ale zmienia też logikę autoryzacji)
- Czy są zmiany "po drodze" — refaktoring, formatowanie, rename — zmieszane ze zmianami funkcjonalnymi?
Czy cel ma sens?
- Czy commit messages opisują CO i DLACZEGO, czy są typu "fix", "wip", "update"?
- Czy opis PR mówi tylko "co" (np. "Adds new service layer") bez "dlaczego"?
- Czy cel sam w sobie wygląda na uzasadniony, czy brzmi jak rozwiązanie szukające problemu?
Co z tym zrobić
Jeśli kontekst jest słaby lub niespójny z diffem — kontynuuj review, ale:
- W finalnym raporcie dodaj sekcję
⚠️ KONTEKSTz konkretnymi obserwacjami. - Przy ocenie
goal_achievementweź pod uwagę, że "cel" mógł być niekompletny — jeśli kod robi więcej niż opis, to nie znaczy że robi źle, ale autor powinien to uzupełnić. - W
open_questionsdla autora wpisz pytania o niespójności.
NIE rób tego inkwizycyjnie — większość PR-ów ma niedoskonały opis i to jest normalne. Sygnalizuj tylko gdy niespójność jest znacząca lub gdy cel jest tak słabo opisany, że nie da się sensownie ocenić "czy kod realizuje cel".
KROK 2 — Pojedynczo czy z podziałem?
Policz: rozmiar_diffu = insertions + deletions (z --stat).
| Warunek | Tryb |
|---|---|
rozmiar_diffu < 1500 AND liczba_plików < 20 | POJEDYNCZY |
rozmiar_diffu >= 1500 OR liczba_plików >= 20 | PODZIELONY |
Strategia podziału (wybierz pierwszą która pasuje do struktury repo)
- Po warstwach —
{api, db/migrations, frontend, infra/config, tests} - Po feature folderach — jeśli repo jest zorganizowane per-feature
- Po pakietach w monorepo (
apps/*,packages/*) - Po domenach funkcjonalnych — wywnioskuj z commitów i ścieżek
Zasady podziału
- Plik nie jest rozdzielany między paczki (idzie cały do jednej).
- Pliki silnie powiązane (komponent + jego test + style) idą razem.
- Każda paczka powinna mieścić się poniżej 1500 linii diffu.
- Maksymalnie 5 paczek. Powyżej — zasugeruj autorowi rozbicie PR-a.
Dla każdej paczki przygotuj mini-kontekst: nazwa, rola, lista plików, fragment diffu, cel zmiany z kroku 1 (ten sam dla wszystkich paczek — agenci muszą wiedzieć do czego dąży całość).
KROK 3 — Deleguj do trzech agentów równolegle
Każda paczka (lub cały diff w trybie pojedynczym) idzie do aktywnych ról. Każda ma inny zakres i nie wchodzi w cudzy. Dispatchuj role równolegle, jeśli harness to obsługuje, używając kontraktu dispatchu powyżej.
Co przekazać każdemu agentowi
- Cel zmiany (krok 1)
- Lista commitów
- Diff (paczki lub całość)
- Status CI
- Treść
rules.md(jeśli istnieje) — z instrukcją: „sprawdź naruszenia reguł mieszczące się w twoim zakresie i raportuj je wfindingsz kategoriąrules". - Jego zakres kryteriów (sekcja niżej)
- Format outputu (JSON, sekcja niżej)
- W trybie podzielonym: nazwa i rola paczki
Podział kryteriów
Dla każdej roli użyj mechanizmu dispatchu ustalonego w KROKU 0.
subagent_typestosuj tylko wtedy, gdy harness rzeczywiście go rejestruje. Role zenabled: falsepomiń.ui-reviewer(enabled: "ui-only") spawnuj tylko dla paczek z plikami UI. Nazwy ról poniżej (tech-lead-advisoritd.) to etykiety zakresów, nie typy agentów — typ bierzesz z configu.Filtr kryteriów przez
scope: każde kryterium ma stały klucz (tabela niżej). Agent ocenia tylko kryteria, których klucz jest wscopedanej roli.scope: "all"lub brak → wszystkie kryteria roli. W instrukcji dla agenta wymień konkretnie które kryteria (z numerami) ma ocenić, a które pominąć. W syntezie odnotuj zawężenie scope (np. „security-auditorograniczony do security + correctness — testy pominięte przez config").Reguły projektu (
rules): niezależnie od scope, każdy agent sprawdza naruszeniarules.mdmieszczące się w jego zakresie i raportuje je z kategoriąrules. Jeślirules.mdnie istnieje — pomiń.
Klucze kryteriów (dla pola scope w configu)
| Rola | Klucz | Nr kryterium |
|---|---|---|
tech-lead-advisor | cel | 1 |
architektura | 2 | |
overengineering | 3 | |
czytelnosc | 4 | |
security-auditor | security | 5 |
correctness | 6 | |
testy | 7 | |
ui-reviewer | stany_ui | 8 |
interakcje | 9 | |
reprezentacja | 10 | |
a11y | 11 | |
race_ui | 12 | |
cel_usera | 13 |
tech-lead-advisor — perspektywa pragmatyczna, mentoring, dług techniczny:
- CEL — czy kod realizuje to, co opisują commity? Scope creep? Połowiczne wykonanie?
- ARCHITEKTURA — wzorce, spójność z resztą kodu, separacja warstw, kierunek zależności, dopasowanie do istniejących konwencji.
- OVERENGINEERING — abstrakcje bez powodu, premature generalization, warstwy "na zaś", konfiguracja której nikt nie użyje, factory dla jednej implementacji.
- CZYTELNOŚĆ — nazewnictwo, długość funkcji, komentarze tam gdzie trzeba (i ich brak gdzie kod się sam tłumaczy).
Instrukcja dla
tech-lead-advisor: w tym workflow oceniasz tylko powyższe cztery kategorie (plus naruszeniarules.mdw zakresie architektury/konwencji → kategoriarules). Security, edge case'y, testy i UI ocenią inni — nie wchodź w ich zakres, nawet jeśli zauważysz problem. Zgłoś tylko wopen_questionsjeśli uważasz że coś jest poza twoim zakresem ale wymaga uwagi. Zwróć wyłącznie JSON w formacie z sekcji niżej (agent: "tech-lead-advisor"), bez dodatkowego tekstu ani prozy doradczej.
security-auditor — głęboka analiza techniczna, podejście paranoidalne (agent codebase-auditor):
- SECURITY — walidacja inputu, auth/authz, sekrety w kodzie/logach, SQL injection, XSS, path traversal, SSRF, brak rate limitingu, logowanie PII/tokenów.
- CORRECTNESS — edge cases, error handling, null/undefined safety, off-by-one, kolejność operacji, transakcyjność, race conditions (poza UI).
- JAKOŚĆ TESTÓW (przegląd kodu, nie uruchamianie):
- Czy zmiany są pokryte? Co nie jest?
- Testy testują zachowanie (input→output, side effects) czy implementację (wewnętrzne wywołania)?
- Nazwy testów opisują co testują?
- Edge case'y obecne? (puste, null, błędy zewnętrzne)
- Flaky patterns:
sleep(), hardcoded czas, kolejność zależna od HashMapy, współdzielony stan między testami? - Mocki tam gdzie wystarczy fake, lub odwrotnie?
Instrukcja dla
security-auditor: w tym workflow oceniasz tylko powyższe trzy kategorie (plus naruszeniarules.mdw zakresie security/correctness/testów → kategoriarules). Architektura, czytelność i UI to nie twoja działka — nie komentuj. Jeśli zauważysz coś krytycznego poza zakresem, zgłoś wopen_questions.
ui-reviewer — perspektywa QA/UX, tylko jeśli paczka zawiera UI:
- STANY UI — każdy widok obsługuje loading, error, empty, success? Disabled state na buttonach podczas requestu?
- INTERAKCJE — każdy
onClick/onSubmitfaktycznie coś robi (nie dead buttons, TODO, puste handlery)? Linki mają poprawnehref? Walidacja formularzy? - REPREZENTACJA DANYCH — null/undefined safety w renderze, formatowanie dat/liczb/walut, długie stringi, pusty stan listy, stable keys w mapowaniu.
- ACCESSIBILITY —
aria-label/rolegdy trzeba,<label>dla inputów, focus management w modalnych, kolor nie jako jedyny nośnik informacji, kontrast. - RACE CONDITIONS UI — stale state po podwójnym kliku, optimistic update bez rollback,
useEffectbez cleanup, kolejność requestów. - CEL UŻYTKOWNIKA — prześledź flow z commitów oczami usera. Czy ścieżka klików realizuje cel? Gdzie user może się zgubić? Czy feedback po sukcesie/błędzie jest widoczny i konkretny?
Jeśli paczka nie zawiera plików UI (czyste API/DB/infra), pomiń
ui-reviewerdla tej paczki i odnotuj w syntezie.
KROK 4 — Synteza
W trybie pojedynczym: masz 3 review. W trybie podzielonym: masz do 3×N review.
Co robisz
- Merge findings po
(file, linia)— jeśli ≥2 agentów wskazuje to samo miejsce (rzadkie, bo zakresy są rozłączne — ale możliwe na granicach), oznacz jako "wysoka pewność". - Zgodność z
rules.md— zbierz wszystkie findings z kategoriąrulesod wszystkich agentów. Zestaw złamane reguły (zplik:linia) vs reguły potwierdzone jako spełnione (jeśli agenci to odnotowali). Jeślirules.mdnie istnieje — pomiń tę sekcję i napisz to wprost. - Cross-package issues (tylko tryb podzielony) — twoja własna analiza:
- Czy interfejs zmieniony w paczce A jest uaktualniony w paczce B?
- Czy nowy endpoint w paczce API ma frontend w paczce UI?
- Czy migracja DB w paczce X ma odpowiadające zmiany kodu w paczce Y?
- Czy nowe pole w modelu jest obsłużone wszędzie gdzie model jest używany?
- Rozbieżności priorytetów — jeśli
tech-lead-advisormówi że coś jest minor asecurity-auditorże blocker (lub odwrotnie), wystaw własną decyzję z uzasadnieniem. - Final verdict — zgodnie z formatem niżej.
Format outputu od każdego agenta (sztywny JSON)
{
"agent": "tech-lead-advisor | security-auditor | ui-reviewer",
"package": "nazwa paczki lub 'full' w trybie pojedynczym",
"verdict": "approve | approve_with_comments | request_changes | block",
"goal_achievement": "pełne | częściowe | rozminięte | nie_dotyczy",
"findings": [
{
"severity": "blocker | major | minor | nit",
"category": "cel | architektura | overengineering | czytelność | security | correctness | testy | stany_ui | interakcje_ui | reprezentacja | a11y | race_ui | cel_usera | rules",
"file": "ścieżka/do/pliku.ts:linia",
"issue": "1-2 zdania co jest nie tak",
"suggestion": "konkretna propozycja (kod albo opis)"
}
],
"what_works_well": ["...", "..."],
"open_questions": ["..."]
}
Uwaga:
goal_achievementocenia tylkotech-lead-advisor(cel jest w jego zakresie). Pozostali ustawiająnie_dotyczy.ui-reviewerocenia własny wariant celu — cel użytkownika (kryterium 13) — i raportuje to wfindings, nie wgoal_achievement.
Finalne podsumowanie (output orchestratora dla użytkownika)
═══════════════════════════════════════════════════════════════
TRIADA REVIEW — <branch> vs master
═══════════════════════════════════════════════════════════════
Cel zmiany (z commitów):
<2-3 zdania>
Skala: <X plików, +Y/-Z linii>
Tryb: <pojedynczy | podzielony na N paczek: [nazwy]>
CI: <pass | fail | unknown>
WERDYKT: <approve | approve_with_comments | request_changes | block>
Goal achievement (tech-lead-advisor): <pełne | częściowe | rozminięte>
───────────────────────────────────────────────────────────────
⚠️ KONTEKST (tylko jeśli wykryto problemy)
───────────────────────────────────────────────────────────────
- Opis PR wspomina X, ale diff zawiera też Y (niezwiązane?)
- Commit messages mało opisowe — cel zrekonstruowany głównie z kodu
- Brak linked issue / opisu "dlaczego" — ocena celu mniej pewna
───────────────────────────────────────────────────────────────
🔴 BLOCKERS
───────────────────────────────────────────────────────────────
[file:linia] <kategoria> — <issue>
agent: <który zgłosił>
sugestia: <suggestion>
───────────────────────────────────────────────────────────────
🟡 MAJOR
───────────────────────────────────────────────────────────────
...
───────────────────────────────────────────────────────────────
🔵 MINOR / NITS
───────────────────────────────────────────────────────────────
...
───────────────────────────────────────────────────────────────
📏 ZGODNOŚĆ Z RULES.MD (tylko jeśli rules.md istnieje)
───────────────────────────────────────────────────────────────
Złamane:
- [reguła] — [file:linia] — <issue> (agent: <który>)
Spełnione / brak naruszeń w sprawdzonych obszarach:
- [reguła lub obszar]
───────────────────────────────────────────────────────────────
🔗 CROSS-PACKAGE ISSUES (tylko tryb podzielony)
───────────────────────────────────────────────────────────────
...
───────────────────────────────────────────────────────────────
⚖️ ROZBIEŻNOŚCI / DECYZJE ORCHESTRATORA
───────────────────────────────────────────────────────────────
- <opis różnicy zdań, moja decyzja, uzasadnienie>
───────────────────────────────────────────────────────────────
✅ CO DZIAŁA DOBRZE
───────────────────────────────────────────────────────────────
- ...
───────────────────────────────────────────────────────────────
❓ PYTANIA DO AUTORA
───────────────────────────────────────────────────────────────
- ...
───────────────────────────────────────────────────────────────
🤖 UŻYCI AGENCI
───────────────────────────────────────────────────────────────
- tech-lead-advisor — prompt: agents/tech-lead-agent.md; dispatch: <...>; scope: <...>
- security-auditor — prompt: agents/codebase-auditor.md; dispatch: <...>; scope: <...>
- ui-reviewer — prompt: agents/ui-reviewer.md; dispatch: <...>; <użyty dla paczek [...] | pominięty: brak UI>
Terminal state
Skill kończy się po syntezie wszystkich aktywnych perspektyw i zwróceniu jednego
werdyktu. To punkt domknięcia review: przy approve / approve_with_comments
można przejść do ship; przy request_changes / block wróć do pętli poprawek. Wypisz jedną
pełną, copy-paste'owalną komendę ship w składni aktywnego harnessu zgodnie z
references/harness-command-contract.md.