156 lines
13 KiB
JSON
156 lines
13 KiB
JSON
[
|
|
{
|
|
"id": 1,
|
|
"name": "stdlib-first-json",
|
|
"description": "encoding/json should be tried first even for high-throughput use cases; third-party libraries are only justified after profiling confirms JSON is the bottleneck",
|
|
"prompt": "I'm building a high-throughput Go API that processes thousands of JSON requests per second. A colleague says: 'You should use jsoniter or sonic from the start — encoding/json is known to be slow and you'll need the performance. There's no reason to start with a worse library when we know we'll need the fast one.' Is this advice correct? What JSON library should I use?",
|
|
"trap": "The colleague's argument sounds pragmatic — why start with a known-slower library if you'll switch later anyway? But the skill teaches stdlib-first: add dependencies only when profiling confirms they are the bottleneck. The model should push back on the colleague and recommend starting with encoding/json.",
|
|
"assertions": [
|
|
{"id": "1.1", "text": "Pushes back on the colleague's advice — recommends starting with encoding/json despite the high-throughput context"},
|
|
{"id": "1.2", "text": "Explains that the standard library should be the default until profiling confirms JSON is actually the bottleneck"},
|
|
{"id": "1.3", "text": "Notes that encoding/json may be sufficient — thousands of requests per second does not automatically justify a third-party library"},
|
|
{"id": "1.4", "text": "Recommends profiling first (pprof) before reaching for jsoniter or sonic"},
|
|
{"id": "1.5", "text": "If mentioning alternatives (jsoniter, sonic), frames them as options for after measurement proves stdlib is insufficient, not as defaults"}
|
|
]
|
|
},
|
|
{
|
|
"id": 2,
|
|
"name": "pgx-over-lib-pq",
|
|
"description": "Tests whether the model recommends pgx over lib/pq for PostgreSQL when advanced features or performance matter",
|
|
"prompt": "I'm starting a new Go project that needs to connect to PostgreSQL. Which driver should I use?",
|
|
"trap": "Without the skill, the model recommends lib/pq because it's more commonly seen in tutorials, missing that pgx is faster and has more features",
|
|
"assertions": [
|
|
{"id": "2.1", "text": "Recommends pgx (github.com/jackc/pgx) as the primary recommendation"},
|
|
{"id": "2.2", "text": "Mentions that pgx is faster than lib/pq"},
|
|
{"id": "2.3", "text": "Notes that pgx supports all PostgreSQL types and advanced features"},
|
|
{"id": "2.4", "text": "May mention lib/pq as an alternative but positions pgx as the preferred choice"},
|
|
{"id": "2.5", "text": "Does NOT recommend lib/pq as the primary choice without mentioning pgx"}
|
|
]
|
|
},
|
|
{
|
|
"id": 3,
|
|
"name": "chi-for-minimal-router",
|
|
"description": "Tests whether the model recommends chi for lightweight routing needs instead of full frameworks",
|
|
"prompt": "I need a simple HTTP router for my Go REST API. It just needs path parameters and middleware support. I want to stay close to net/http. What should I use?",
|
|
"trap": "Without the skill, the model recommends Gin or Echo (full frameworks) when chi's lightweight, net/http-compatible router is a better fit",
|
|
"assertions": [
|
|
{"id": "3.1", "text": "Recommends chi (github.com/go-chi/chi) as a strong match for the stated requirements"},
|
|
{"id": "3.2", "text": "Explains that chi is lightweight and composes well with net/http"},
|
|
{"id": "3.3", "text": "Notes that chi has minimal dependencies"},
|
|
{"id": "3.4", "text": "May mention Gin/Echo as alternatives but positions chi as the better fit for staying close to net/http"},
|
|
{"id": "3.5", "text": "Does NOT recommend a full framework (Gin, Echo, Fiber) as the primary choice when the user explicitly wants to stay close to net/http"}
|
|
]
|
|
},
|
|
{
|
|
"id": 4,
|
|
"name": "slog-over-external-loggers",
|
|
"description": "Tests whether the model considers log/slog (Go 1.21+) before recommending external logging libraries",
|
|
"prompt": "I need structured logging in my Go 1.22 project. What library should I use?",
|
|
"trap": "Without the skill, the model jumps to zap or zerolog without mentioning that Go 1.21+ has log/slog in the standard library",
|
|
"assertions": [
|
|
{"id": "4.1", "text": "Mentions log/slog as the standard library option for structured logging (available since Go 1.21)"},
|
|
{"id": "4.2", "text": "Presents slog as a viable option, not just an afterthought"},
|
|
{"id": "4.3", "text": "If recommending external libraries (zap, zerolog), explains what specific value they add over slog"},
|
|
{"id": "4.4", "text": "Does NOT skip standard library consideration entirely"},
|
|
{"id": "4.5", "text": "May mention zap/zerolog for specific use cases (zero-allocation hot paths, etc.)"}
|
|
]
|
|
},
|
|
{
|
|
"id": 5,
|
|
"name": "sqlc-vs-orm-decision",
|
|
"description": "Tests whether the model presents sqlc as an alternative to ORMs when the user values type safety and compile-time checks",
|
|
"prompt": "I want to interact with my PostgreSQL database in Go. I want maximum type safety and want the compiler to catch SQL errors. What should I use?",
|
|
"trap": "Without the skill, the model recommends GORM (most popular ORM) which uses runtime reflection, missing sqlc which generates type-safe code from SQL at compile time",
|
|
"assertions": [
|
|
{"id": "5.1", "text": "Recommends sqlc (github.com/sqlc-dev/sqlc) as a primary option for compile-time SQL safety"},
|
|
{"id": "5.2", "text": "Explains that sqlc generates type-safe Go code from SQL with no runtime reflection"},
|
|
{"id": "5.3", "text": "Mentions that GORM uses runtime reflection which does not catch SQL errors at compile time"},
|
|
{"id": "5.4", "text": "May also mention ent as a code-generated alternative"},
|
|
{"id": "5.5", "text": "Does NOT recommend only GORM when the user explicitly asks for compile-time safety"}
|
|
]
|
|
},
|
|
{
|
|
"id": 6,
|
|
"name": "rate-limiter-stdlib-first",
|
|
"description": "Tests whether the model recommends golang.org/x/time/rate before third-party rate limiters",
|
|
"prompt": "I need to add rate limiting to my Go HTTP API. What should I use?",
|
|
"trap": "Without the skill, the model recommends a third-party rate limiter without mentioning the official golang.org/x/time/rate package",
|
|
"assertions": [
|
|
{"id": "6.1", "text": "Recommends golang.org/x/time/rate as the standard/official option"},
|
|
{"id": "6.2", "text": "Explains that it implements a token bucket algorithm"},
|
|
{"id": "6.3", "text": "May mention third-party alternatives (Tollbooth/limiter) for HTTP middleware integration"},
|
|
{"id": "6.4", "text": "Does NOT skip the official x/time/rate package entirely"},
|
|
{"id": "6.5", "text": "Explains when third-party middleware might be preferred (e.g., per-IP limiting, distributed rate limiting)"}
|
|
]
|
|
},
|
|
{
|
|
"id": 7,
|
|
"name": "franz-go-for-kafka",
|
|
"description": "Tests whether the model recommends franz-go for Kafka instead of only the legacy sarama client",
|
|
"prompt": "I need a Kafka client for my Go application. What library should I use?",
|
|
"trap": "Without the skill, the model recommends sarama (the legacy, most commonly referenced Kafka client) instead of franz-go which is modern, higher-performance, and better maintained",
|
|
"assertions": [
|
|
{"id": "7.1", "text": "Recommends franz-go (github.com/twmb/franz-go) as a primary recommendation"},
|
|
{"id": "7.2", "text": "Describes franz-go as modern, high-performance, and feature-complete"},
|
|
{"id": "7.3", "text": "Does NOT recommend only sarama without mentioning franz-go"},
|
|
{"id": "7.4", "text": "May mention sarama as an alternative but positions franz-go as the preferred modern choice"}
|
|
]
|
|
},
|
|
{
|
|
"id": 8,
|
|
"name": "check-maintenance-before-recommending",
|
|
"description": "Tests whether the model checks maintenance status before recommending a library",
|
|
"prompt": "I need a logging library for my Go project. Someone suggested Logrus. Should I use it?",
|
|
"trap": "Without the skill, the model recommends Logrus without noting its maintenance status (deprecated in favor of structured logging)",
|
|
"assertions": [
|
|
{"id": "8.1", "text": "Mentions that Logrus is deprecated or in maintenance mode"},
|
|
{"id": "8.2", "text": "Suggests alternatives: log/slog (stdlib), zap, or zerolog"},
|
|
{"id": "8.3", "text": "Explains that for new projects, a maintained alternative is preferred"},
|
|
{"id": "8.4", "text": "Does NOT unconditionally recommend Logrus without mentioning its deprecation status"},
|
|
{"id": "8.5", "text": "Prioritizes maturity and maintenance status in the recommendation"}
|
|
]
|
|
},
|
|
{
|
|
"id": 9,
|
|
"name": "avoid-unnecessary-wrappers",
|
|
"description": "Tests that the model warns against libraries that just wrap stdlib without adding value",
|
|
"prompt": "I found a Go library that provides helper functions for HTTP request handling, basically wrapping net/http with slightly more convenient syntax. Should I add it to my project?",
|
|
"trap": "Without the skill, the model evaluates only the convenience factor without considering the anti-pattern of wrapping stdlib without real value",
|
|
"assertions": [
|
|
{"id": "9.1", "text": "Warns against using libraries that wrap standard library functionality without adding meaningful value"},
|
|
{"id": "9.2", "text": "Explains that more dependencies increase attack surface and maintenance burden"},
|
|
{"id": "9.3", "text": "Recommends evaluating whether net/http itself is sufficient"},
|
|
{"id": "9.4", "text": "Mentions the anti-pattern of adding dependencies for marginal convenience"},
|
|
{"id": "9.5", "text": "Suggests considering the library's dependency footprint relative to the value it provides"}
|
|
]
|
|
},
|
|
{
|
|
"id": 10,
|
|
"name": "testcontainers-for-integration",
|
|
"description": "testcontainers-go is preferred over shared docker-compose for integration tests because each test gets an isolated, fresh container",
|
|
"prompt": "We already have a docker-compose.yml for local development with PostgreSQL and Redis. A teammate says: 'For integration tests, just document that developers should run docker-compose up before running go test -tags=integration. That way we reuse the same infrastructure we already have and don't add a new dependency.' Is this a good approach? What would you recommend instead?",
|
|
"trap": "The teammate's approach seems pragmatic — reuse existing infrastructure, avoid adding testcontainers-go as a dependency. The skill teaches testcontainers-go is better for test isolation: each test run gets a fresh container (no state leakage between test runs), tests are fully self-contained (no 'remember to run docker-compose up'), and CI doesn't need to maintain a shared running stack.",
|
|
"assertions": [
|
|
{"id": "10.1", "text": "Pushes back on the teammate's docker-compose approach — identifies its key problems: shared state between test runs, manual setup requirement, CI complexity"},
|
|
{"id": "10.2", "text": "Recommends testcontainers-go as the preferred alternative for programmatic, isolated integration tests"},
|
|
{"id": "10.3", "text": "Explains the key advantage: each test suite gets a fresh container spun up and torn down automatically — no state leakage, no manual prerequisites"},
|
|
{"id": "10.4", "text": "Notes that testcontainers-go tests are fully self-contained: go test -tags=integration works without any external setup"},
|
|
{"id": "10.5", "text": "Acknowledges the dependency cost but frames it as justified by the isolation and reproducibility benefits"}
|
|
]
|
|
},
|
|
{
|
|
"id": 11,
|
|
"name": "slices-maps-packages-go121",
|
|
"description": "Tests whether the model recommends the standard library slices/maps packages (Go 1.21+) instead of external utility libraries for basic operations",
|
|
"prompt": "I need utility functions for slice operations in my Go 1.22 project — things like contains, sort, filter, and reverse. What should I use?",
|
|
"trap": "Without the skill, the model recommends samber/lo or a similar utility library for basic operations that the standard library slices package already provides since Go 1.21",
|
|
"assertions": [
|
|
{"id": "11.1", "text": "Recommends the standard library slices package (Go 1.21+) for Contains, Sort, Reverse, and similar operations"},
|
|
{"id": "11.2", "text": "Does NOT recommend only external libraries for basic slice operations that slices package covers"},
|
|
{"id": "11.3", "text": "May mention samber/lo or similar for functional operations (Map, Filter, Reduce) not in stdlib slices"},
|
|
{"id": "11.4", "text": "Distinguishes between operations covered by stdlib (Contains, Sort, Reverse, Compact, BinarySearch) and those requiring external libraries (Map, Filter, GroupBy)"},
|
|
{"id": "11.5", "text": "Applies the 'standard library first' principle"}
|
|
]
|
|
}
|
|
]
|