CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

programming

Applies strict, modern language practice (typed errors, exhaustive match, tests that can fail) for Python, Rust, TypeScript, JavaScript, and Go. Use for work on .py, .rs, .ts, .js, or .go files, and whenever a test or spec file is written, reshaped, reviewed, or deleted: the four-question test authoring gate and the junk-test classes live here.

Quality

84%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

Programming

You own this code. What it is for and how it is built are your call, so change it the way its owner would: fit new behavior into the structure that is there and leave no duplicate or dead code behind. A defect in the code you are changing is yours to fix now, at its root cause; never excuse it as pre-existing, someone else's, or the tool's fault. One elsewhere goes in your summary as a follow-up.

This skill is an index. The hard per-language rules live under references/. Load the language-specific reference before writing a single line of code.


PHASE 0 — LANGUAGE GATE (RUN THIS FIRST, EVERY TIME)

DO NOT WRITE OR EDIT A SINGLE LINE OF CODE BEFORE COMPLETING THIS GATE.

  1. Identify the language from the file extension or the user's request.

  2. STOP and read the matching reference set:

    File / LanguageMANDATORY reading (load Read tool on every file below)
    .py, .pyi, "Python"references/python/README.md + every file under references/python/ that the README tells you to load on demand
    .rs, Cargo.toml, "Rust"references/rust/README.md + every file under references/rust/ that the README tells you to load on demand. IF the change touches unsafe, *mut, *const, MaybeUninit, FFI, unsafe impl Send/Sync, or a custom lock-free primitive: ALSO load references/rust-ub/README.md plus every file under references/rust-ub/.
    .ts, .tsx, .mts, .cts, .js, .jsx, .mjs, .cjs, "TypeScript" / "JavaScript"references/typescript/README.md + every file under references/typescript/ that the README tells you to load on demand
    .go, go.mod, go.sum, .golangci.yml, *.proto next to a Go module, "Go" / "Golang"references/go/README.md + every file under references/go/ that the README tells you to load on demand
    any test file (*.test.*, *.spec.*, *_test.go, test_*.py, *_test.py, under test/, tests/ or __tests__/), or a change that adds, reshapes, or deletes a testthe language row above PLUS references/testing/README.md (the authoring gate) and references/testing/junk-classes.md (the table the gate reviewer applies)
  3. Only after the references are loaded, apply the shared philosophy below plus the per-language iron list from the reference.

No exceptions for "small" or "one-off" code. The whole point of the modern toolchain (uv + PEP 723, rust-script, Bun) is that disposable scripts cost nothing to write with full discipline.


Shared philosophy (all four languages)

These are not style preferences. They are the seven axioms every recipe in references/ derives from.

  1. The best code is the code never written. Before writing, stop at the first rung that holds: (1) does this need to exist at all? (YAGNI) (2) does this codebase already have it? — reuse the helper or pattern, do not re-implement. (3) does the standard library do it? (4) does a native platform feature cover it? (5) does an installed dependency solve it? (6) can it be one line? (7) only then, write the minimum that works. Climb the ladder after you understand the problem and trace the real flow end to end — the smallest diff in the wrong place is a second bug. The ladder is a fast decision, not a written essay: pick the rung and move. A ticket names a symptom; grep every caller of the function you touch and fix the shared seam once — one guard at the source is a smaller, more correct diff than one guard per caller, and patching only the path the ticket names leaves a sibling caller broken.

  2. The type system is your proof system. Make illegal states unrepresentable. The compiler / type checker is the cheapest test you will ever run. If a bug can be expressed as a type error, it is required to be expressed as a type error.

  3. Parse, don't validate. Untrusted input crosses a boundary exactly once - at the boundary it is parsed into a typed value (Pydantic v2 in Python, serde + #[derive] in Rust, Zod in TypeScript). Inside the boundary, code receives typed values and never re-validates. The boundary owns trust; the interior owns logic.

  4. One name = one concept. A UserId is not a string. A Seconds is not a Milliseconds. Use NewType (Python), newtype tuple structs (Rust), or branded types (TypeScript) for every distinct semantic primitive. The compiler refuses to let two semantic units mix.

  5. Exhaustive variant matching, always. Discriminated unions and enums are matched exhaustively. Python: match + case unreachable: assert_never(unreachable). Rust: match (the compiler enforces). TypeScript: switch + assertNever. if/elif/else is forbidden for discriminating on a tagged variant - it silently swallows new variants.

  6. Trust framework guarantees. Validate only at boundaries. No null checks for values the type system already proves non-null. No try/except around code that cannot raise. No unwrap/!/as to paper over a contract you should have encoded in types. No defensive layer for a scenario you cannot name.

  7. Tests are the behavior of record, and only tests that can fail count. READ the tests covering the area BEFORE you change it: do they encode the intent, cover this path, pass? One wrong before your change is a FINDING — never edit it green. Reproduce a bug before fixing it. The run proves the change; add a test ONLY where the repository keeps tests for this behavior AND a regression would otherwise pass unnoticed — sized like its neighbors, never restating the change. The authoring gate and the junk-class table are in references/testing/.


