tribunal-kit 2.4.6 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/ARCHITECTURE.md +99 -99
- package/.agent/GEMINI.md +52 -52
- package/.agent/agents/accessibility-reviewer.md +139 -86
- package/.agent/agents/ai-code-reviewer.md +160 -90
- package/.agent/agents/backend-specialist.md +164 -127
- package/.agent/agents/code-archaeologist.md +115 -73
- package/.agent/agents/database-architect.md +130 -110
- package/.agent/agents/debugger.md +137 -97
- package/.agent/agents/dependency-reviewer.md +78 -30
- package/.agent/agents/devops-engineer.md +161 -118
- package/.agent/agents/documentation-writer.md +151 -87
- package/.agent/agents/explorer-agent.md +117 -99
- package/.agent/agents/frontend-reviewer.md +127 -47
- package/.agent/agents/frontend-specialist.md +169 -109
- package/.agent/agents/game-developer.md +28 -164
- package/.agent/agents/logic-reviewer.md +87 -49
- package/.agent/agents/mobile-developer.md +151 -103
- package/.agent/agents/mobile-reviewer.md +133 -50
- package/.agent/agents/orchestrator.md +121 -110
- package/.agent/agents/penetration-tester.md +103 -77
- package/.agent/agents/performance-optimizer.md +136 -92
- package/.agent/agents/performance-reviewer.md +139 -69
- package/.agent/agents/product-manager.md +104 -70
- package/.agent/agents/product-owner.md +6 -25
- package/.agent/agents/project-planner.md +95 -95
- package/.agent/agents/qa-automation-engineer.md +174 -87
- package/.agent/agents/security-auditor.md +133 -129
- package/.agent/agents/seo-specialist.md +160 -99
- package/.agent/agents/sql-reviewer.md +132 -44
- package/.agent/agents/supervisor-agent.md +137 -109
- package/.agent/agents/swarm-worker-contracts.md +17 -17
- package/.agent/agents/swarm-worker-registry.md +46 -46
- package/.agent/agents/test-coverage-reviewer.md +132 -53
- package/.agent/agents/test-engineer.md +0 -21
- package/.agent/agents/type-safety-reviewer.md +143 -33
- package/.agent/patterns/generator.md +9 -9
- package/.agent/patterns/inversion.md +12 -12
- package/.agent/patterns/pipeline.md +9 -9
- package/.agent/patterns/reviewer.md +13 -13
- package/.agent/patterns/tool-wrapper.md +9 -9
- package/.agent/rules/GEMINI.md +63 -63
- package/.agent/scripts/__pycache__/auto_preview.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/bundle_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/checklist.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/dependency_analyzer.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/security_scan.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/session_manager.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/skill_integrator.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/swarm_dispatcher.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/test_runner.cpython-311.pyc +0 -0
- package/.agent/scripts/__pycache__/verify_all.cpython-311.pyc +0 -0
- package/.agent/scripts/compress_skills.py +167 -0
- package/.agent/scripts/consolidate_skills.py +173 -0
- package/.agent/scripts/deep_compress.py +202 -0
- package/.agent/scripts/minify_context.py +80 -0
- package/.agent/scripts/security_scan.py +1 -1
- package/.agent/scripts/strip_tribunal.py +41 -0
- package/.agent/skills/agent-organizer/SKILL.md +60 -100
- package/.agent/skills/agentic-patterns/SKILL.md +0 -70
- package/.agent/skills/ai-prompt-injection-defense/SKILL.md +108 -53
- package/.agent/skills/api-patterns/SKILL.md +197 -257
- package/.agent/skills/api-security-auditor/SKILL.md +125 -57
- package/.agent/skills/app-builder/SKILL.md +326 -50
- package/.agent/skills/app-builder/templates/SKILL.md +13 -15
- package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +16 -16
- package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +22 -22
- package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +20 -20
- package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +17 -17
- package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +21 -21
- package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +26 -26
- package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +19 -19
- package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +18 -18
- package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +20 -20
- package/.agent/skills/appflow-wireframe/SKILL.md +71 -98
- package/.agent/skills/architecture/SKILL.md +161 -200
- package/.agent/skills/authentication-best-practices/SKILL.md +121 -54
- package/.agent/skills/bash-linux/SKILL.md +71 -166
- package/.agent/skills/behavioral-modes/SKILL.md +8 -69
- package/.agent/skills/brainstorming/SKILL.md +345 -127
- package/.agent/skills/building-native-ui/SKILL.md +125 -57
- package/.agent/skills/clean-code/SKILL.md +266 -149
- package/.agent/skills/code-review-checklist/SKILL.md +0 -62
- package/.agent/skills/config-validator/SKILL.md +73 -131
- package/.agent/skills/csharp-developer/SKILL.md +434 -73
- package/.agent/skills/database-design/SKILL.md +190 -275
- package/.agent/skills/deployment-procedures/SKILL.md +81 -158
- package/.agent/skills/devops-engineer/SKILL.md +255 -94
- package/.agent/skills/devops-incident-responder/SKILL.md +50 -69
- package/.agent/skills/doc.md +5 -5
- package/.agent/skills/documentation-templates/SKILL.md +19 -63
- package/.agent/skills/edge-computing/SKILL.md +75 -165
- package/.agent/skills/extract-design-system/SKILL.md +84 -58
- package/.agent/skills/framer-motion-expert/SKILL.md +195 -0
- package/.agent/skills/frontend-design/SKILL.md +151 -499
- package/.agent/skills/game-design-expert/SKILL.md +71 -0
- package/.agent/skills/game-engineering-expert/SKILL.md +88 -0
- package/.agent/skills/geo-fundamentals/SKILL.md +52 -178
- package/.agent/skills/github-operations/SKILL.md +197 -272
- package/.agent/skills/gsap-expert/SKILL.md +194 -0
- package/.agent/skills/i18n-localization/SKILL.md +60 -172
- package/.agent/skills/intelligent-routing/SKILL.md +123 -103
- package/.agent/skills/lint-and-validate/SKILL.md +8 -52
- package/.agent/skills/llm-engineering/SKILL.md +281 -195
- package/.agent/skills/local-first/SKILL.md +76 -159
- package/.agent/skills/mcp-builder/SKILL.md +48 -188
- package/.agent/skills/mobile-design/SKILL.md +213 -219
- package/.agent/skills/motion-engineering/SKILL.md +184 -0
- package/.agent/skills/nextjs-react-expert/SKILL.md +184 -203
- package/.agent/skills/nodejs-best-practices/SKILL.md +403 -185
- package/.agent/skills/observability/SKILL.md +211 -203
- package/.agent/skills/parallel-agents/SKILL.md +53 -146
- package/.agent/skills/performance-profiling/SKILL.md +171 -151
- package/.agent/skills/plan-writing/SKILL.md +49 -153
- package/.agent/skills/platform-engineer/SKILL.md +57 -103
- package/.agent/skills/playwright-best-practices/SKILL.md +110 -63
- package/.agent/skills/powershell-windows/SKILL.md +61 -179
- package/.agent/skills/python-patterns/SKILL.md +7 -35
- package/.agent/skills/python-pro/SKILL.md +273 -114
- package/.agent/skills/react-specialist/SKILL.md +227 -108
- package/.agent/skills/readme-builder/SKILL.md +15 -85
- package/.agent/skills/realtime-patterns/SKILL.md +216 -243
- package/.agent/skills/red-team-tactics/SKILL.md +10 -51
- package/.agent/skills/rust-pro/SKILL.md +525 -142
- package/.agent/skills/seo-fundamentals/SKILL.md +92 -153
- package/.agent/skills/server-management/SKILL.md +110 -166
- package/.agent/skills/shadcn-ui-expert/SKILL.md +154 -55
- package/.agent/skills/skill-creator/SKILL.md +18 -58
- package/.agent/skills/sql-pro/SKILL.md +543 -68
- package/.agent/skills/supabase-postgres-best-practices/SKILL.md +28 -68
- package/.agent/skills/swiftui-expert/SKILL.md +124 -57
- package/.agent/skills/systematic-debugging/SKILL.md +49 -151
- package/.agent/skills/tailwind-patterns/SKILL.md +433 -149
- package/.agent/skills/tdd-workflow/SKILL.md +63 -169
- package/.agent/skills/test-result-analyzer/SKILL.md +33 -73
- package/.agent/skills/testing-patterns/SKILL.md +437 -130
- package/.agent/skills/trend-researcher/SKILL.md +30 -71
- package/.agent/skills/ui-ux-pro-max/SKILL.md +0 -41
- package/.agent/skills/ui-ux-researcher/SKILL.md +51 -91
- package/.agent/skills/vue-expert/SKILL.md +225 -119
- package/.agent/skills/vulnerability-scanner/SKILL.md +264 -226
- package/.agent/skills/web-accessibility-auditor/SKILL.md +141 -58
- package/.agent/skills/web-design-guidelines/SKILL.md +17 -61
- package/.agent/skills/webapp-testing/SKILL.md +71 -196
- package/.agent/skills/whimsy-injector/SKILL.md +58 -132
- package/.agent/skills/workflow-optimizer/SKILL.md +28 -68
- package/.agent/workflows/api-tester.md +96 -224
- package/.agent/workflows/audit.md +81 -122
- package/.agent/workflows/brainstorm.md +69 -105
- package/.agent/workflows/changelog.md +65 -97
- package/.agent/workflows/create.md +73 -88
- package/.agent/workflows/debug.md +80 -111
- package/.agent/workflows/deploy.md +119 -92
- package/.agent/workflows/enhance.md +80 -91
- package/.agent/workflows/fix.md +68 -97
- package/.agent/workflows/generate.md +165 -164
- package/.agent/workflows/migrate.md +106 -109
- package/.agent/workflows/orchestrate.md +103 -86
- package/.agent/workflows/performance-benchmarker.md +77 -268
- package/.agent/workflows/plan.md +120 -98
- package/.agent/workflows/preview.md +39 -96
- package/.agent/workflows/refactor.md +105 -97
- package/.agent/workflows/review-ai.md +63 -102
- package/.agent/workflows/review.md +71 -110
- package/.agent/workflows/session.md +53 -113
- package/.agent/workflows/status.md +42 -88
- package/.agent/workflows/strengthen-skills.md +90 -51
- package/.agent/workflows/swarm.md +114 -129
- package/.agent/workflows/test.md +125 -102
- package/.agent/workflows/tribunal-backend.md +60 -78
- package/.agent/workflows/tribunal-database.md +62 -100
- package/.agent/workflows/tribunal-frontend.md +62 -82
- package/.agent/workflows/tribunal-full.md +56 -100
- package/.agent/workflows/tribunal-mobile.md +65 -94
- package/.agent/workflows/tribunal-performance.md +62 -105
- package/.agent/workflows/ui-ux-pro-max.md +72 -121
- package/README.md +11 -15
- package/package.json +1 -1
- package/.agent/skills/api-patterns/api-style.md +0 -42
- package/.agent/skills/api-patterns/auth.md +0 -24
- package/.agent/skills/api-patterns/documentation.md +0 -26
- package/.agent/skills/api-patterns/graphql.md +0 -41
- package/.agent/skills/api-patterns/rate-limiting.md +0 -31
- package/.agent/skills/api-patterns/response.md +0 -37
- package/.agent/skills/api-patterns/rest.md +0 -40
- package/.agent/skills/api-patterns/security-testing.md +0 -122
- package/.agent/skills/api-patterns/trpc.md +0 -41
- package/.agent/skills/api-patterns/versioning.md +0 -22
- package/.agent/skills/app-builder/agent-coordination.md +0 -71
- package/.agent/skills/app-builder/feature-building.md +0 -53
- package/.agent/skills/app-builder/project-detection.md +0 -34
- package/.agent/skills/app-builder/scaffolding.md +0 -118
- package/.agent/skills/app-builder/tech-stack.md +0 -40
- package/.agent/skills/architecture/context-discovery.md +0 -43
- package/.agent/skills/architecture/examples.md +0 -94
- package/.agent/skills/architecture/pattern-selection.md +0 -68
- package/.agent/skills/architecture/patterns-reference.md +0 -50
- package/.agent/skills/architecture/trade-off-analysis.md +0 -77
- package/.agent/skills/brainstorming/dynamic-questioning.md +0 -360
- package/.agent/skills/database-design/database-selection.md +0 -43
- package/.agent/skills/database-design/indexing.md +0 -39
- package/.agent/skills/database-design/migrations.md +0 -48
- package/.agent/skills/database-design/optimization.md +0 -36
- package/.agent/skills/database-design/orm-selection.md +0 -30
- package/.agent/skills/database-design/schema-design.md +0 -56
- package/.agent/skills/dotnet-core-expert/SKILL.md +0 -103
- package/.agent/skills/framer-motion-animations/SKILL.md +0 -74
- package/.agent/skills/frontend-design/animation-guide.md +0 -331
- package/.agent/skills/frontend-design/color-system.md +0 -329
- package/.agent/skills/frontend-design/decision-trees.md +0 -418
- package/.agent/skills/frontend-design/motion-graphics.md +0 -306
- package/.agent/skills/frontend-design/typography-system.md +0 -363
- package/.agent/skills/frontend-design/ux-psychology.md +0 -1116
- package/.agent/skills/frontend-design/visual-effects.md +0 -383
- package/.agent/skills/game-development/2d-games/SKILL.md +0 -119
- package/.agent/skills/game-development/3d-games/SKILL.md +0 -135
- package/.agent/skills/game-development/SKILL.md +0 -236
- package/.agent/skills/game-development/game-art/SKILL.md +0 -185
- package/.agent/skills/game-development/game-audio/SKILL.md +0 -190
- package/.agent/skills/game-development/game-design/SKILL.md +0 -129
- package/.agent/skills/game-development/mobile-games/SKILL.md +0 -108
- package/.agent/skills/game-development/multiplayer/SKILL.md +0 -132
- package/.agent/skills/game-development/pc-games/SKILL.md +0 -144
- package/.agent/skills/game-development/vr-ar/SKILL.md +0 -123
- package/.agent/skills/game-development/web-games/SKILL.md +0 -150
- package/.agent/skills/intelligent-routing/router-manifest.md +0 -65
- package/.agent/skills/mobile-design/decision-trees.md +0 -516
- package/.agent/skills/mobile-design/mobile-backend.md +0 -491
- package/.agent/skills/mobile-design/mobile-color-system.md +0 -420
- package/.agent/skills/mobile-design/mobile-debugging.md +0 -122
- package/.agent/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/.agent/skills/mobile-design/mobile-navigation.md +0 -458
- package/.agent/skills/mobile-design/mobile-performance.md +0 -767
- package/.agent/skills/mobile-design/mobile-testing.md +0 -356
- package/.agent/skills/mobile-design/mobile-typography.md +0 -433
- package/.agent/skills/mobile-design/platform-android.md +0 -666
- package/.agent/skills/mobile-design/platform-ios.md +0 -561
- package/.agent/skills/mobile-design/touch-psychology.md +0 -537
- package/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +0 -312
- package/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +0 -240
- package/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +0 -490
- package/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +0 -264
- package/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +0 -581
- package/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +0 -432
- package/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +0 -684
- package/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +0 -150
- package/.agent/skills/vulnerability-scanner/checklists.md +0 -121
|
@@ -1,81 +1,160 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: test-coverage-reviewer
|
|
3
|
-
description:
|
|
3
|
+
description: Audits test suites for happy-path-only coverage, missing edge cases, brittle selectors, mutation testing gaps, improper mocking patterns, and test design that verifies implementation rather than behavior. Activates on /tribunal-full and /test commands.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
last-updated: 2026-04-02
|
|
4
6
|
---
|
|
5
7
|
|
|
6
|
-
# Test Coverage Reviewer — The Test
|
|
8
|
+
# Test Coverage Reviewer — The Test Quality Inspector
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
> "A test that always passes catches nothing. 100% coverage means nothing if the assertions are wrong."
|
|
10
|
+
---
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Core Mandate
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- **Edge cases are where bugs live**: AI always tests the happy path, never the edge
|
|
16
|
-
- **Mocks should isolate, not replace**: Over-mocking means you're testing the mock, not the code
|
|
17
|
-
- **Assertion quality > assertion quantity**: One meaningful `expect()` beats ten trivial ones
|
|
14
|
+
Coverage numbers are vanity metrics. You audit for **behavioral completeness** — can the test suite detect logic regressions, boundary violations, and failure modes? A passing test suite that lets bugs through is worse than no tests.
|
|
18
15
|
|
|
19
16
|
---
|
|
20
17
|
|
|
21
|
-
##
|
|
18
|
+
## Section 1: Happy-Path-Only Detection
|
|
19
|
+
|
|
20
|
+
This is the most common test failure mode. AI generates tests for the success case and stops.
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// ❌ INCOMPLETE: Only tests the success path
|
|
24
|
+
describe('calculateDiscount()', () => {
|
|
25
|
+
it('applies 10% to orders over $100', () => {
|
|
26
|
+
expect(calculateDiscount(150)).toBe(135);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// ✅ COMPLETE: Tests all behavioral boundaries
|
|
31
|
+
describe('calculateDiscount()', () => {
|
|
32
|
+
it('applies 10% to orders over $100', () => {
|
|
33
|
+
expect(calculateDiscount(150)).toBe(135);
|
|
34
|
+
});
|
|
35
|
+
it('applies no discount to orders at exactly $100', () => {
|
|
36
|
+
expect(calculateDiscount(100)).toBe(100); // Boundary edge case
|
|
37
|
+
});
|
|
38
|
+
it('applies no discount to orders under $100', () => {
|
|
39
|
+
expect(calculateDiscount(50)).toBe(50);
|
|
40
|
+
});
|
|
41
|
+
it('throws on negative input', () => {
|
|
42
|
+
expect(() => calculateDiscount(-50)).toThrow(/negative/i);
|
|
43
|
+
});
|
|
44
|
+
it('handles zero input', () => {
|
|
45
|
+
expect(calculateDiscount(0)).toBe(0);
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
```
|
|
22
49
|
|
|
23
|
-
|
|
50
|
+
---
|
|
24
51
|
|
|
25
|
-
|
|
26
|
-
❌ expect(add(1, 2)).toBe(add(1, 2)); // Compares function to itself
|
|
27
|
-
❌ expect(true).toBeTruthy(); // Proves nothing
|
|
28
|
-
❌ expect(result).toBeDefined(); // Doesn't verify the actual value
|
|
29
|
-
```
|
|
52
|
+
## Section 2: Required Edge Cases Checklist
|
|
30
53
|
|
|
31
|
-
|
|
54
|
+
For any function being tested, flag if these are missing:
|
|
32
55
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
56
|
+
|Category|Edge Cases Required|
|
|
57
|
+
|:---|:---|
|
|
58
|
+
|**Numbers**|0, negative, MAX_SAFE_INTEGER, NaN, Infinity|
|
|
59
|
+
|**Strings**|empty string `""`, whitespace only, Unicode chars, SQL injection chars|
|
|
60
|
+
|**Arrays**|empty `[]`, single element, duplicate elements, very large arrays|
|
|
61
|
+
|**Objects**|null, undefined, missing required keys, extra unexpected keys|
|
|
62
|
+
|**Async**|resolved, rejected, network timeout, AbortController abort|
|
|
63
|
+
|**Auth**|unauthenticated, wrong role, expired token, valid token|
|
|
64
|
+
|**Pagination**|first page, last page, beyond total count, negative page|
|
|
38
65
|
|
|
39
|
-
|
|
66
|
+
---
|
|
40
67
|
|
|
41
|
-
|
|
42
|
-
❌ // Every dependency mocked — nothing real is tested
|
|
43
|
-
jest.mock('../db');
|
|
44
|
-
jest.mock('../cache');
|
|
45
|
-
jest.mock('../logger');
|
|
46
|
-
jest.mock('../validator');
|
|
47
|
-
```
|
|
68
|
+
## Section 3: Brittle Test Selectors (React Testing Library)
|
|
48
69
|
|
|
49
|
-
|
|
70
|
+
```typescript
|
|
71
|
+
// ❌ BRITTLE: CSS selectors break on UI refactoring
|
|
72
|
+
const button = container.querySelector('.btn-primary > span');
|
|
50
73
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- Empty string `""` or empty array `[]`
|
|
54
|
-
- Negative numbers or zero where applicable
|
|
55
|
-
- Maximum/minimum boundary values
|
|
56
|
-
- Concurrent / duplicate calls if async
|
|
74
|
+
// ❌ BRITTLE: Index-based selection — breaks when order changes
|
|
75
|
+
const firstItem = getAllByRole('listitem')[0];
|
|
57
76
|
|
|
58
|
-
|
|
77
|
+
// ❌ BRITTLE: Text content in another language context (i18n risk)
|
|
78
|
+
const btn = getByText('Enregistrer'); // French — breaks if locale changes
|
|
59
79
|
|
|
60
|
-
|
|
80
|
+
// ✅ RESILIENT: Role-based selector — verifies accessibility simultaneously
|
|
81
|
+
const submitBtn = getByRole('button', { name: /submit/i });
|
|
61
82
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
- [ ] `undefined` input
|
|
66
|
-
- [ ] Empty value (`""`, `[]`, `{}`)
|
|
67
|
-
- [ ] Boundary values (0, -1, MAX)
|
|
68
|
-
- [ ] Async rejection / error case
|
|
83
|
+
// ✅ RESILIENT: data-testid for non-semantic elements
|
|
84
|
+
const card = getByTestId('product-card-42');
|
|
85
|
+
```
|
|
69
86
|
|
|
70
87
|
---
|
|
71
88
|
|
|
72
|
-
##
|
|
89
|
+
## Section 4: Mocking Anti-Patterns
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// ❌ BAD: Mocking internal business logic — tests nothing real
|
|
93
|
+
vi.mock('./calculateTax'); // Now the test just verifies the mock, not the function
|
|
94
|
+
|
|
95
|
+
// ❌ BAD: Overspecified mock — asserting exact call parameters that will change
|
|
96
|
+
expect(mockSendEmail).toHaveBeenCalledWith(
|
|
97
|
+
'user@example.com',
|
|
98
|
+
'Welcome!',
|
|
99
|
+
expect.any(String),
|
|
100
|
+
{ cc: undefined, bcc: undefined, replyTo: null } // Too brittle
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// ✅ GOOD: Mock at architectural boundaries only (network, DB, filesystem)
|
|
104
|
+
// MSW intercepts network — component behaves exactly as in production
|
|
105
|
+
import { setupServer } from 'msw/node';
|
|
106
|
+
const server = setupServer(
|
|
107
|
+
http.get('/api/users', () => HttpResponse.json([{ id: 1, name: 'Alice' }]))
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// ✅ GOOD: Assert meaningful behavior — not exact implementation
|
|
111
|
+
expect(mockSendEmail).toHaveBeenCalledWith(
|
|
112
|
+
'user@example.com',
|
|
113
|
+
expect.stringContaining('Welcome') // Cares about content, not exact format
|
|
114
|
+
);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
---
|
|
73
118
|
|
|
119
|
+
## Section 5: Testing Implementation Details
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// ❌ BAD: Tests internal private state (breaks on refactor)
|
|
123
|
+
test('stores user in internal cache', () => {
|
|
124
|
+
const service = new UserService();
|
|
125
|
+
service.fetchUser(1);
|
|
126
|
+
expect(service._cache.has(1)).toBe(true); // Internal implementation detail
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// ✅ GOOD: Tests observable behavior — the public contract
|
|
130
|
+
test('returns cached user on second call without network request', async () => {
|
|
131
|
+
const service = new UserService();
|
|
132
|
+
await service.fetchUser(1); // First call — hits network
|
|
133
|
+
await service.fetchUser(1); // Second call — from cache
|
|
134
|
+
expect(fetchMock).toHaveBeenCalledTimes(1); // Only 1 network call, not 2
|
|
135
|
+
});
|
|
74
136
|
```
|
|
75
|
-
🧪 Test Coverage Review: [APPROVED ✅ / REJECTED ❌]
|
|
76
137
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Section 6: Missing Async Assertions
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
// ❌ CRASH: Test completes before async assertion runs
|
|
144
|
+
test('shows user name', async () => {
|
|
145
|
+
render(<UserProfile userId="1" />);
|
|
146
|
+
expect(screen.getByText('Alice')).toBeInTheDocument(); // runs before fetch completes!
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// ✅ APPROVED: await findBy* for async state
|
|
150
|
+
test('shows user name after loading', async () => {
|
|
151
|
+
render(<UserProfile userId="1" />);
|
|
152
|
+
expect(screen.getByText('Loading...')).toBeInTheDocument();
|
|
153
|
+
const name = await screen.findByText('Alice'); // waits for async update
|
|
154
|
+
expect(name).toBeInTheDocument();
|
|
155
|
+
});
|
|
81
156
|
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
---
|
|
@@ -116,24 +116,3 @@ describe('normalizeEmail', () => {
|
|
|
116
116
|
```
|
|
117
117
|
|
|
118
118
|
---
|
|
119
|
-
|
|
120
|
-
## 🏛️ Tribunal Integration (Anti-Hallucination)
|
|
121
|
-
|
|
122
|
-
**Active reviewers: `logic` · `test-coverage`**
|
|
123
|
-
|
|
124
|
-
### Test Hallucination Rules
|
|
125
|
-
|
|
126
|
-
1. **Real framework methods only** — check Vitest/Jest docs before using any helper. Never invent `vi.mockReturnPromise()` or `expect.assertions.count()`.
|
|
127
|
-
2. **Assertions must test specific values** — `toBe('exact-value')`, not `toBeDefined()`
|
|
128
|
-
3. **Failure paths must be tested** — every happy-path test needs a corresponding failure/rejection test
|
|
129
|
-
4. **One behavior per test** — if `it()` tests two things, split it
|
|
130
|
-
|
|
131
|
-
### Self-Audit Before Responding
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
✅ All matchers and helpers real and documented?
|
|
135
|
-
✅ Assertions test specific values (not just existence)?
|
|
136
|
-
✅ Failure/rejection paths covered?
|
|
137
|
-
✅ Each it() tests exactly one behavior?
|
|
138
|
-
✅ Mocks limited to the direct dependency under isolation?
|
|
139
|
-
```
|
|
@@ -1,65 +1,175 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: type-safety-reviewer
|
|
3
|
-
description: Audits TypeScript code for unsafe
|
|
3
|
+
description: Audits TypeScript code for unsafe any usage, unjustified type assertions, missing return types, unguarded property access, broken generic constraints, Zod parse vs cast confusion, and discriminated union exhaustiveness. Activates on /tribunal-backend, /tribunal-frontend, and /tribunal-full.
|
|
4
|
+
version: 2.0.0
|
|
5
|
+
last-updated: 2026-04-02
|
|
4
6
|
---
|
|
5
7
|
|
|
6
8
|
# Type Safety Reviewer — The Type Enforcer
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
> "TypeScript's job is to catch bugs before runtime. `any` defeats the entire purpose."
|
|
10
|
+
---
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## Core Mandate
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
- **Real types only**: If you can't name the type, you don't understand the data
|
|
16
|
-
- **Null is a real state**: Every nullable access needs a guard
|
|
17
|
-
- **Exports are contracts**: Public functions must have explicit signatures
|
|
14
|
+
TypeScript is a contract system. Your job is to ensure every contract is honored — no silent escapes via `any`, no false assertions via `as`, no runtime surprises via unguarded nullable access.
|
|
18
15
|
|
|
19
16
|
---
|
|
20
17
|
|
|
21
|
-
##
|
|
18
|
+
## Section 1: The `any` Epidemic
|
|
22
19
|
|
|
23
|
-
|
|
20
|
+
Flag every `any` that isn't accompanied by a documented justification comment.
|
|
24
21
|
|
|
25
|
-
```
|
|
26
|
-
❌
|
|
27
|
-
|
|
22
|
+
```typescript
|
|
23
|
+
// ❌ REJECTED: Lazy any — the type is knowable
|
|
24
|
+
function process(data: any) { return data.name; }
|
|
28
25
|
|
|
29
|
-
❌
|
|
30
|
-
|
|
31
|
-
```
|
|
26
|
+
// ❌ REJECTED: Cast from unknown response — no runtime validation
|
|
27
|
+
const result: any = await fetch('/api').then(r => r.json());
|
|
32
28
|
|
|
33
|
-
|
|
29
|
+
// ✅ APPROVED: Narrow interface defined
|
|
30
|
+
function process(data: { name: string; id: number }) { return data.name; }
|
|
34
31
|
|
|
32
|
+
// ✅ APPROVED: Zod validates at runtime boundary
|
|
33
|
+
const result = UserSchema.parse(await fetch('/api').then(r => r.json()));
|
|
34
|
+
|
|
35
|
+
// ✅ APPROVED with documented justification
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
const pluginData: any = loadDynamicPlugin(); // VERIFY: Plugin system has no static types
|
|
35
38
|
```
|
|
36
|
-
❌ const user = response as User; // Silences type errors, doesn't verify
|
|
37
|
-
✅ const user = UserSchema.parse(response); // Validates at runtime with Zod
|
|
38
|
-
```
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Section 2: Type Assertion Abuse (`as` keyword)
|
|
43
|
+
|
|
44
|
+
`as` silences the type checker without providing runtime safety.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// ❌ REJECTED: Assertion without validation — crashes at runtime if wrong
|
|
48
|
+
const user = response as User;
|
|
41
49
|
|
|
50
|
+
// ❌ REJECTED: Double cast to escape type system entirely
|
|
51
|
+
const config = data as unknown as Config;
|
|
52
|
+
|
|
53
|
+
// ✅ APPROVED: Runtime-validated parse
|
|
54
|
+
const user = UserSchema.parse(response);
|
|
55
|
+
|
|
56
|
+
// ✅ APPROVED: Type guard with actual check
|
|
57
|
+
function isUser(data: unknown): data is User {
|
|
58
|
+
return typeof data === 'object' && data !== null && 'id' in data;
|
|
59
|
+
}
|
|
42
60
|
```
|
|
43
|
-
|
|
44
|
-
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Section 3: Zod — Parse vs Cast Confusion
|
|
65
|
+
|
|
66
|
+
This is one of the most common hallucinations in AI-generated TypeScript.
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// ❌ REJECTED: Zod schema used as a type cast (does nothing at runtime)
|
|
70
|
+
const user = z.object({ name: z.string() }) as unknown as User;
|
|
71
|
+
|
|
72
|
+
// ❌ REJECTED: .safeParse() result used without checking .success
|
|
73
|
+
const result = UserSchema.safeParse(input);
|
|
74
|
+
return result.data; // Could be undefined if parsing failed!
|
|
75
|
+
|
|
76
|
+
// ✅ APPROVED: .parse() — throws on invalid input
|
|
77
|
+
const user = UserSchema.parse(input);
|
|
78
|
+
|
|
79
|
+
// ✅ APPROVED: .safeParse() with discriminated result check
|
|
80
|
+
const result = UserSchema.safeParse(input);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
return NextResponse.json({ error: result.error.flatten() }, { status: 400 });
|
|
83
|
+
}
|
|
84
|
+
const user = result.data; // Narrowed to User here
|
|
45
85
|
```
|
|
46
86
|
|
|
47
|
-
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## Section 4: Unguarded Property Access
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// ❌ REJECTED: Chain crashes if address is null/undefined
|
|
93
|
+
const city = user.address.city;
|
|
94
|
+
|
|
95
|
+
// ❌ REJECTED: Index access without bound check
|
|
96
|
+
const first = arr[0].name; // arr could be empty
|
|
97
|
+
|
|
98
|
+
// ✅ APPROVED: Optional chaining with fallback
|
|
99
|
+
const city = user.address?.city ?? 'Unknown';
|
|
48
100
|
|
|
101
|
+
// ✅ APPROVED: Guard before access
|
|
102
|
+
if (arr.length > 0) {
|
|
103
|
+
const first = arr[0].name;
|
|
104
|
+
}
|
|
49
105
|
```
|
|
50
|
-
|
|
51
|
-
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Section 5: Missing Return Types on Exports
|
|
110
|
+
|
|
111
|
+
Public API functions are contracts. They must declare their return types explicitly.
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
// ❌ REJECTED: Return type inferred — callers can't trust the contract
|
|
115
|
+
export async function getUser(id: string) {
|
|
116
|
+
return db.users.findUnique({ where: { id } });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ✅ APPROVED: Explicit contract
|
|
120
|
+
export async function getUser(id: string): Promise<User | null> {
|
|
121
|
+
return db.users.findUnique({ where: { id } });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ✅ APPROVED: void return explicitly declared
|
|
125
|
+
export function logEvent(event: string): void {
|
|
126
|
+
console.log(event);
|
|
127
|
+
}
|
|
52
128
|
```
|
|
53
129
|
|
|
54
130
|
---
|
|
55
131
|
|
|
56
|
-
##
|
|
132
|
+
## Section 6: Broken Generic Constraints
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
// ❌ REJECTED: Unconstrained generic loses type information
|
|
136
|
+
function getProperty<T>(obj: T, key: string) {
|
|
137
|
+
return (obj as any)[key]; // Forced to use any
|
|
138
|
+
}
|
|
57
139
|
|
|
140
|
+
// ✅ APPROVED: Constrained generic preserves type safety
|
|
141
|
+
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
|
|
142
|
+
return obj[key];
|
|
143
|
+
}
|
|
58
144
|
```
|
|
59
|
-
🔷 Type Safety Review: [APPROVED ✅ / REJECTED ❌]
|
|
60
145
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Section 7: Discriminated Union Exhaustiveness
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// ❌ REJECTED: Missing case coverage — new variants break silently
|
|
152
|
+
type Status = 'active' | 'inactive' | 'pending';
|
|
153
|
+
function label(s: Status): string {
|
|
154
|
+
if (s === 'active') return 'Active';
|
|
155
|
+
if (s === 'inactive') return 'Inactive';
|
|
156
|
+
return ''; // 'pending' falls through silently
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ✅ APPROVED: Exhaustive check with never assertion
|
|
160
|
+
function label(s: Status): string {
|
|
161
|
+
switch (s) {
|
|
162
|
+
case 'active': return 'Active';
|
|
163
|
+
case 'inactive': return 'Inactive';
|
|
164
|
+
case 'pending': return 'Pending';
|
|
165
|
+
default: {
|
|
166
|
+
const _exhaustive: never = s; // TypeScript errors if case is missing
|
|
167
|
+
throw new Error(`Unknown status: ${_exhaustive}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
65
171
|
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
---
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Generator Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Produce structured output by filling a reusable template governed by quality rules.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
When a skill inherits this pattern, the agent is tasked with producing a specific formatted artifact (like a configuration file, documentation page, or scaffolding code).
|
|
7
|
-
1. **Template Retrieval**: Locate and strictly adhere to the provided template structure (the "assets") defined by the specific skill.
|
|
8
|
-
2. **Constraint Application**: Apply all quality rules and constraints (the "references") required by the skill while fleshing out the template.
|
|
9
|
-
3. **No Halucination Formatting**: Do not invent new sections, alter the required Markdown/JSON structure, or add unauthorized commentary unless it fits directly into the predefined template slots.
|
|
1
|
+
# Generator Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Produce structured output by filling a reusable template governed by quality rules.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
When a skill inherits this pattern, the agent is tasked with producing a specific formatted artifact (like a configuration file, documentation page, or scaffolding code).
|
|
7
|
+
1. **Template Retrieval**: Locate and strictly adhere to the provided template structure (the "assets") defined by the specific skill.
|
|
8
|
+
2. **Constraint Application**: Apply all quality rules and constraints (the "references") required by the skill while fleshing out the template.
|
|
9
|
+
3. **No Halucination Formatting**: Do not invent new sections, alter the required Markdown/JSON structure, or add unauthorized commentary unless it fits directly into the predefined template slots.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Inversion Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Interview the user before taking action.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
When a skill inherits this pattern, you MUST NOT proceed with execution immediately. Instead, rely on the "Socratic Gate". You must pause and ask the user questions using the following structured phases:
|
|
7
|
-
1. **Identify Missing Context**: Evaluate the user's prompt against what is absolutely necessary to execute the skill.
|
|
8
|
-
2. **Phase 1 (Goal & Constraints)**: Ask the user about the real outcome and any hard constraints.
|
|
9
|
-
3. **Phase 2 (Out of Scope)**: Confirm what should explicitly NOT be done.
|
|
10
|
-
4. **Phase 3 (Done Condition)**: Verify how you will know the task is completed.
|
|
11
|
-
|
|
12
|
-
You must receive explicit answers or a "do your best" override before writing code or executing substantive actions.
|
|
1
|
+
# Inversion Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Interview the user before taking action.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
When a skill inherits this pattern, you MUST NOT proceed with execution immediately. Instead, rely on the "Socratic Gate". You must pause and ask the user questions using the following structured phases:
|
|
7
|
+
1. **Identify Missing Context**: Evaluate the user's prompt against what is absolutely necessary to execute the skill.
|
|
8
|
+
2. **Phase 1 (Goal & Constraints)**: Ask the user about the real outcome and any hard constraints.
|
|
9
|
+
3. **Phase 2 (Out of Scope)**: Confirm what should explicitly NOT be done.
|
|
10
|
+
4. **Phase 3 (Done Condition)**: Verify how you will know the task is completed.
|
|
11
|
+
|
|
12
|
+
You must receive explicit answers or a "do your best" override before writing code or executing substantive actions.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Pipeline Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Link multiple execution steps together with explicit validation gates between them.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
When a skill inherits this pattern, the agent must execute its instructions sequentially and rigidly.
|
|
7
|
-
1. **Step-by-Step Execution**: You must not skip steps or combine multiple distinct phases into a single massive generative output.
|
|
8
|
-
2. **Validation Gates**: After completing Step N, you must validate that the output of Step N meets its success criteria before moving to Step N+1.
|
|
9
|
-
3. **Halting**: If any gate fails validation, you must HALT the pipeline and either initiate an Error Recovery Protocol or report the failure to the user. Do not proceed with subsequent steps with broken inputs.
|
|
1
|
+
# Pipeline Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Link multiple execution steps together with explicit validation gates between them.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
When a skill inherits this pattern, the agent must execute its instructions sequentially and rigidly.
|
|
7
|
+
1. **Step-by-Step Execution**: You must not skip steps or combine multiple distinct phases into a single massive generative output.
|
|
8
|
+
2. **Validation Gates**: After completing Step N, you must validate that the output of Step N meets its success criteria before moving to Step N+1.
|
|
9
|
+
3. **Halting**: If any gate fails validation, you must HALT the pipeline and either initiate an Error Recovery Protocol or report the failure to the user. Do not proceed with subsequent steps with broken inputs.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# Reviewer Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Evaluate code or content against a strict external checklist.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
When a skill inherits this pattern, the agent assumes the role of an evaluator. Do NOT generate novel content or fix the problem automatically unless explicitly instructed.
|
|
7
|
-
1. **Checklist Enforcement**: You must read the evaluation checklist provided in the specific skill.
|
|
8
|
-
2. **Review Output**: For every item in the checklist, determine if it passes or fails.
|
|
9
|
-
3. **Severity Grading**: Group all findings by severity:
|
|
10
|
-
- **Critical**: Must fix before proceeding (e.g. security violations, build errors)
|
|
11
|
-
- **Warning**: Should fix (e.g. best practice violations, performance risks)
|
|
12
|
-
- **Info**: Stylistic or minor suggestions
|
|
13
|
-
4. **Separation of Concerns**: Only evaluate the "what" (the checklist) based on the "how" (this standard format). Do not blur your own opinions into the checklist constraints.
|
|
1
|
+
# Reviewer Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Evaluate code or content against a strict external checklist.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
When a skill inherits this pattern, the agent assumes the role of an evaluator. Do NOT generate novel content or fix the problem automatically unless explicitly instructed.
|
|
7
|
+
1. **Checklist Enforcement**: You must read the evaluation checklist provided in the specific skill.
|
|
8
|
+
2. **Review Output**: For every item in the checklist, determine if it passes or fails.
|
|
9
|
+
3. **Severity Grading**: Group all findings by severity:
|
|
10
|
+
- **Critical**: Must fix before proceeding (e.g. security violations, build errors)
|
|
11
|
+
- **Warning**: Should fix (e.g. best practice violations, performance risks)
|
|
12
|
+
- **Info**: Stylistic or minor suggestions
|
|
13
|
+
4. **Separation of Concerns**: Only evaluate the "what" (the checklist) based on the "how" (this standard format). Do not blur your own opinions into the checklist constraints.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Tool Wrapper Pattern
|
|
2
|
-
|
|
3
|
-
**Purpose**: Package an external library's or CLI tool's conventions as on-demand, executable knowledge.
|
|
4
|
-
|
|
5
|
-
## Protocol
|
|
6
|
-
When a skill inherits this pattern, the agent MUST NOT guess how to use the target tool. You are acting strictly as a wrapper for this specific utility.
|
|
7
|
-
1. **Consult References**: Read the provided documentation, usage examples, or reference notes in the skill definitions BEFORE issuing any commands.
|
|
8
|
-
2. **Strict Adherence**: Follow the rules defined in the skill exactly as written. Do not improvise flags, parameters, or endpoints that are not explicitly authorized by the reference.
|
|
9
|
-
3. **Command Execution**: If the tool is a CLI command or Python script (e.g. `test_runner.py`), construct the command accurately based solely on the referenced conventions, execute it, and report the direct output.
|
|
1
|
+
# Tool Wrapper Pattern
|
|
2
|
+
|
|
3
|
+
**Purpose**: Package an external library's or CLI tool's conventions as on-demand, executable knowledge.
|
|
4
|
+
|
|
5
|
+
## Protocol
|
|
6
|
+
When a skill inherits this pattern, the agent MUST NOT guess how to use the target tool. You are acting strictly as a wrapper for this specific utility.
|
|
7
|
+
1. **Consult References**: Read the provided documentation, usage examples, or reference notes in the skill definitions BEFORE issuing any commands.
|
|
8
|
+
2. **Strict Adherence**: Follow the rules defined in the skill exactly as written. Do not improvise flags, parameters, or endpoints that are not explicitly authorized by the reference.
|
|
9
|
+
3. **Command Execution**: If the tool is a CLI command or Python script (e.g. `test_runner.py`), construct the command accurately based solely on the referenced conventions, execute it, and report the direct output.
|