Agent skill

Testing Patterns

by OpenLitterMap in OpenLitterMap/openlittermap-web

Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.

GPL-3.0Auto-check passedTesting & QA

Install Testing Patterns

skills CLI
$ npx skills add OpenLitterMap/openlittermap-web --skill testing-patterns -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install OpenLitterMap/openlittermap-web testing-patterns --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/OpenLitterMap/openlittermap-web.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.ai/skills/testing-patterns .claude/skills/testing-patterns && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
testing-patterns
GitHub stars
134
Token cost
~3.3k tokens
SKILL.md length
771 words
Files
1
Skills in repo
16
Repo updated
First seen
Licence
GPL-3.0

At a glance

Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.

  • Works in 5 steps: RefreshDatabase on every test. The base… → photo_tags uses FK columns. Tests must… → Deprecated tests are excluded by… → …
  • Tasks that involve Test strategy
  • SKILL.md covers Key Files, Invariants, Patterns and Common Mistakes
  • Calls php; needs DB_PASSWORD

What it does

Testing Patterns is an agent skill from OpenLitterMap/openlittermap-web. Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.

Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering Test strategy. It works with PHP and Redis. The repository describes itself as: https://opengeospatialdata.springeropen.com/articles/10.1186/s40965-018-0050-y. The licence is GPL-3.0.

When your agent uses it

  • Tasks that involve Test strategy

Example prompts

  • “/testing-patterns”

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. RefreshDatabase on every test. The base TestCase uses RefreshDatabase and flushes Redis in setUp() and tearDown().
  2. photo_tags uses FK columns. Tests must create Category/LitterObject records and use their IDs — not strings.
  3. Deprecated tests are excluded by default. Run with --group=deprecated to include them. They use old routes (/submit, /add-tags) that no…
  4. Event::fake() prevents listeners. If testing event dispatch AND listener side effects (metrics), split into two tests or don't fake.
  5. Notifications table may not exist. Fake events if testing notification-dispatching code, or create the notifications table.

What it can do on your machine

Read from SKILL.md and the folder at commit ac688aa. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • php

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names these keys or tokens, usually read from environment variables:

    • DB_PASSWORD

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Testing Patterns loads about 3.3k tokens when it runs. Until then it costs about 43 tokens; SKILL.md has 771 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~43
When it runs · the whole SKILL.md, loaded when a task matches
~3.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from OpenLitterMap/openlittermap-web at commit ac688aa, republished under its GPL-3.0 licence (© OpenLitterMap). 771 words, ~3,294 tokens.