TEST DISCIPLINE

Tests are code: the language gate above applies to them, plus references/testing/README.md (the contract every language's recipes assume) and references/testing/junk-classes.md (the table the gate reviewer applies to every test in a diff). Read both before adding, reshaping, or deleting a test.

The authoring gate. Before a test exists, answer all four; a missing answer means do not add it yet.

  1. What observable behavior, invariant, or independent contract does it protect?
  2. What credible regression makes it fail?
  3. Why does existing coverage not already catch that failure? One primary owner per contract, at the strongest boundary; extend a table row before adding a near-duplicate, a copy in another package, or a replay through a wrapper.
  4. Does it need a production seam (export, flag, getter, wrapper, injection hook) no production caller needs? Then test at the real boundary instead.

The README owns the shape (Given / When / Then, the pyramid, the mock ladder, determinism, isolation, the prompt-test rule) and the "test your test" step: break the production owner, watch the test go red for the intended reason, restore byte for byte. A test that fails on the unchanged base is a bug to fix at its owner; one your own change turns red is fixed at the code or at the test; neither is deleted or edited green to unblock a run.


Cross-language iron list

Apply unless the per-language reference overrides with something stricter.

RulePythonRustTypeScriptGo
Immutable by default@dataclass(frozen=True, slots=True) / Pydantic frozen=Trueevery binding is let (not let mut) unless mutation is the documented purposeevery field is readonly; arrays are readonly T[]value types, unexported fields, no mutation methods unless mutation is the purpose
Branded primitivesUserId = NewType("UserId", int)struct UserId(u64); (newtype tuple)type UserId = Brand<string, "UserId">type UserID string + smart constructor with unexported field
Exhaustive variant matchingmatch + assert_nevermatch (compiler-enforced)switch + assertNeversealed interface + type switch + exhaustive linter (the compiler will not help)
No untyped escape hatchesno Any in public sigs, no cast, no # type: ignoreno unwrap/expect outside tests (invariant expect only behind #[expect(clippy::expect_used, reason)]), no numeric as, no #[allow] (silence with #[expect(lint, reason)])no any, no as (except as const, satisfies), no !, no @ts-ignore, no @ts-expect-errorno interface{} / bare any in domain sigs; no _ = err; no //nolint without reason
No bare error stringstyped exception dataclass with __str__thiserror enum (lib) or anyhow with .context(...) (app)Error subclass with typed fieldssentinel errors.New + typed *XError struct; wrap with %w; check via errors.Is/As
Boundary catch onlycatch the exact exception you expect; broad except Exception only at a top-level boundary (main()/CLI entry, HTTP handler), with logging + re-raise? everywhere; never panic! in library codecatch must narrow with instanceof and re-throw or convert; no empty catchevery (T, error) checked; panic only in main/tests; one httperr.Write funnel in handlers
Resources via RAIIwith (sync) / async with (async)Drop impl or RAII guardusing/await using (TC39 explicit resource management)defer x.Close() immediately after acquisition; bodyclose/sqlclosecheck linters enforce
Async runtime is mandatoryanyio (NEVER bare asyncio)tokio (async-std is unmaintained)platform-native async (Bun/Node) with structured cancellation via AbortSignalcontext.Context as first param + errgroup for structured concurrency; -race on every test
Modern HTTP clienthttpx2 with HTTP/2 + brotli + zstdreqwest with rustlsky (default) / undici direct API (Node perf) - NEVER bare fetch in prodstdlib net/http.Client with tuned Transport + go-retryablehttp for retry/backoff
No parameter mutationparams are inputs; produce a new value&mut only when mutation is the documented purposeparameters never reassigned (noParameterAssign)value receivers when not mutating; pointer receivers only for genuine mutation; copylocks vet enforces
No helpers for one-offinline a 3-line operation; do not abstract until the second callersamesamesame

Modern ecosystem - canonical libraries (2026)

Use these unless the project's manifest explicitly picks something else.

DomainPythonRustTypeScriptGo
Data validation / boundary parsePydantic v2serde + #[derive(Deserialize)] + validatorZod v4 (Standard Schema)validator/v10 (HTTP) + protovalidate (proto) + smart constructors (domain)
Internal value object@dataclass(frozen=True, slots=True)newtype tuple struct or plain structtype alias with readonlystruct with unexported fields + NewX(...) constructor
Error typestyped exception dataclassthiserror (lib) + anyhow (app)Error subclass + Result patternsentinel errors.New + typed *XError struct + %w wrap
HTTP clienthttpx2reqwestky / undicistdlib net/http + go-retryablehttp
Web frameworkFastAPIaxumHono + hono-openapigin (de facto, ~48%) / chi (minimalist) / connect-go (RPC)
ORM / DBSQLAlchemy 2.x async + asyncpgsqlx (compile-time checked)Drizzlesqlc (codegen from .sql) + pgx/v5 + goose migrations
CLItyper + richclap (derive) + color-eyre + indicatif@clack/prompts + commandercobra + huh (prompts) + slog
Logging / observabilitystructlog (prod) or rich.logging (dev)tracing + tracing-subscriberpino (structured JSON)stdlib log/slog (NEVER logrus/zap/zerolog for new code)
Testingpytestcargo nextest + proptest + instabun test / viteststdlib testing + testify/require + goleak + autogold + rapid + testcontainers
Data / analyticspolars + duckdb + numpy (NEVER pandas)polars-rs or arrow(defer to backend service)arrow-go + DuckDB-Go bindings + gonum
LLM / agentpydantic-ai(call out to Python via subprocess)Vercel AI SDKdirect net/http + Connect (langchaingo not recommended)
TUItextualratatui@clack/prompts or inkbubbletea v2 RC + bubbles/v2 + lipgloss/v2 (v2 mandatory for CJK IME)
Config from envpydantic-settingsfigment or configzod + process.envcaarlos0/env/v11 (struct-tag env)

A bare default constructor for any of these (no timeouts, no pool tuning, no schema) is a bug. See the per-language reference for the canonical production defaults.


Modern toolchain - the only acceptable setup

Tool categoryPythonRustTypeScriptGo
Package / project manageruv (NEVER pip/poetry/conda)cargo + cargo-nextest + cargo-machete + cargo-denyBun (runtime + package manager); pnpm if Node is forcedgo modules + go work for monorepos
Type checkerbasedpyright with typeCheckingMode = "all"the Rust compiler with -D warnings + clippy pedantic + nursery + cargo groupstsc --noEmit (or tsgo when available) with strict + noUncheckedIndexedAccess + exactOptionalPropertyTypes + verbatimModuleSyntaxthe Go compiler + golangci-lint v2 with the strict bundle + nilaway (nil-deref static analysis)
Linter + formatterruff with select = ["ALL"]clippy + rustfmtoxlint + oxfmt, with the local copy and suppression-reason rulesgofumpt (stricter gofmt) + goimports -local + golangci-lint v2
Test runnerpytestcargo-nextestbun test / viteststdlib go test -race -shuffle=on -count=1 + goleak
UB / soundness gate(n/a)nightly miri with strict provenance + Tree Borrows pass(n/a)nilaway + -race detector + goleak are the equivalent gate
Disposable scriptsPEP 723 inline metadata + uv run script.pyrust-script with inline Cargo.toml blockbun run script.ts//go:build ignore + go run script.go
Bootstrap a new projectbun run scripts/python/new-project.tsbun run scripts/rust/new-project.tsbun run scripts/typescript/new-project.tsbun run scripts/go/new-project.ts
Pre-commit / CI gateruff check . && basedpyright && pytestcargo clippy --all-targets -- -D warnings && cargo nextest run && cargo test --doc && cargo +nightly miri nextest runbunx oxlint --type-aware --deny-warnings && bunx oxfmt --check && bunx tsc --noEmit && bun testgofumpt -l . && golangci-lint run ./... && nilaway ./... && go test -race -shuffle=on -count=1 ./...

For TS/JS, use oxlint + oxfmt with these two rules by default: no-em-dash-copy and require-suppression-reason. Strongly prefer this OXC toolchain for new projects; retain ESLint, Prettier, or Biome only when the repository already uses them. Load references/typescript/oxc-lint.md for the complete configs, plugin, and type-aware support requirements. Rewrite paired em dashes as asides using parentheses or commas, not colon chains.

A tsconfig.json with "strict": true alone is not strict. The reference enumerates the additional flags. Same for pyproject.toml and Cargo.toml - the references contain the canonical full configuration.


CODE SMELLS — AUTOMATIC REVIEW TRIGGERS

Most smells below are design review triggers: STOP, re-examine the code, and either fix the smell or justify carrying it with a SPECIFIC reason. The 250 pure LOC ceiling is stricter: >250 is a DEFECT. Refactor before adding lines except for rare SIZE_OK or pure-data-table exceptions.

Full rationale, measurement methods, workaround detection, and split examples: references/code-smells.md.

Smell 1 — File exceeds 250 pure LOC

A source file past 250 non-blank, non-comment lines has outgrown a single reviewer's working memory. The module is almost certainly doing more than one thing. Measure: awk '!/^[[:space:]]*$/ && !/^[[:space:]]*(\/\/|#|--)/' <file> | wc -l.

When detected: Name what the file owns in one short noun phrase. If the answer needs "and", the file needs splitting. Load /refactor and split by responsibility. If the file genuinely cannot be split (generated parser, indivisible state machine), mark it in the first 10 lines with # noqa: SIZE_OK — <reason> in Python (the form scripts/python/check-no-excuse-rules.py reads) or // allow: SIZE_OK — <reason> in //-comment languages.

Smell 2 — Function with more than 3 parameters

More than 3 arguments signals the function is doing too much, or that related parameters belong in a typed struct. Workarounds count as the same smell — passing dict/Record<string, unknown>/map[string]any/**kwargs/...args to smuggle parameters through one argument, or a throwaway "config" object with 6+ fields that exists solely to wrap what would otherwise be positional args (genuine reusable domain types like HttpClientConfig are fine).

When detected: Group related parameters into a typed value object with a domain name. If 4+ independent inputs are genuinely required, the justification must be SPECIFIC. See references/code-smells.md Smell 2 for Python, TypeScript, and Go examples.

Smell 3 — Redundant verification after a destructive action

Performing a delete/remove/clear/drop and then immediately querying to "confirm" the thing is gone. The operation's contract IS the verification. Re-checking is AI-generated defensive bloat that wastes cycles and teaches the reader the operation is unreliable — which it is not. Same smell: calling a setter then getting to "confirm", writing a file then reading it back, inserting a row then SELECT-ing it, pushing to an array then checking .length.

When detected: Delete the verification code. Trust the operation's contract. If the operation can genuinely fail silently, fix the operation — do not paper over it with a post-check. See references/code-smells.md Smell 3 for examples.

Smell 4 — Negative-form names and conditions

Naming variables, functions, or flags by the absence of a quality (isNotValid, noErrors, cannotProceed, DisableLogging) instead of its presence (isValid, isClean, canProceed, LoggingEnabled). Every negation forces the reader to invert mentally; two negations (if !isNotReady) become a logic puzzle nobody reviews confidently.

When detected: Rename to the positive form and invert the branch logic. Negation IS appropriate in guard clauses (if !authorized { return }) and filters (items.filter(|x| !x.is_expired())) — the negative form is the intent there. See references/code-smells.md Smell 4 for the full naming table and examples.


LOGGING — CROSS-CUTTING RULES

Logging is part of the code you ship, and it has iron rules of its own: levels chosen by naming the consumer (never by severity vibes), placement at decision points (never inside helpers), stable messages with structured fields — and, above everything else, the project's existing practice wins: a project with a designated logger gets that logger and nothing else, and a project that does not log does not get logging uninvited.

Read references/logging.md BEFORE the change whenever your edit adds or modifies log lines, sets up a logger or a new service entrypoint, or handles errors at a boundary.


DEPENDENCY UPGRADES — CROSS-CUTTING RULES

  • 0.x minor = major. Semver promises nothing below 1.0: treat 0.N → 0.N+1 as a breaking upgrade — read the changelog, build, and run the full suite before trusting it. A required field appearing in a public options type is a routine 0.x "minor".
  • Version literals live outside the manifest. Before committing a bump, grep the repo for the old version string: Dockerfiles pinning a global CLI, CI workflows, and docs all carry copies. A bump that updates only the package manifest ships a split-brain deploy.
  • Never hand-merge a lockfile. On conflict, take either side whole and regenerate with the package manager — the resolver owns that file, not you.

MANDATORY POST-WRITE REVIEW LOOP

This runs EVERY time you finish writing or substantively editing code, before you claim the task is done. No exceptions.

Step 1 — measure

For every file you created or modified:

awk '!/^[[:space:]]*$/ && !/^[[:space:]]*(\/\/|#|--)/' <file> | wc -l

Or run the per-language checker the skill ships:

# Python
uv run scripts/python/check-no-excuse-rules.py <changed paths>
# Rust
bash scripts/rust/check-no-excuse-rules.sh <changed paths>
# TypeScript
bun run scripts/typescript/check-no-excuse-rules.ts <changed paths>
# Any language, test files you touched: the junk classes a regex can see (candidates for "test your test")
bun run scripts/typescript/check-test-junk.ts <changed test paths>

Step 2 — interpret

Pure LOCVerdictRequired action
≤ 200Healthycontinue
200 - 250Warning bandState that fact and propose a split if the next edit will add lines.
> 250DEFECTDo NOT commit new lines to this file. Refactor now: split the touched unit before adding lines, except for rare SIZE_OK or pure-data-table exceptions.

Step 3 — architectural self-review (always, even at 80 LOC)

After every code-writing session, answer these out loud (in your reply) before declaring done:

  1. Single responsibility? Can I name what this file owns in one short noun phrase? If the answer needs the word "and", split.
  2. Boundary purity? Did I parse untrusted input into a typed value at the boundary, or did I pass dict[str, Any] / serde_json::Value / unknown past the boundary? If the latter, fix it.
  3. Variant discrimination? Did I use if/elif/else (or switch without assertNever, or match without assert_never) anywhere to discriminate on a tagged type or enum? If yes, rewrite as exhaustive match.
  4. Escape hatches? Any Any, # type: ignore, unwrap, expect outside tests, as numeric cast, !, @ts-ignore, @ts-expect-error, a Rust #[allow] instead of #[expect(lint, reason)]? If yes, fix the type or document why with a comment.
  5. Defensive layer? Any null check, try/except, or isinstance guarding a value the type system already proves? If yes, delete.
  6. Helpers for one-off? Any function, class, or trait introduced for a single caller that will never get a second caller? If yes, inline — axiom 0 should have caught it pre-write; this is the backstop.
  7. Tests? Does every test I added or reshaped answer the four-question authoring gate (references/testing/README.md), go red when I break its production owner, and match no row of references/testing/junk-classes.md? Where the repository keeps tests for a behavior I introduced and a regression would otherwise pass unnoticed, is it covered at its owner, not by a copy or a change certificate?
  8. Parameter bloat? Any function I wrote or modified that takes more than 3 parameters — or smuggles them through a dict/kwargs/...args/throwaway options object? If yes, group related params into a typed value object. See Smell 2.
  9. Redundant verification? Did I perform a destructive action (delete, remove, clear) and then immediately re-query to "confirm" it worked? Did I call a setter then a getter to "verify"? If yes, delete the verification — the operation's contract IS the proof. See Smell 3.
  10. Negative naming? Any variable, function, or flag named by the absence of a quality (isNotValid, noErrors, DisableX) when a positive name (isValid, isClean, EnableX) would work? If yes, rename to positive form and invert the branch. See Smell 4.
  11. Logging? If I touched log lines, logger setup, or error boundaries: did I follow the project's existing practice (including its absence)? Is every new line leveled by its consumer, placed at a decision point, and message-stable with data in fields? See references/logging.md.

If any answer fails, fix it before declaring done. This loop is the difference between "the code compiles" and "the code is correct."

Step 4 — if you need to refactor right now, invoke the right skill

  • Any code smell from the CODE SMELLS section fired (250+ LOC, >3 params, redundant verification, negative naming), or step 3 surfaced more than two issues: load the refactor skill and execute its safe-refactor protocol (codemap, plan, LSP-driven edits, test after each step). Do not improvise a refactor under time pressure — the refactor skill exists precisely so you do not corrupt behavior while reshaping structure.
  • You inherited a branch with AI-generated patterns (broad except, redundant null checks, vague TODOs, oversized modules, dead helpers, redundant post-action verification): load the remove-ai-slops skill to do a categorized branch-scope cleanup with regression tests pinned first.

These two skills are not optional cosmetics. They are the recovery path for the smells this loop is designed to catch.


Companion skills - explicit invocation triggers

TriggerSkill to loadWhy
Any code smell fires (250+ LOC, >3 params, redundant verification, negative naming), OR the post-write loop surfaces more than two issues, OR the user says "reshape this", "extract this", "clean this up"refactorSafe codemap-driven multi-step refactor with LSP + tests after each step. Never improvise a structural change.
Recent branch contains AI-authored patterns (broad except, dead helpers, vague comments, oversized files, redundant post-action verification, junk tests), OR the user says "remove slop", "clean AI code", "deslop"remove-ai-slopsBehavior locked by gate-passing tests FIRST, then categorized parallel cleanup (junk tests included, each cut proven by a mutation), then quality gates. Behavior-preserving.
Rust code touches unsafe, *mut, *const, MaybeUninit, FFI, unsafe impl Send/Sync, or a custom lock-free primitivereferences/rust-ub/Full UB taxonomy + Miri strictness escalation. Every unsafe block must survive Miri Level 3 (strict provenance + symbolic alignment + preemption) and the Level 4 Tree Borrows pass before it ships.

Per-language jump table

Stop. Read the matching reference fully before writing code.

Python (.py, .pyi)

READ references/python/README.md FIRST. Then load on demand:

NeedLoad
Strict pyproject.toml / basedpyright / ruff configreferences/python/pyproject-strict.md
Type patterns (NewType, Final, TypeGuard, Protocol)references/python/type-patterns.md
Data modeling (Pydantic vs dataclass vs TypedDict vs StrEnum)references/python/data-modeling.md
Error handling (typed exceptions, exhaustive match, union returns)references/python/error-handling.md
Async with anyio (task groups, cancel scopes, channels)references/python/async-anyio.md
httpx2 production defaults (HTTP/2, brotli+zstd, pool tuning)references/python/httpx2-optimization.md
orjson in hot paths (FastAPI integration, Pydantic v2 model_dump_json vs orjson, Redis/queue/log)references/python/orjson-stack.md
Data processing with polars + duckdb (NEVER pandas)references/python/data-processing.md
FastAPI + SQLAlchemy 2.x async stackreferences/python/fastapi-stack.md
pydantic-ai agentsreferences/python/pydantic-ai.md
Textual TUIreferences/python/textual-tui.md
Disposable PEP 723 scriptsreferences/python/one-liners.md
Canonical library defaultsreferences/python/libraries.md

Rust (.rs, Cargo.toml)

READ references/rust/README.md FIRST. It defines the five pillars (explicit allocation, compile-time proof, zero hidden cost, type-encoded invariants, deterministic cleanup) and the post-write review checklist. Then load on demand:

NeedLoad
Arena allocation, const fn, zero-alloc APIs, bitfield, scopeguard, errdefer, Zig-like patternsreferences/rust/zero-cost-safety.md
Strict Cargo.toml lints + profile + workspace configreferences/rust/cargo-strict.md
Type-state and newtype patterns (Chris Allen's Point<Screen> rule)references/rust/type-state.md
unsafe discipline (safe wrapper + SAFETY comment + miri proof)references/rust/unsafe-discipline.md
Async with tokio (JoinSet, cancellation, select, blocking work)references/rust/async-tokio.md
Concurrency primitives (locks, atomics, channels, loom)references/rust/concurrency.md
axum + sqlx + tracing + tower HTTP stackreferences/rust/axum-stack.md
clap + color-eyre + tracing + indicatif CLI stackreferences/rust/clap-stack.md
Public API design (naming, conversions, traits, rustdoc sections)references/rust/api-design.md
Declarative and procedural macrosreferences/rust/macros.md
Property tests (proptest) + snapshot tests (insta), test placement, doctestsreferences/rust/proptest-insta.md
Disposable rust-script scriptsreferences/rust/one-liners.md
Canonical library defaultsreferences/rust/libraries.md
ANY unsafe / FFI / MaybeUninit / lock-free workreferences/rust-ub/ (full directory)

TypeScript / JavaScript (.ts, .tsx, .mts, .cts, .js, .jsx, .mjs, .cjs)

READ references/typescript/README.md FIRST. Then load on demand:

NeedLoad
Strict tsconfigreferences/typescript/tsconfig-strict.md
Default oxlint + oxfmt configs and copy rulesreferences/typescript/oxc-lint.md
Type patterns (branded types, as const, satisfies, narrowing, assertNever)references/typescript/type-patterns.md
Data modeling (type vs interface vs Zod, readonly, parse-don't-validate)references/typescript/data-modeling.md
Error handling (Result, typed errors, union vs throw, AbortSignal timeouts)references/typescript/error-handling.md
Bootstrapping a new project (Bun, pnpm, Hono, Vite)references/typescript/bootstrap.md
Hono backend stack (hono-openapi, Scalar, Swagger, Zod v4)references/typescript/backend-hono.md

Go (.go, go.mod, go.sum, .golangci.yml, *.proto)

READ references/go/README.md FIRST. Then load on demand:

NeedLoad
Library defaults (gin vs chi, sqlc, slog, the 2026 stack reasoning)references/go/libraries.md
Canonical strict .golangci.yml (v2) with per-linter rationalereferences/go/golangci-strict.md
Project layout, Taskfile, CI, go.mod templatereferences/go/bootstrap.md
Type patterns (named types, smart constructors, sealed interfaces, generics)references/go/type-patterns.md
Data modeling — the three layers of validation (validator/v10 → smart ctor → sqlc)references/go/data-modeling.md
Error handling (errors.Is/As, typed errors, %w wrapping, no panic)references/go/error-handling.md
Concurrency (context.Context, errgroup, channels, locks, -race, goleak)references/go/concurrency.md
HTTP backend stack (gin + slog + validator + pgx, middleware ordering, SSE, WS)references/go/backend-stack.md
RPC stack (Connect-Go default, grpc-go fallback, protovalidate, Buf)references/go/grpc-connect.md
CLI stack (cobra + slog + huh)references/go/cobra-stack.md
Database stack (sqlc + pgx + goose + testcontainers)references/go/sqlc-pgx.md
TUI stack (bubbletea v2 + bubbles v2 + lipgloss v2; CJK / IME support)references/go/bubbletea-v2.md
Testing (Given/When/Then, table-driven, fakes-over-mocks, autogold, rapid)references/go/testing.md
Disposable go run scriptsreferences/go/one-liners.md

Activation

This skill activates whenever you are writing or modifying any .py, .pyi, .rs, .ts, .tsx, .mts, .cts, .js, .jsx, .mjs, .cjs, .go file, any test or spec file in those languages, or any project manifest (pyproject.toml, Cargo.toml, package.json, tsconfig.json, .oxlintrc.json, .oxfmtrc.json, go.mod, go.sum, .golangci.yml, Taskfile.yml, buf.yaml, sqlc.yaml). Even one-off scripts get the full treatment - that is the whole point of uv run + PEP 723, rust-script, bun run, and go run + //go:build ignore: production hygiene with throwaway ergonomics.

The references contain the recipes. Read them before writing code. Re-read them when the model drifts. The post-write review loop is non-negotiable.

Repository

code-yeongyu/oh-my-openagent

Path

packages/shared-skills/skills/programming/SKILL.md

Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.