| name | repo-conventions |
| description | NeuroLink's review standards — the critical rules to enforce, what NOT to comment on, the security bar, hot paths. Load before reviewing any change in this repository. |
Reviewing a change in NeuroLink
Authoritative sources in this checkout (the repository root is ../):
../CLAUDE.md — the engineering rules, long form. When a finding violates one,
cite the specific rule (e.g. "Critical Rule 1: dynamic imports only in the registry").
../CONTRIBUTING.md — contribution and commit conventions.
This skill is the review-focused digest; those files win on any conflict.
Do NOT comment on — CI already owns it
Formatting, lint and type errors — including CLAUDE.md rules 2 and 7–15 — are
enforced by ESLint + Prettier + tsc and the custom AST rules in eslint-rules/
(interface vs type, type file locations, barrel rules, double assertions,
e2e-only tests). Re-reporting mechanical violations buries the findings that
matter. Also skip: performance micro-costs, naming and prose taste, dependency
choice.
The critical rules the review DOES enforce (cite the rule number)
- Rule 1 — dynamic imports only in the registry. Providers are imported
dynamically inside factory functions in
providerRegistry.ts; a static
provider import is a circular-dependency bug.
- Rule 3 — Gemini tools + JSON-schema structured output are mutually
exclusive. Gated on
isGeminiProvider in structuredOutputPolicy.ts, NOT
on Vertex as a whole (Vertex Claude supports both). Claude paths must default
max_tokens via resolveClaudeMaxTokens, never a hardcoded 4096; truncation
must surface (jsonRepaired / jsonTruncated), never silently.
- Rule 4 — CLI ≠ SDK. Manual MCP connections are CLI-only; CLI concerns
must not leak into the SDK path.
- Rule 5 — backward compatibility of the public SDK API. Non-negotiable.
Name the unmodified callers a change breaks; use the code graph to find them.
- Rule 6 —
formatProviderError returns the error, never throws.
- Rule 15 — tests are end-to-end only. Suites drive
dist/index.js or the
built CLI (node dist/cli/index.js); ONE module graph per suite — mixing
src/ and dist/ imports breaks stubs/spies/instanceof silently. A
determinism exception must be declared in the file header and in the ESLint
allow list.
- Provider
executeStream goes through BaseProvider.stream() tool-merge.
- Factory + Registry is the extension pattern (providers, processors,
chunkers, rerankers) — a new extensible thing that bypasses it is a finding.
Security — the CRITICAL bar
Hardcoded secrets or credentials in source; secrets leaking into logs (confirm
transformParamsForLogging / secret stripping before logging provider params);
injection, unsafe eval/innerHTML/dynamic require, SSRF, path traversal; unsafe
handling of user or model input. Every CRITICAL claim must be anchored in the
change: quote the exact added line(s) from the diff. Placeholder values (docs,
tests, "sk-your-key-here", ${ENV_VAR} references) are NOT leaked secrets — a
fabricated credential-leak report is worse than a missed real one.
What the review spends itself on
Logic and correctness bugs, races, unhandled rejections; provider / MCP /
streaming / proxy-pool changes; missing error handling; backward compatibility
(rule 5); missing coverage in the matching test/continuous-test-suite-*.ts
for new behaviour.
Out-of-diff impact — use the code graph when available
The diff alone does not show the damage a change does elsewhere. Orient once
(architecture overview, impact radius of the changed files, affected flows),
order the file-by-file pass by blast radius, and for each changed export check
its callers and dependents — signature, return shape, nullability, thrown
errors, async behaviour, side effects an UNMODIFIED caller does not handle.
Name the exact out-of-diff call sites. If the graph is unavailable, say impact
analysis was skipped — never fabricate impact claims.
Hot paths — report at MAJOR or higher, and name the blast radius
| Path | Why |
|---|
src/lib/core/baseProvider.ts | Central stream() tool-merge every provider rides |
src/lib/factories/providerRegistry.ts | Dynamic-import registry — the circular-dep tripwire |
src/lib/types/** | The public surface rule 5 protects |
src/lib/server/routes/*ProxyRoutes.ts | Pool engines holding subscription credentials |
src/lib/auth/** | Token stores, OAuth refresh |
src/lib/mcp/** | What tools an agent can reach |
src/lib/context/**, src/lib/memory/** | Compaction/memory — silent data loss lives here |
Discipline
- Review file by file; skip lockfiles, generated or minified assets,
dist/,
build/, coverage/, images.
- Read code from THIS checkout — the platform is for the pull request's
comments and metadata only.
- Conventional Commits with a required scope; ONE commit per pull request
(squash-merged). Releases are generated from commit history.