Download SKILL.mdSave it as .claude/skills/testing-patterns/SKILL.md (or your agent's skills folder).
name
testing-patterns
description
Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.

Testing Patterns

1033+ tests passing (1 skipped), 0 failures, 0 flaky. PHPUnit 10 with RefreshDatabase. Base TestCase flushes Redis + array cache in setUp() — prevents rate limiter state leaking between tests. 0 deprecated tests remaining (all 40 previously-deprecated files resolved: 18 dead removed, 22 fixed and undeprecated). Dead tests deleted: DecreaseTeamTotalPhotosTest, IncreaseTeamTotalPhotosTest (listeners removed), CalculateTagsDifferenceActionTest (action removed). 32 dead files deleted across v5 audit sessions.

Key Files

  • phpunit.xml — Config: excludes deprecated group, uses olm_test DB, Redis DB 2
  • tests/TestCase.php — Base class: RefreshDatabase + Redis flush + TagKeyCache::forgetAll()
  • tests/Feature/Admin/AdminQueueTest.php — 11 tests (queue endpoint: filters, pagination, exclusions, auth)
  • tests/Feature/UploadValidationTest.php — 11 tests (EXIF datetime, GPS DMS conversion, zero denominator, 0,0 coords)
  • tests/Feature/HasPhotoUploads.php — Trait for old upload-based tests (deprecated)
  • database/factories/PhotoFactory.php — Photo with user, country, state, geom
  • database/factories/Location/CountryFactory.php — Country with shortcode
  • database/factories/Location/StateFactory.php — State with country FK
  • database/factories/Location/CityFactory.php — City with country + state FKs
  • tests/Feature/Bbox/BoundingBoxRetiredTest.php — 5 tests (all bbox endpoints return 410 Gone)
  • database/factories/Litter/Tags/CategoryFactory.php — Category with unique key
  • database/factories/Litter/Tags/LitterObjectFactory.php — LitterObject with unique key
  • database/factories/Litter/Tags/LitterObjectTypeFactory.php — LitterObjectType with unique key + name
  • tests/Feature/Tags/TaggingArchitecturePhase1Test.php — 20 tests (seeding, relationships, API, idempotency)
  • tests/Feature/Tags/ReplacePhotoTagsTest.php — 5 tests (replace tags, ownership, auth, extra tags cleanup)
  • tests/Feature/Teams/TeamPhotosTest.php — 35 tests (new_tags format, CLO tag edits, member stats, safeguarding, delete, revoke, approval, map)
  • tests/Feature/User/PublicProfileTest.php — 4 tests (public profile data, private returns, privacy settings, 404)
  • tests/Feature/Leaderboard/LeaderboardTest.php — 18 tests (all paths: global, country, state, city scopes)
  • tests/Feature/Auth/SanctumTokenAuthTest.php — Mobile token auth tests
  • tests/Feature/Signup/CreateNewUserTest.php — Registration flow tests
  • tests/Feature/Tags/ClassifyTagsServiceTest.php — 12 tests (category aliases, deprecated tag mapping, unknown tags, getCategory)
  • tests/Feature/User/UsersUploadsControllerTest.php — 9 tests (picked_up filter, pagination, tagged/untagged filters)
  • tests/Feature/Photos/PhotoVisibilityTest.php — 7 tests (per-photo visibility toggle: owner-only, school block, is_public persistence, PhotoObserver dirty tiles)

Invariants

  1. RefreshDatabase on every test. The base TestCase uses RefreshDatabase and flushes Redis in setUp() and tearDown().
  2. photo_tags uses FK columns. Tests must create Category/LitterObject records and use their IDs — not strings.
  3. Deprecated tests are excluded by default. Run with --group=deprecated to include them. They use old routes (/submit, /add-tags) that no longer work with v5.
  4. Event::fake() prevents listeners. If testing event dispatch AND listener side effects (metrics), split into two tests or don't fake.
  5. Notifications table may not exist. Fake events if testing notification-dispatching code, or create the notifications table.

Patterns

Base TestCase setup
php
// tests/TestCase.php
abstract class TestCase extends BaseTestCase
{
    use CreatesApplication, RefreshDatabase;

    protected function setUp(): void
    {
        parent::setUp();
        Redis::connection()->flushdb();
        Cache::flush(); // Reset rate limiters (array cache persists between tests)
        TagKeyCache::forgetAll();
    }

    protected function tearDown(): void
    {
        Redis::connection()->flushdb();
        parent::tearDown();
    }
}
Auth guard patterns
php
// auth:api routes (Passport — mobile legacy) → use 'api' guard
$this->actingAs($user, 'api')->postJson('/api/photos/submit', [...]);

// auth:sanctum routes (SPA + Sanctum tokens) → use NO guard argument
$this->actingAs($user)->postJson('/api/settings/update', [...]);

// auth:api,web routes (both guards — teams, v3) → either guard works
$this->actingAs($user, 'api')->postJson('/api/v3/tags', [...]);
$this->actingAs($user)->postJson('/api/v3/tags', [...]); // also works

// CRITICAL: actingAs($user) (no guard) does NOT work for auth:api routes.
// actingAs($user, 'api') does NOT work for auth:sanctum routes.
// Mismatching guard ↔ middleware = silent 401 with no helpful error message.
Using factories instead of uploading in tests
php
// BAD: Upload via API requires auth:api, but test uses web guard
$this->actingAs($user); // web guard
$this->post('/api/photos/submit', [...]); // auth:api → 401, photo not created
$photo = $user->photos->last(); // null!

// GOOD: Use factories when testing non-upload behavior
$photo = Photo::factory()->create(['user_id' => $user->id]);
$this->actingAs($user)->post('/api/profile/photos/delete', ['photoid' => $photo->id]);
Event::fake patterns
php
// Pattern 1: Fake specific events (others still fire)
Event::fake([TagsVerifiedByAdmin::class]);
// ... do stuff ...
Event::assertDispatched(TagsVerifiedByAdmin::class, 1);
Event::assertNotDispatched(SchoolDataApproved::class);

// Pattern 2: Assert with callback
Event::assertDispatched(
    TagsVerifiedByAdmin::class,
    fn (TagsVerifiedByAdmin $e) => $e->photo_id === $photo->id
);

// Pattern 3: Test both event AND side effects (no fake)
// Don't fake — let ProcessPhotoMetrics listener run
$this->postJson('/api/v3/tags', $payload);
$photo->refresh();
$this->assertNotNull($photo->processed_at);  // MetricsService ran
Spatie Permissions setup (required for team tests)
php
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;

protected function setUp(): void
{
    parent::setUp();

    // CRITICAL: Reset cached permissions between tests
    app()[PermissionRegistrar::class]->forgetCachedPermissions();

    $permissions = collect([
        'create school team', 'manage school team',
        'toggle safeguarding', 'view student identities',
    ])->map(fn ($name) => Permission::firstOrCreate([
        'name' => $name, 'guard_name' => 'web'
    ]));

    $role = Role::firstOrCreate(['name' => 'school_manager', 'guard_name' => 'web']);
    $role->syncPermissions($permissions);
}
php
// GOOD: Let factory handle related models
$photo = Photo::factory()->create([
    'is_public' => true,
    'verified' => VerificationStatus::ADMIN_APPROVED->value,
    'city_id' => City::factory(),  // PhotoFactory doesn't include city_id by default
]);

// BAD: Hardcoding IDs
$photo = Photo::factory()->create(['country_id' => 1]);  // May not exist
Team type setup (required for team tests)
php
// team_types.price has no default — always provide it
$communityType = TeamType::create(['team' => 'community', 'price' => 0]);
$schoolType = TeamType::create(['team' => 'school', 'price' => 0]);
Seeding tags for tagging tests
php
protected function setUp(): void
{
    parent::setUp();
    $this->seed([
        GenerateTagsSeeder::class,
        GenerateBrandsSeeder::class,
    ]);
}
Seeding tags + types for v5.1 architecture tests
php
protected function setUp(): void
{
    parent::setUp();
    $this->seed(GenerateTagsSeeder::class);
}
// GenerateTagsSeeder seeds all categories, objects, materials, types, and CLO pivots from TagsConfig
VerificationStatus in assertions
php
// GOOD: Compare enum values
$photo->refresh();
$this->assertEquals(VerificationStatus::ADMIN_APPROVED, $photo->verified);
// or for ordering:
$this->assertTrue($photo->verified->value >= VerificationStatus::ADMIN_APPROVED->value);

// BAD: Compare to raw int (fails after enum cast)
$this->assertEquals(2, $photo->verified);  // Comparing enum to int
Soft-delete assertions
php
// After SoftDeletes trait added to Photo model:
$this->assertSoftDeleted('photos', ['id' => $photo->id]);

// NOT:
$this->assertDatabaseMissing('photos', ['id' => $photo->id]);
// (row still exists, just has deleted_at set)
Running tests
bash
php artisan test --compact                                    # All (excludes deprecated)
php artisan test --compact tests/Feature/Teams/               # Directory
php artisan test --compact tests/Feature/Photos/AddTagsToPhotoTest.php  # Single file
php artisan test --compact --filter=test_method_name          # Single test
php artisan test --compact --group=deprecated                 # Deprecated only
Leaderboard test patterns
php
// Leaderboard route uses auth:sanctum — use actingAs() with NO guard argument
$this->actingAs($user)->getJson('/api/leaderboard?locationType=global');

// Seed Redis ZSETs for leaderboard tests
Redis::zadd(RedisKeys::xpRanking(RedisKeys::global()), $xp, (string)$user->id);

// Seed per-user metrics rows for time-filtered tests
DB::table('metrics')->insert([
    'timescale' => 3, // monthly
    'location_type' => 0, // global
    'location_id' => 0,
    'user_id' => $user->id, // > 0 for per-user
    'year' => now()->year,
    'month' => now()->month,
    'xp' => 100,
    // ... other counters
]);
Test DB restoration (if all tests fail with "table doesn't exist")
bash
# PointsTest's internal migrate:fresh can corrupt olm_test
DB_DATABASE=olm_test DB_USERNAME=root DB_PASSWORD=secret php artisan migrate:fresh --no-interaction
DB_DATABASE=olm_test DB_USERNAME=root DB_PASSWORD=secret php artisan db:seed --class=GenerateTagsSeeder --no-interaction
DB_DATABASE=olm_test DB_USERNAME=root DB_PASSWORD=secret php artisan db:seed --class=GenerateBrandsSeeder --no-interaction
Show full SKILL.md (351 more words)Show less

Common Mistakes

  • Forgetting PermissionRegistrar::forgetCachedPermissions() in setUp. Spatie caches permissions across tests. Reset explicitly.
  • Not providing 'price' => 0 for TeamType. Column has no default — insert fails.
  • Faking events when you need side effects. Event::fake() prevents all listeners. If you need MetricsService to run, don't fake TagsVerifiedByAdmin.
  • Using assertDatabaseMissing for soft-deleted records. Use assertSoftDeleted instead.
  • Creating PhotoTags with string keys. photo_tags.category_id and litter_object_id are integer FKs. Create Category/LitterObject records first.
  • Missing city_id in photo factory. The default PhotoFactory doesn't include city_id. Add 'city_id' => City::factory() when testing location-dependent features.
  • Mismatching actingAs() guard with route middleware. actingAs($user) (web guard) fails on auth:api routes. actingAs($user, 'api') fails on auth:sanctum routes. The mismatch causes silent 401s — no error message, just empty responses.
  • Uploading photos via /api/photos/submit in web-guard tests. That route uses auth:api. If your test uses actingAs($user), the upload returns 401 and no photo is created. Use Photo::factory() for tests that aren't testing upload behavior.
  • Expecting geom in JSON responses. Photo::$hidden = ['geom'] — binary spatial data is excluded from serialization.
  • Using assertNull for Redis::zScore() on missing members. PHP Redis returns false (not null) when a ZSET member doesn't exist. Use assertFalse(Redis::zScore($key, $member)).
  • HasPhotoUploads trait double-encoding address_array. The trait was json_encode()-ing address_array before insert, but the Photo model has an 'array' cast on that column — causing double-encoding. Fixed to pass the raw array directly and let the model cast handle serialization.
  • Empty tags on PUT /api/v3/tags returns 200, not 422. ReplacePhotoTagsRequest validates tags as present|array (not required|array|min:1). Sending tags: [] clears all tags on a photo. Tests expecting 422 for empty tags must be updated to expect 200.
  • Flaky 429s from rate limiter state. CACHE_DRIVER=array in phpunit.xml means rate limiter entries persist between tests in the same PHPUnit process. The base TestCase::setUp() calls Cache::flush() to prevent this. If you add a new test file that hits throttled routes and see intermittent 429s, verify it extends the base TestCase.
  • Upload tests need both S3 and bbox disk fakes. UploadPhotoController writes to two disks: the main S3 disk and the bbox disk (for thumbnail). Both must be faked: Storage::fake('s3'); Storage::fake('bbox');. Missing one causes a real filesystem/S3 call that fails in CI.

© OpenLitterMap, GPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .ai/skills/testing-patterns of OpenLitterMap/openlittermap-web.

Open the folder on GitHubat commit ac688aa

Compare with similar skills

Testing Patterns next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Testing Patterns compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Testing Patterns this skillOpenLitterMap/openlittermap-web134—~3.3kAutomated safety check: PassGPL-3.0
Async Test And Doc Syncdiscord-php/DiscordPHP1.1k—~3.4kAutomated safety check: NotesMIT
Writing Testsvert-x3/vertx-redis-client142—~1.6kAutomated safety check: PassApache-2.0
Configuring Horizoncoollabsio/coolify63k4 repos~898Automated safety check: PassMIT
Laravel Sessions MiddlewareHoangNguyen0403/agent-skills-standard571—~830Automated safety check: NotesMIT
Tsh Implementing BackendTheSoftwareHouse/copilot-collections284—~5.8kAutomated safety check: NotesMIT

Similar skills

  • Async Test And Doc Sync

    discord-php/DiscordPHP

    Maintain test and documentation alignment — PHPUnit tests, async testing patterns, PHPDoc contracts, guide pages, and documentation workflow.

    1.1k GitHub stars~3.4k tokensUpdated 2 days ago
    Testing & QAAuto-check: notes
  • Writing Tests

    vert-x3/vertx-redis-client

    Testing patterns for Vert.x Redis Client: test frameworks, async testing, test locations, container setup, and how to run tests.

    142 GitHub stars~1.6k tokensUpdated yesterday
    DatabasesAuto-check passed
  • Configuring Horizon

    coollabsio/coolify

    A skill your agent uses whenever the user mentions Horizon by name in a Laravel context.

    63k GitHub starsUsed in 4 repos~898 tokens
    Backend & APIsAuto-check passed
  • Laravel Sessions Middleware

    HoangNguyen0403/agent-skills-standard

    Configure Redis session drivers, register security-header middleware, and prevent session fixation in Laravel.

    571 GitHub stars~830 tokensUpdated yesterday
    Backend & APIsAuto-check: notes
  • Tsh Implementing Backend

    TheSoftwareHouse/copilot-collections

    Backend service implementation patterns, standards, and procedures.

    284 GitHub stars~5.8k tokensUpdated 3 days ago
    Backend & APIsAuto-check: notes
  • Test Guard

    amElnagdy/guard-skills

    Reviews newly written or edited tests against nine rules that cut test bloat, such as mock-heavy checks and near-duplicate cases, before they are committed.

    1.3k GitHub starsUsed in 2 repos~2.1k tokens
    Testing & QAAuto-check passed

More from OpenLitterMap/openlittermap-web

All 16 skills in this repo
  • Tailwindcss Development

    OpenLitterMap/openlittermap-web

    Styles applications using Tailwind CSS v3 utilities. An agent skill from OpenLitterMap/openlittermap-web.

    134 GitHub stars~713 tokensUpdated 24 days ago
    Auto-check passed
  • Olm Architecture

    OpenLitterMap/openlittermap-web

    OpenLitterMap v5 architecture reference. An agent skill from OpenLitterMap/openlittermap-web.

    134 GitHub stars~5.2k tokensUpdated 24 days ago
    Auto-check passed
  • Achievements System

    OpenLitterMap/openlittermap-web

    AchievementEngine, AchievementRepository, milestone checkers, AchievementsSeeder, userachievements pivot, AchievementsController API, and achievement evaluation flow.

    134 GitHub stars~1.4k tokensUpdated 24 days ago
    Auto-check passed
  • Admin System

    OpenLitterMap/openlittermap-web

    AdminController, photo approval, tag editing, deletion, MetricsService integration, admin middleware, verification queue, and admin XP.

    134 GitHub stars~3.9k tokensUpdated 24 days ago
    Auto-check passed
  • API Endpoints

    OpenLitterMap/openlittermap-web

    REST API endpoints, route structure, auth guards, request/response contracts, error patterns, and the full API surface for web SPA and mobile clients.

    134 GitHub stars~4k tokensUpdated 24 days ago
    Auto-check passed
  • Clustering System

    OpenLitterMap/openlittermap-web

    ClusteringService, tile keys, dirty tiles/teams, clustering commands, ClusterController GeoJSON API, PhotoObserver dirty marking, and map cluster rendering.

    134 GitHub stars~2k tokensUpdated 24 days ago
    Auto-check passed

Works with

Categories

Questions about Testing Patterns

What does Testing Patterns do?

Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls. Testing Patterns is an agent skill from OpenLitterMap/openlittermap-web. Writing and fixing tests, test factories, Event::fake patterns, auth guard testing, PHPUnit configuration, deprecated test groups, and common test pitfalls.

When should I use Testing Patterns?

Testing Patterns fits situations like: tasks that involve Test strategy.

How do I install Testing Patterns in Claude Code?

Run `npx skills add OpenLitterMap/openlittermap-web --skill testing-patterns -a claude-code`. Or copy the skill folder (.ai/skills/testing-patterns in OpenLitterMap/openlittermap-web) into .claude/skills/testing-patterns in your project. Claude Code loads it when a task matches its description.

How do I install Testing Patterns in Codex?

Run `npx skills add OpenLitterMap/openlittermap-web --skill testing-patterns -a codex`. Or copy the skill folder (.ai/skills/testing-patterns in OpenLitterMap/openlittermap-web) into .agents/skills/testing-patterns in your project. Codex loads it when a task matches its description.

Can I use Testing Patterns in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add OpenLitterMap/openlittermap-web --skill testing-patterns -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/testing-patterns, .gemini/skills/testing-patterns, .github/skills/testing-patterns and .opencode/skills/testing-patterns in your project.

What does Testing Patterns need to run?

Going by SKILL.md and its folder, Testing Patterns needs the command-line tools its instructions call (php) and credentials named DB_PASSWORD.

Does Testing Patterns access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Testing Patterns safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Testing Patterns use?

Testing Patterns is published under the GPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Testing Patterns use?

About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Testing Patterns?

Skills that share tags, products or a category with Testing Patterns: Async Test And Doc Sync (discord-php/DiscordPHP, 1.1k stars), Writing Tests (vert-x3/vertx-redis-client, 142 stars), Configuring Horizon (coollabsio/coolify, 63k stars) and Laravel Sessions Middleware (HoangNguyen0403/agent-skills-standard, 571 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Testing Patterns?

OpenLitterMap (a GitHub organization) maintains it in OpenLitterMap/openlittermap-web, which has 134 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on September 14, 2026.

Source: OpenLitterMap/openlittermap-web on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.