From matematic-patron-pr-review-pl
Recenzent PR/diffow dla PATRONa - polski LegalTech AI agent dla kancelarii. Wylapuje regresje specyficzne dla repo PATRON ktorych nie zlapie generyczny lint - org scoping multi-tenant, authless routes, niespodzianki w migracjach SQLite/Postgres, bezposredni SQL poza warstwa db, brak worker sync w cache, UI bez generated SDK, sekrety w logach, regresje audit_log, brak grounding cytatow, AI Act art. 12 record-keeping. Format findings file:line -> problem -> correct pattern, 3 buckets Blocker/Should-fix/Nit. Cherry-pick struktury z dograh v1.31.0 review-pr (BSD-2). Uzywaj gdy - recenzja PR/diff PATRON przed merge, code review pre-commit, audyt zmian w mcp-security-gateway/audit_log/ring-policy/auth, review zmian w MCP serverach matematicsolutions/*, weryfikacja czy nowy kod nie wprowadza wyciekow danych klienta kancelarii (RODO/tajemnica adwokacka), audyt drift dokumentacji vs kod. Trigger - "marko review PR", "code review PATRON", "audyt diff", "review tej zmiany", "sprawdz PR", "czy bezpiecznie merge", "PR audit", "security review PATRON", "blast radius zmiany".
How this skill is triggered — by the user, by Claude, or both
Slash command
/matematic-patron-pr-review-pl:matematic-patron-pr-review-plThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Recenzent PR/diffow PATRON - polskiego LegalTech AI agenta dla kancelarii. Cherry-pick struktury z [dograh v1.31.0 review-pr](https://github.com/dograh-hq/dograh/blob/main/.agents/skills/review-pr/SKILL.md) (BSD-2, 286 linii), zaadaptowane pod kontekst MateMatic.
Recenzent PR/diffow PATRON - polskiego LegalTech AI agenta dla kancelarii. Cherry-pick struktury z dograh v1.31.0 review-pr (BSD-2, 286 linii), zaadaptowane pod kontekst MateMatic.
Komplementarny do:
main w repo PATRON / KGLF / matematicsolutions MCP serweryorigin po sesji 3+ commitowlib/db/*_client.ts - inkasacja warstwyfetch('/api/v1/...') zamiast typed clientauthenticate_mcp_request() (patrz matematic-mcp-fastmcp-instructions-pl w tym hubie)gh pr diff <N> lub gh pr view <N> --json files,additions,deletionsgit diff origin/main...HEADgit diff HEADAGENTS.md (root + per-package) - org scoping i worker sync<plik>:<linia> -> <problem> -> <correct pattern>Traktuj ten plik jako review policy + navigation, NIE jako frozen inventory.
| Ścieżka w diffie | Sekcje |
|---|---|
app/routes/*.ts, apps/api/routes/ | 1, 2, 8 |
lib/db/*_client.ts, lib/db/schema.ts, lib/db/models.ts | 2, 3 |
lib/services/**/*.ts, apps/api/services/ | 2, 3, 4 |
lib/tasks/*.ts, apps/worker/ | 2, 3, 5 |
db/migrations/*.sql, lib/db/migrations/ | 6 |
mcp-servers/**, matematicsolutions/mcp-* | 1, 2, 7, kanon MCP (patrz matematic-mcp-fastmcp-instructions-pl) |
apps/ui/**, apps/dashboard/** | 9 |
lib/constants.ts, anything process.env outside lib/constants | 10 |
tests/**, __tests__/** | 11 |
lib/schemas/*.ts, lib/dto/*.ts | 12 |
lib/audit/**, lib/pii/**, lib/anonimizacja/** | 13 (MateMatic-specific) |
Brak globalnego middleware auth w PATRON. Kazda trasa deklaruje swoja auth.
Zaleznosci auth z lib/auth/depends.ts:
getUser (user kancelarii w organizacji)getUserWs (websocket - kancelaria realtime)getSuperuser (root MateMatic, NIE klient kancelaria)requireRing(N) (ring-policy ADR-0027) - dla decyzji authorizationChecks:
@router.<verb>(...) bez auth dependency = silently public. Finding chyba ze plik ustanawia public auth pattern (np. webhook signed, public token).getUser na impersonation / cross-org / global reporting -> powinno byc getSuperuser.Depends(getUserWs) i bez public-token flow = finding.requireRing(2)+) = finding.Komendy:
rg -n "Depends\((getUser|getUserWs|getSuperuser|requireRing)" app/routes/ apps/api/
rg -n "@router\.(get|post|put|delete|patch|websocket)" app/routes/
NAJWAZNIEJSZA regula w PATRON. Kancelaria A NIGDY nie widzi danych kancelarii B. Kazdy request-reachable read/write resourca org-scoped MUSI filtrowac/walidowac przez organization_id.
Polega na: AGENTS.md canonical summary + ADR-0027 ring-policy.
Determinacja scope:
organization_id (cases, documents, prompts, agents)org_id, tenant_id), ale nowy kod uzywa organization_idChecks:
*ById(...) / getXById(...) w route handler = suspicious. Jesli request-reachable i unscoped = finding.list* / get* endpointy filtruja w SQL (WHERE organization_id = ?), NIE w TS po .all().user.selectedOrganizationId i odrzucic jesli nie nalezy do org.organization_id w DB client call = trace caller.organization_id.organizationId, nie orgId, tenantId, organisationId.Komendy:
rg -n "ById\(" app/routes/ lib/services/ apps/worker/
rg -n "dbClient\.get\w+\(" app/routes/ lib/services/
rg -n "organizationId|selectedOrganizationId|requireRing" app/routes/ lib/services/ apps/worker/ lib/db/
Production SQL nalezy do lib/db/*_client.ts. Routes, services, tasks WOLAJA db client methods, NIE pisza Drizzle/SQL bezposrednio.
Checks:
db.select, db.update, db.delete, db.insert, sql\`, prepare(, transaction(wapp/routes/, lib/services/, apps/worker/` = finding.lib/services/adminUtils/ to wyjatek - NIE jest template'em dla production.organizationId.Komendy:
rg -n "(db\.select|db\.update|db\.delete|db\.insert|sql\`)" app/routes/ lib/services/ apps/worker/
Production PATRON ma multi-worker. Per-process mutable caches stale unless broadcast.
Checks:
Checks:
apps/worker/queue.ts::routes.db/migrations/*.sql lub Drizzle migrations)Checks:
up i down istnieja i sa meaningfully reversible chyba ze zmiana naprawde nie da sie cofnac.NOT NULL column do zaludnionej tabeli potrzebuje safe default lub backfilla przed constraint.ALTER COLUMN ... SET NOT NULL.CREATE INDEX CONCURRENTLY).mcp-servers/**, matematicsolutions/mcp-*)Reguly z matematic-mcp-fastmcp-instructions-pl - 5 elementow kanonu.
Checks:
authenticateMcpRequest() (lub Pythonowy authenticate_mcp_request()), NIE reimplementuja API-key validation.instructions ma istniec w registry (drift test).errorCode zwracane przez tool sa w docstring tool (drift test).readOnlyHint=true) dla tooli ktore nie mutuja.Checks:
verifyInboundSignature() lub provider equivalent.organizationId.apps/ui/**, apps/dashboard/**) - generated SDK onlyFrontend rozmawia z backendem przez apps/ui/src/client/ (generated typed SDK).
Checks:
fetch('/api/v1/...') lub fetch(\${backendUrl}/api/v1/...`)` w app code = finding chyba ze aktualny kod udowadnia narrow exception.Authorization header w zwyklych komponentach = finding (auth injected centrally).apps/ui/src/client/ powinno tez sie zmienic.Checks:
pino z PII masking), NIE console.log.process.env.X poza lib/constants.ts = finding.logger.info(\config: ${JSON.stringify(config)}`)`logger.debug(requestBody)tests/**, __tests__/**)Checks:
pTimeout, setTimeout race), NIE while (!done)..env.test, NIE .env.lib/schemas/*.ts, lib/dto/*.ts)Checks:
Tej sekcji NIE ma w dograh - to MateMatic-specific dla legal AI.
Checks:
audit_log (ADR-0033). Brak entry = finding (AI Act art. 12 record-keeping).Komendy:
rg -n "auditLog|writeAuditEntry|recordDecision" lib/audit/ lib/services/
rg -n "anonymize|piiDetect|let-it-be" lib/pii/ lib/services/
rg -n "PESEL|NIP|REGON" README.md docs/ aktualnosci/ # zero hits expected w public
Po gh repo create / push nowego komponentu PUBLICZNEGO uruchom 7-stopniowa checkliste catchup (zasada hub kuratorski MateMatic - kod wyprzedza dokumentacje). Ten skill sprawdza w PR diffe:
Checks:
Findings w 3 buckets:
Blocker (MUST fix przed merge):
Should-fix (mocno polecane):
authenticate_mcp_request() (sekcja 7)Nit (drobne):
Cytuj plik:linia dla kazdego finding. Pomin to co formatter/linter/IDE i tak zlapie chyba ze laczy sie z jednym z repo-specific risks powyzej.
repo-specific risk connectionProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.
npx claudepluginhub matematicsolutions/awesome-matematic-skills-pl --plugin matematic-patron-pr-review-pl