Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add zakariaf/Flutter-Skills --skill dart3-idioms-and-coding-standardsgit clone --depth 1 https://github.com/zakariaf/Flutter-SkillsWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/zakariaf/flutter-skills/dart3-idioms-and-coding-standards)<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/dart3-idioms-and-coding-standards"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/dart3-idioms-and-coding-standards/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/dart3-idioms-and-coding-standards"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/dart3-idioms-and-coding-standards.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00227 | $0.03780 |
| Opus 5 | $0.00113 | $0.01890 |
| Sonnet 5 | $0.00045 | $0.00756 |
| Haiku 4.5 | $0.00023 | $0.00378 |
Grade A, and why
dart3-idioms-and-coding-standards scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 213 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Dart 3 idioms and coding standards
Modern Dart 3.x, value-type-first, total functions for domain logic. A language feature earns its place when it converts a runtime silence into a compile error; everything else is decoration. This skill governs how each declaration is typed, named, kept immutable, and kept total — the error-handling architecture that rides on top of these mechanics lives in error-handling-typed-results.
Read the reference for the task at hand:
references/construct-verdict-table.md— the feature-by-feature verdict table (sealed / enum / record / class modifiers /extension type/ codegen packages), with the rationale for each Use / Skip.references/immutability-and-equality.md— immutable value types,copyWith, when to hand-write==/hashCode, and stable-identity vs value-equality.references/complexity-and-honesty.md— the length/nesting limits with their evidence, and thelate/!/dynamichonesty-dodge bans in full.
Run scripts/check-dart3-idioms.sh before a PR.
Non-negotiable rules
- A
switchon a sealed type or enum carries nodefault:and nocase _:. A wildcard makes the switch compile forever, discarding the one compile-time guarantee the type exists for — adding a variant then falls through silently at runtime. Exhaustiveness is the whole product. - Reach for exactly three class modifiers; ignore the rest.
sealed classfor a closed variant set the compiler must exhaust;final classfor every concrete leaf;abstract interface classfor a seam a test fake implements. Default concrete types tofinal. Skipbase,extension type, primary constructors, and macros. - Model closed sets of individually actionable cases as a
sealedhierarchy, payload-free closed sets as anenum. Start withenum; convert tosealed+final classthe moment any member needs a field. Never bolt nullable fields onto an enum for data that applies to only some members — that turns every access into a null-check the compiler cannot reason about. - Records never cross a layer boundary. A record is a nameless, positional, undocumented shape — fine for an ephemeral multi-value return inside one layer. The moment a shape is returned from a repository, stored, or passed to a widget constructor, it is a named class.
- Domain values are immutable:
finalfields, aconstconstructor where legal, value equality, andcopyWithto derive. Mutating a value handed to a widget is a rebuild-and-golden-test killer. Preferfinallocals andconstconstructors everywhere the analyzer allows. - Identity is an explicit stable field, never equals-on-all-fields. A value type used in a list or as a map key carries
final String id(or a typed id). Deriving identity from all fields collapses two distinct entities that happen to share values (twoItems both named "Draft") into one. - Make illegal states unrepresentable. Encode a discriminated choice as a sealed variant or an enum-keyed union, not as a bag of nullable fields where only one is ever set. If the type cannot express the bad state, no branch has to guard against it.
- Domain functions are total — they never throw. Every pure function returns a value for every input; uncertainty is an explicit output (a clamped value, a "no result within N steps" outcome, a low-confidence flag). Programmer invariants use
assert(stripped in release), neverthrow. Recoverable I/O failures return a typed result — seeerror-handling-typed-results. - No honesty dodges: no
lateto dodge nullability, no!on a value that matters, nodynamic/Map<String, dynamic>as an ad-hoc model. Each hides a runtime failure the type system would otherwise force you to handle. Use?./??/promotion for null, and a typed model for structured data. - Effective Dart casing, verbatim; constants are
lowerCamelCase.UpperCamelCasetypes/extensions/enums;lowercase_with_underscoresfiles/dirs/import prefixes;lowerCamelCasevars/params/methods/constants (maxItems, neverMAX_ITEMS); acronyms over two letters capitalize as a word (JsonMap,HttpClient, notJSONMap). File name = its primary declaration. - Respect the complexity limits as firm defaults — this table is the library's single source of truth; other skills cite it, they do not restate numbers: method ≤ ~30 lines,
build()≤ ~80, file ≤ ~300, class public API ≤ ~10 members, positional params ≤ 3, logic nesting ≤ 3. Widget build trees legitimately nest deeper — widget build nesting ≤ 5 is the one explicit exception (referenced bywidget-composition). Refactor prompts, not laws — a cohesive overrun (a single state machine scattered across five fragments is worse) is justified in the PR. - Prefer immutable value types; hand-roll trivial ones, reach for
freezedwhen the boilerplate dominates. For a trivial immutable (1–3 fields) hand-write@immutable+constctor +finalfields (+ manual==/Object.hashwhen a map key). For a domain or UI-state value type wherecopyWith/==/hashCode/sealed-union boilerplate gets tedious,freezedis allowed and is the default —*.freezed.dartis a first-class generated artifact. Skipequatable(five lines of==+Object.hashcover it),fpdart/dartz(anEithererases exhaustiveness), and any--enable-experimentflag (an abandoned repo stops building the day the flag is dropped).
What ships with it
7 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 213 lines · 227 tokens per session scan A 3b55d6aa87d7
dart3-idioms-and-coding-standards is a skill published in the GitHub repository zakariaf/Flutter-Skills (2 stars, last pushed 13d ago), licensed MIT. It adds 227 tokens to every session and 3,780 once invoked, about $0.0011 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
rust-check
Run cargo check on the current Rust project to find compile errors.
google-agents-cli-adk-code
This skill should be used when the user wants to "write agent code", "build an agent with ADK", "add a tool", "create a callback", "define an agent", "use state management", or needs ADK (Agent Development Kit) Python API patterns and code examples. Part of the Google ADK skills suite. It provides a quick reference…
use-modern-go
Use the Modern Go Guidelines CLI whenever writing, modifying, fixing, or refactoring Go code. Apply its version-specific guidance to generated changes.
coding
A coding guide for writing and running Python programs in a sandbox. It requires scripts to be small and reproducible, with their actual output or errors reported.
typescript-language
Apply modern TypeScript standards for type safety and maintainability. Use when working with types, interfaces, generics, enums, unions, or tsconfig settings.
android-navigation-3
Install and migrate to Jetpack Navigation 3. Use when implementing Navigation 3 patterns including NavDisplay, NavKey routes, deep links, multiple backstacks, scenes (dialogs, bottom sheets), or migrating from Navigation 2.