zakariaf
UserOne prompt in. A researched, designed, planned, implemented app out — you make exactly one decision: which design. A hyperresearch-style multi-agent pipeline for Claude Code.
Categories
Indexed Skills (70)
hyperbuild-1-intake
Step 1 of the hyperbuild pipeline — persists the verbatim app idea as gospel (runs/<run_tag>/idea.md), mints the run_tag (slug + random 6-hex suffix), resolves the target platform (stated > inferred, with category defaults) into decisions/platform.md, detects the scale gear (standard | premier), initializes manifest.json and scaffold.md, and seeds TodoWrite with every pipeline step. Spawns no subagents. Every later step and every subagent re-reads what this step writes. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-10-skill-forge
Step 10 of the hyperbuild pipeline — generates the five PROJECT-SPECIFIC Claude Code skills into .claude/skills/ (app-code-style, app-architecture, app-testing, app-components, app-review-checklist) in the rich four-part anatomy (SKILL.md + references/ + examples/ + scripts/ PASS-FAIL gates) by spawning 5 hb-skill-smith subagents in parallel, each grounded in research/02-engineering/author/stack-guide.md + research/product-spec.md, bound by step 9's research/04-claude-skills/author/skill-authoring-guide.md, and adapting harvested skills from step 9's shortlist where they fit. These skills steer every step 14 implementer and arm the step 15 critics; app-components gets its concrete design-token references wired later by step 13. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-11-epics
Step 11 of the hyperbuild pipeline — turns the PRD and feature specs into the full backlog: epics/00-overview.md with the PRD coverage matrix, one epics/NN-<slug>/ dir per epic, one task file per task with the frontmatter contract step 14 keys off. Spawns 1 hb-epic-planner (orchestrator approves the breakdown), then parallel hb-task-author subagents (one per epic), then an hb-spec-critic coverage audit — every must/should PRD feature maps to ≥1 task. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-12-design-gate
Step 12 of the hyperbuild pipeline — the Stage-A hard gate and THE ONE permitted stop. Spawns 1 hb-gate-verifier to mechanically run the full Stage-A checklist (research vault, PRD, feature specs, stack guide, 3 complete design systems with every full/partial screen mocked + screenshotted and art-direction cards for none screens, step 8.5's visual-QA findings with zero unresolved criticals, generated skills, full backlog with PRD↔epics coverage, and the research archive's shape: the four FIXED-name areas, a non-empty verify/ in each, provenance blocks everywhere), writes runs/<run_tag>/gates/design-gate-report.md and — on pass — research/README.md (the areas index + REUSABILITY GUIDE, docs/RESEARCH-ARCHIVE.md §8), then stops the pipeline with a user-facing summary ending in "run /hyperbuild-choose a|b|c", setting manifest blocked_on: "design-choice". On fail: fix artifacts, re-run the gate, max 3 rounds, then blocked + honest report. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-13-scaffold
Step 13 of the hyperbuild pipeline — the first step of Stage B (BUILD). Initializes the real project in app/ per the committed decisions in research/02-engineering/author/stack-guide.md and runs/<run_tag>/decisions/platform.md, git-inits app/ with a platform .gitignore (step 14's per-epic reviews need diffs), spawns ONE hb-implementer to wire lint + formatter + test harness + CI and translate the CHOSEN design's tokens.css into the target framework's theme file(s), updates the generated app-components skill with concrete theme file references, and verifies the empty app builds and its smoke test passes before making the repo's initial commit and exiting. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-14-implement
Step 14 of the hyperbuild pipeline — THE WAVE LOOP, the longest step in Stage B. Schedules the task DAG across ALL epics in waves: each wave is a set of ready tasks with PAIRWISE-DISJOINT files: lists (3–5 standard / 6–10 premier); all of a wave's hb-implementers spawn in ONE parallel batch (idea, PRD section, task file, all generated app-* skills, the chosen design's mockup HTML + screenshots for its screens), each followed by its hb-test-engineer (writes/extends tests — incl. visual/golden-snapshot tests for UI tasks — runs the suite, fixes until green). SYNC POINT between waves: full suite + every generated skill's script gates green — NEVER starts a wave on red — then ONE git commit per wave. When a wave completes an epic's last task: hb-code-critic on the epic's REAL git diff, findings applied by the TOOL-LOCKED (Read+Edit) hb-patcher, structural findings escalate as NEW task files, then an epic commit. Wave plans go to temp/wave-log.md for crash resume; per-epic progress notes live in manifest.json. Inv
hyperbuild-15-adversarial-review
Step 15 of the hyperbuild pipeline — whole-app adversarial review. Spawns 3 critics in parallel (hb-code-critic, hb-spec-critic, hb-ux-critic), each emitting an independent findings JSON to runs/<run_tag>/gates/. The orchestrator ranks and dedupes findings, spawns hb-patcher (TOOL-LOCKED to Read + Edit) to apply surgical fixes, and commits the patch pass in app/. Structural findings become new task files and trigger AT MOST ONE loop back through step 14. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-16-ship-gate
Step 16 of the hyperbuild pipeline — THE ship gate (FINAL STEP). Spawns hb-gate-verifier to run the ship checklist mechanically: full test suite green, lint/analyzer clean, every task status done, every epic acceptance criterion checked, PRD coverage matrix complete, platform-appropriate build succeeds, every generated-skill scripts/*.sh gate passes, the feature→task→file→test TRACEABILITY CHAIN holds for every must/should feature, and app/ is a clean git repo with scaffold/wave/epic history. Produces runs/<run_tag>/gates/ship-report.md. The gate's verdict is final — failures are fixed by changing the app, never by re-interpreting checks; max 3 fix rounds, then blocked with an honest report. On pass, delivers the final user message. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-2-market-recon
Step 2 of the hyperbuild pipeline — competitor recon. Spawns ONE hb-competitor-scout to discover and rank the competitor set, then a parallel wave of hb-competitor-analyst subagents (one per curated competitor: 6–8 standard, 12–15 premier) that each write a dossier to research/01-product-and-market/research/competitors/<slug>.md in the docs/RESEARCH-ARCHIVE.md research-file format (H3 claims written as complete assertions) covering latest version, feature set, changelog cadence, pricing, and store ratings. The orchestrator then registers those claims in runs/<run_tag>/temp/claims-01.json and merges the dossiers into research/01-product-and-market/author/competitor-landscape.md with a feature matrix. Runs concurrently with step 3 as the 2 ∥ 3 pair; step 3.5 audits these artifacts before step 4 builds the PRD on them. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-3-5-research-audit
Step 3.5 of the hyperbuild pipeline — the VERIFY + CRITIQUE + INDEX phases of research area 01-product-and-market, and the home of the REUSABLE VERIFICATION ENGINE that steps 5, 6 and 9 re-run over their own areas. Runs after steps 2 AND 3 (the 2 ∥ 3 pair) both complete. Reads the area claim registry runs/<run_tag>/temp/claims-01.json, spawns ONE hb-claim-verifier PER CLAIM in parallel batches — each told to REFUTE its single claim against primary sources and to write research/01-product-and-market/verify/<dimension>--<claim-slug>.md with a closed-vocabulary verdict (CONFIRMED | PARTIALLY_TRUE | REFUTED | UNVERIFIABLE) — then runs the CRITIQUE PANEL (2 standard / 3 premier, distinct lenses) over the whole area corpus. The orchestrator then PATCHES the area's author/ syntheses per verdict: REFUTED claims leave the argument and are recorded under "## Refuted by verification", PARTIALLY_TRUE claims carry their correction inline, nothing is ever silently deleted — and closes the area with _INDEX.md. Invoked by th
hyperbuild-3-social-mining
Step 3 of the hyperbuild pipeline — social sentiment mining. Spawns 4 hb-sentiment-miner subagents in parallel, one per platform group (reddit / HN+forums / app-store reviews / LinkedIn+X), each mining 25–40 posts (standard) or 60–100 (premier) into research/01-product-and-market/research/sentiment/<platform>.md in the docs/RESEARCH-ARCHIVE.md research-file format (H3 claims written as complete assertions) with verbatim quotes + URLs. The orchestrator registers those claims in runs/<run_tag>/temp/claims-01.json and merges the files into research/01-product-and-market/author/sentiment-synthesis.md — pain points and wish lists ranked by frequency × intensity. Runs concurrently with step 2 as the 2 ∥ 3 pair; step 3.5 audits the synthesis before step 4 traces PRD features to these quotes. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-4-5-feature-specs
Step 4.5 of the hyperbuild pipeline — expands every must/should PRD feature into its own deep spec file at the repo root: features/NN-<slug>.md (frontmatter id, name, moscow, status: specced, screens; eight required body sections) plus the features/00-index.md roster. Cap 15 files (standard) / 25 (premier). Spawns 3–5 hb-feature-author subagents in parallel, features split into batches, every claim evidenced from the research vault. Steps 6–8 draw real flows and content from these specs, step 11 tasks cite feature ids, and the step 12 and 16 gates check feature coverage and status flips. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-4-product-spec
Step 4 of the hyperbuild pipeline — merges the competitor landscape (step 2) and sentiment synthesis (step 3), as audited by step 3.5, into the PRD at research/product-spec.md: personas, a MoSCoW feature list where every must/should traces to competitor evidence or user-demand quotes, differentiators, and THE CANONICAL SCREEN INVENTORY (each screen classified mockup_feasibility: full | partial | none) that steps 8, 11, and 14 all key off. Spawns 1 hb-spec-critic to attack the draft PRD; the orchestrator patches the findings itself via surgical Edits. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-5-stack-research
Step 5 of the hyperbuild pipeline — builds the engineering research area `research/02-engineering/` to the docs/RESEARCH-ARCHIVE.md contract. The orchestrator probes the real toolchain, runs a bounded harvest DISCOVER sweep, then DERIVES 6–8 (standard) / 10–14 (premier) engineering dimensions for the platform chosen in step 1 from a documented base set; spawns ONE hb-stack-researcher per dimension (harvest-first) → research/; extracts every load-bearing claim into temp/claims-02.json; runs the verification engine (one hb-claim-verifier per claim, each told to REFUTE it) → verify/; runs the hb-corpus-critic panel → critique/; writes _INDEX.md; and only THEN authors `research/02-engineering/author/stack-guide.md` on the claims that survived. Steps 10, 13, 14 build by that guide and the step-15 code critic enforces it. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-6-design-research
Step 6 of the hyperbuild pipeline — research area 03-design-system. The orchestrator names EXACTLY 3 design directions that are three genuinely DIFFERENT VISUAL WORLDS (each committing to its own answer on type personality, depth model, shape language, color strategy, density, and data/status form), then spawns ONE wave: 3 hb-design-researcher subagents (one per direction) plus 2 (standard) / 3 (premier) hb-stack-researcher subagents on the SHARED dimensions the platform forces on all three directions — what the target framework can actually render, font availability and licensing, platform design-language conventions, accessibility/contrast constraints. All six-ish docs land in research/03-design-system/research/ in the docs/RESEARCH-ARCHIVE.md format (claims as H3 assertions + Sources + provenance block). The orchestrator registers the area's claims in runs/<run_tag>/temp/claims-03.json, drafts author/design-directions.md, then RUNS THE VERIFICATION ENGINE (step 3.5, phases V1-V6: one hb-claim-verifier per
hyperbuild-7-design-systems
Step 7 of the hyperbuild pipeline — spawns 3 hb-design-system-author subagents in parallel (one per design direction from step 6). Each author reads its direction's research doc and writes a complete design system: runs/<run_tag>/designs/<a|b|c>/design-system.md + tokens.css — a named signature element, a display+body type pairing, light+dark color palettes, spacing, a shape language, a named depth model, motion, illustration/empty-state art direction, data personality, and component specs (buttons, cards, inputs, nav, lists, empty states). docs/DESIGN-CRAFT.md is BINDING on this step. tokens.css follows the three-layer token structure (primitive → semantic → component) unless the direction's research argues otherwise, and must carry real layered elevation, a radius rhythm, both type faces, and motion tokens. Step 8's mockup smiths inline these tokens verbatim; /hyperbuild-choose copies the winning tokens.css to app/design/ and step 13 implements it in the target framework. Invoked by the hyperbuild router vi
hyperbuild-8-5-visual-qa
Step 8.5 of the hyperbuild pipeline — VISUAL QA of the rendered mockups, the first and only point where anything LOOKS at the pixels the user will judge. Spawns 3 hb-design-critic agents in parallel (one per design direction); each VIEWS every rendered screenshot for its direction (the Read tool renders PNGs) against docs/DESIGN-CRAFT.md §4 (layout integrity) and that direction's own design-system.md (craft), and files runs/<run_tag>/gates/visual-qa-<letter>.json — findings carrying screen, severity, category, what_is_wrong, fix_instruction. The orchestrator ranks the findings, re-spawns the responsible hb-mockup-smith in PATCH MODE (edit the existing mockup HTML, never rewrite), re-renders the patched screenshots, and re-runs the critic ONCE over the affected screens. MAX 2 rounds — remaining criticals are recorded as known issues, never looped on. Step 12 checks these files and prints unresolved criticals to the user. Invoked by the hyperbuild router via Skill(); not run directly by users.
hyperbuild-8-mockups
Step 8 of the hyperbuild pipeline — reads the PRD's canonical screen inventory, freezes the mockup screen list (every full/partial screen per its mockup_feasibility, cap 12 standard / 20 premier), and spawns 3-6 hb-mockup-smith subagents in parallel, grouped by design, so EVERY full/partial screen exists as a self-contained HTML mockup in all 3 design systems (tokens inlined, REAL PRD content — never lorem ipsum, phone-frame wrapper for mobile; partial screens get real chrome over a clearly-marked placeholder viewport; none screens get an art-direction card per design instead of a mockup). The orchestrator then renders screenshots/<screen>.png for every mockup via headless Chrome and writes runs/<run_tag>/designs/index.html — a side-by-side iframe gallery grouped by screen with design names and jump nav — the page the user opens to pick a design at the step 12 gate. Every smith is bound by docs/DESIGN-CRAFT.md — the craft contract (signature element, depth model, shape language, type pairing, CSS-drawn art) p
hyperbuild-9-skill-research
Step 9 of the hyperbuild pipeline — research area 04-claude-skills: deep research on Claude Code skill authoring. Spawns 4 hb-stack-researcher subagents in ONE parallel wave, one per dimension (skill format and frontmatter; progressive disclosure and file splitting; check-script gates; harvested-collection survey), each writing research/04-claude-skills/research/<dimension>.md in the docs/RESEARCH-ARCHIVE.md format (claims as H3 assertions + Sources + provenance block). Claude Code mechanics are EXACTLY where invented frontmatter fields, invented size limits and invented triggering behaviour appear, so the orchestrator registers every claim in runs/<run_tag>/temp/claims-04.json, drafts research/04-claude-skills/author/skill-authoring-guide.md, and RUNS THE VERIFICATION ENGINE (step 3.5, phases V1-V6: one hb-claim-verifier per claim hunting invented names first, a 2/3-seat hb-corpus-critic panel, the author patch, and _INDEX.md). The guide ends in a binding "Rules for our generated skills" section that step 10
hyperbuild-choose
Human checkpoint of the hyperbuild pipeline — the user's ONE decision. Invoked directly by the user as /hyperbuild-choose <a|b|c> [platform] after the Stage-A design gate (step 12) parks the run with blocked_on: "design-choice". Validates the run is actually at the gate, writes decisions/design-choice.md, copies the chosen design's tokens.css and design-system.md to app/design/, flips the manifest to stage: "BUILD" (an optional second argument overrides the platform, which marks steps 5, 10, and 11 for re-run), then invokes Skill(skill: "hyperbuild") so the router's resume logic drives Stage B. This skill does NO build work.
hyperbuild-redesign
Generate a NEW set of design directions for a run parked at the Stage-A design gate. Invoked directly by the user as /hyperbuild-redesign [notes], where notes are free-form ("bolder, more playful", "keep c, replace a and b", "nothing beige", "more like Duolingo's energy"). Parses KEEP/REPLACE instructions — kept directions survive untouched with their letters, only the replaced slots regenerate — archives everything it replaces under runs/<run_tag>/designs/archive/round-<N>/, then re-runs step 6 (design research) for the new slots with the user's notes appended to the direction brief as binding constraints, followed by step 7 (design systems), step 8 (mockups + screenshots) and the step-8.5 visual QA for those slots only, rebuilds directions.md + designs/index.html, re-runs the step-12 gate and parks the run again. Repeatable — round 2, 3, … each archive their predecessors. Records every round in runs/<run_tag>/decisions/revisions.md. Does NO build work and never touches app/.
hyperbuild-revise
Change something BEFORE the build starts. Invoked directly by the user as /hyperbuild-revise <plain-English change> on a run parked at the Stage-A design gate (step 12, blocked_on: "design-choice"). Classifies the request into a revision scope — idea | feature | design | epics — states the resolved plan and blast radius, then applies it: idea → a dated "## Revisions" entry appended to runs/<run_tag>/idea.md (the verbatim idea is never rewritten) plus re-runs of steps 4/4.5 and everything downstream that depends on them; feature → surgical edits to features/*.md + 00-index.md then scoped re-runs of 8/11; design → a scoped re-run of one direction's system author + mockup smiths + screenshots + 8.5 visual QA (new DIRECTIONS go to /hyperbuild-redesign instead); epics → a re-run of step 11 under the stated constraint. Always ends by re-running the step-12 gate so the run parks cleanly again, and records every revision in runs/<run_tag>/decisions/revisions.md. Does NO build work and never touches app/.
hyperbuild
Turns ONE app idea into a fully researched, designed, planned, and implemented application via the hyperbuild 19-step, two-stage pipeline: Stage A — PLAN (steps 1–12, autonomous: market recon, social mining, adversarial research audit — every load-bearing claim fact-checked by its own agent into a four-phase research archive — PRD, feature specs, stack research, 3 complete design systems with HTML mockups of every screen, adversarial VISUAL QA of every rendered screen, project-specific generated skills, epics/tasks) → ONE human checkpoint (`/hyperbuild-choose <a|b|c>`) → Stage B — BUILD (steps 13–16, autonomous: scaffold, implement, adversarial review, ship gate). This entry skill is a ROUTER. It contains no step procedures — it tells you which Skill to invoke for each step, in order, and how to recover a crashed run. Each step's instructions live in its own skill file (hyperbuild-1-intake through hyperbuild-16-ship-gate) and are loaded fresh into context when invoked.
run-codegen
Runs the deterministic build_runner codegen pass (drift_dev, freezed, json_serializable, riverpod_generator) as one pinned command with --delete-conflicting-outputs, always before flutter analyze, never hand-editing or force-committing generated *.g.dart / *.freezed.dart / *.drift.dart output, watch only in local dev. Use when regenerating codegen, fixing "missing part file" / "conflicting outputs" / undefined generated-class analyzer errors, after editing a drift table or DAO, a freezed value object, a riverpod Notifier or provider, or a json_serializable model, or after a fresh git clone, branch switch, or pull.
run-migration
Runs the forward-only Drift/SQLite schema-migration ritual — the most dangerous deterministic operation in an offline-first app: a bad migration silently destroys on-device rows that exist nowhere else. Enforces the exact ordered sequence: take a pre-migration file snapshot before the database is opened, bump schemaVersion by exactly one, write an append-only stepByStep forward step (never edit a shipped step, never write a down migration), commit the drift_dev make-migrations schema snapshot, regenerate, then prove it with tests covering every from→to path (incl. multi-version jumps), a write-at-v(n)/read-at-v(n+1) content test, PRAGMA integrity_check + foreign_key_check, and a forced mid-migration throw that restores the snapshot. Manual, side-effecting workflow. Use when adding or altering a Drift table, column, index, or CHECK; bumping schemaVersion; editing onUpgrade/stepByStep; or writing migration tests.
accessibility-as-code
Enforces accessibility as a correctness property authored into each widget — Semantics(button/label) or ExcludeSemantics on every node, a11y state read from MediaQuery not app state, never MediaQuery.withClampedTextScaling / textScaleFactor / FittedBox / TextOverflow.ellipsis to fit a label, non-color redundant channels (icon+label+shape+text) for every state, contrast against composited backgrounds (4.5:1 body / 3:1 large), 44px single-tap targets, OrdinalSortKey traversal, and honoring boldText / reduce-motion. Use when adding a GestureDetector/InkWell or any tap target, adding an Icon or Image, reaching for withClampedTextScaling/FittedBox/ellipsis/textScaleFactor to make text fit, encoding state via color, sizing type, ordering focus traversal, or reviewing any View for screen-reader/switch/low-vision support.
adaptive-layout
Enforces adapting layout by available CONSTRAINTS/size, never device or platform checks — LayoutBuilder + MediaQuery.sizeOf/paddingOf/viewInsetsOf (not .of) for narrow rebuilds, Material 3 window size classes (compact <600, medium 600-840, expanded 840-1200, large >1200) as the breakpoint vocabulary, navigation affordance chosen by width (NavigationBar → NavigationRail → NavigationDrawer), list-detail single-pane-vs-two-pane, readable max-width via ConstrainedBox, Flexible/Expanded/FractionallySizedBox over fixed widths, SafeArea + display cutouts + keyboard insets, never lock orientation, foldable/hinge awareness via MediaQuery.displayFeatures, and golden-matrix verification across sizes. Use when building responsive or adaptive UI, tablet/desktop/foldable support, master-detail or two-pane screens, a NavigationRail-vs-BottomNav shell, breakpoints, LayoutBuilder, MediaQuery sizing, SafeArea/cutouts, or fixing overflow at large widths.
app-startup-and-bootstrap
Enforces a fixed main() cold-launch order — crash-log sink + FlutterError.onError + PlatformDispatcher.onError installed BEFORE any code that can throw, settings/theme read before runApp so the first frame paints correct, real infra constructed in a composition-root bootstrap() and injected via ProviderScope overrideWithValue over throwing placeholder providers, non-blocking warm-up deferred to addPostFrameCallback, exactly two error handlers with NO runZonedGuarded, ProviderException unwrapped before logging, and a WidgetsBindingObserver that flushes durable state on background/resume. Use when editing lib/main.dart, main_<flavor>.dart, bootstrap.dart or app.dart, reordering anything in main(), adding a splash/onboarding/permission gate, restoring theme before first paint, wiring a DB or service into ProviderScope, handling app-lifecycle background/resume flushes, or chasing cold-start latency, ANRs, or first-frame jank.
ci-pipeline-and-gates
Enforces a lean GitHub Actions Flutter CI where every gate maps to one named release-blocking contract — pinned runner + subosito/flutter-action@v2 toolchain, dart format --set-exit-if-changed, flutter analyze --fatal-infos, build_runner and drift schema freshness (git diff --exit-code), flutter test --test-randomize-ordering-seed random, static import/banned-string greps that catch what runtime can't, coverage-as-report-never-a-gate with the upward-lie fixed, verify-never-bless goldens (no --update-goldens in CI), and an honest statement of what CI cannot prove (audio, real fonts, on-device behaviour). Use when editing .github/workflows/*.yml, adding or removing a job or step, wiring a codegen/schema/format/analyze/coverage gate, writing a grep-based policy test or gate script under test/policy or tool/, pinning action versions, or claiming CI proves something it can't.
codegen-and-toolchain
Enforces a deterministic build_runner codegen discipline: run one pinned `dart run build_runner build --delete-conflicting-outputs` pass BEFORE `flutter analyze` (never after), fence every builder with `generate_for:` globs in a per-package `build.yaml`, make one deliberate commit-vs-gitignore decision for `*.g.dart`/`*.freezed.dart`/`*.drift.dart` and back it with the matching CI gate (freshness diff if committed, codegen-first if gitignored), mirror the generated-file globs into the analyzer AND coverage excludes, pin the SDK, and never hand-edit generated output. Use when editing build.yaml, analysis_options.yaml, pubspec.yaml, .gitignore, .gitattributes, or CI workflows; wiring drift_dev/freezed/json_serializable/riverpod_generator/ gen-l10n/mockito codegen; fixing "missing part file", "undefined class _$Foo", or "conflicting outputs" errors; deciding whether to commit generated code; or scoping builders so one edit does not regenerate everything.
custom-canvas-and-gestures
Enforces CustomPainter/Canvas discipline — the View/Painter/Scene split with a dumb painter fed one immutable Scene value type, shouldRepaint as a single value compare kept strictly separate from the AnimationController-as-repaint animation path, one shared affine transform read by BOTH painter and hit-tester (toCanvas/toLogical exact inverses, never re-derive scale), geometry hit-testing (integer lattice or rasterized region-ID buffer, never Path.contains), zero-allocation paint(), gesture-as-pure-translator emitting a typed command to a Notifier (never mutating in the handler), ExcludeSemantics + sibling Semantics speaking display values with redundant non-colour encoding, measured TextPainter fitting, first-party RoundedSuperellipseBorder, physical-pixel hairlines, and Directional-only geometry. Use when writing or reviewing a CustomPainter/CustomPaint, gestures on a canvas, tap/drag hit-testing, canvas animation, measured text fitting, or Semantics over custom-drawn pixels.
dart3-idioms-and-coding-standards
Enforces which Dart 3 construct each declaration earns — sealed class + exhaustive switch with no `default:`/`case _:`, the three class modifiers (`sealed`/`final`/`abstract interface class`) and skip the rest, records as intra-layer tuples only, immutable value types (`final` fields, `const` ctor, value equality) hand-rolled when trivial and `freezed` when boilerplate dominates, explicit stable identity, total non-throwing domain functions, make-illegal-states-unrepresentable, and firm method/build/file/nesting complexity limits (the single-source-of-truth table other skills cite) — while banning `late`/`!`/`dynamic` honesty dodges. Use when authoring or reviewing any Dart type or declaration: class vs enum vs record vs typedef, hand-rolled vs `freezed`, adding a `switch`/`if-case`, writing `copyWith` or `==`/`hashCode`, deciding identity, keeping a domain function total, or hitting a length/nesting limit.
dartdoc-conventions
Enforces Effective-Dart documentation on the public surface — a `///` doc on every public class/method/getter/field/typedef, a one-sentence standalone summary that says WHY plus units/ranges/nullability/throws/side-effects (never a restatement of the name), verb-phrase method docs, "Whether…" boolean getters, `[bracket]` cross-links, one `library;` doc per exported barrel, in-body `//` that explains why not what, and the enforced invariant restated at its enforcement point — backed by `public_member_api_docs` and `dangling_library_doc_comments` as analyzer errors. Use when adding or reviewing a public API, a Notifier/provider, a Service interface, a sealed Failure, a value type, or preparing a package's dartdoc.
dependency-hygiene
Enforces pubspec/lock discipline — caret ranges in pubspec.yaml with a committed pubspec.lock as the only pin, a separately-recorded SDK version string, a version-pinned very_good_analysis include (whose missing file fails default analyze, or silently drops the ruleset where warnings are non-fatal), transitive-tree auditing before adding a package, a dependency gate that refuses network/telemetry/crash/ads/heavy-transitive deps by policy, and vendoring any bus-factor-1 native plugin behind an interface into third_party/. Use when running dart pub add/get/upgrade/outdated/deps, editing pubspec.yaml or pubspec.lock, bumping the Flutter/Dart SDK, choosing or rejecting a new dependency, removing a package, or auditing what a dependency drags in.
design-system-structure
Structures a Flutter design system as tokens→theme→modifiers→shapes with two-tier tokens (primitives named by measured value, semantic slots named by role) exposed through a ThemeExtension read via an asserting of(context); hand-authors both light and dark ColorScheme instead of ColorScheme.fromSeed, keeps every raw color/hex/Colors./Curves./Duration/BorderRadius/fontSize inside lib/theme/ behind a no-raw-values gate, collapses animation to zero under reduced motion, restores the persisted theme before first paint, bundles fonts (never google_fonts/dynamic_color), and derives each stateful meaning's supporting color last so color is never its sole signal. Use when creating or editing ThemeData/ThemeExtension/ColorScheme, adding or renaming a design token, wiring theme injection or theme-mode persistence, reaching for fromSeed/dynamic_color/google_fonts/FontVariation, structuring a theme/ or DesignSystem/ folder, or reviewing any widget that renders a color, radius, duration, or font.
error-handling-typed-results
Enforces a typed-error spine — a hand-rolled sealed Result<T,F> plus one per-boundary sealed Failure carrying a stable code and typed params (never a localized string), returned instead of thrown; recoverable failures are values, only bugs throw. Convert-at-boundary catches narrowly with an on-clause and logs the original error+stack BEFORE returning a typed Failure; call sites switch exhaustively with no default:; the taxonomy of what the global error net (FlutterError.onError + PlatformDispatcher.onError, installed by app-startup-and-bootstrap) routes into, plus Isolate.run re-wrapping; mechanism selection (Error vs assert vs Exception vs sealed outcome) and @useResult; and a never-lose-data layer (one-transaction-per-mutation, debounced autosave drafts, optimistic soft-delete/Undo). Use when writing result.dart/failures.dart, a try/catch or sealed-switch default:, wiring bootstrap handlers, a repository/service/DAO boundary, or transactions, drafts, or soft-delete/Undo.
flutter-architecture
Enforces a right-sized feature-first layered MVVM Flutter architecture — features are folders and cross-cutting foundations become packages only when a compile wall earns it, a strict downward-only dependency DAG, dumb Views over one Notifier/AsyncNotifier ViewModel per feature, repositories as the single source of truth and single write path returning immutable domain values, abstractions only where something genuinely can't run in a test, and Riverpod 3.x as the one context-free DI+state mechanism (no get_it/injectable/package:provider container). Use when creating a Flutter feature or file, deciding folder-vs-package or where a class belongs, naming a Screen/Notifier/Repository/Service, wiring providers or a composition-root/bootstrap.dart, adding a use-case/domain layer, resisting over-engineering on a small app, or reviewing whether a change respects the layer boundaries.
flutter-conventions-index
The repo front-door for a Flutter/Dart app — the cross-cutting house rules (feature-first layered MVVM, immutable state with a single write path, Riverpod 3.x for state + DI, typed Result/Failure errors, dumb widgets, injected side effects, complexity limits) plus a routing table that sends each task to its deep-dive skill and a recommended feature build order. Use at the start of any Flutter/Dart work, before writing or reviewing a feature, when deciding which layer or package code belongs in, when unsure which skill governs a task (architecture, state, widgets, persistence, testing, i18n, design), or when onboarding to the conventions.
flutter-performance
Enforces Flutter runtime performance — const subtrees, minimal rebuild scope via ref.watch(select), lazy ListView/GridView builders and slivers, sized image decode (cacheWidth/ResizeImage), heavy work off the UI isolate via compute/Isolate, surgical RepaintBoundary, dispose everything, and measurement in profile mode on a floor device. Use when optimizing UI, diagnosing jank or dropped frames, tuning long lists or images, reviewing rebuild/repaint scope, or when the task mentions const, select, ListView.builder, cacheWidth, compute, RepaintBoundary, AnimatedBuilder, DevTools, raster thread, or 60/120fps.
forms-and-input
Enforces Form + GlobalKey<FormState> with TextFormField whose sync validator returns a localized String? (never a hardcoded literal), AutovalidateMode.onUserInteraction, async availability checks moved OUT of the sync validator into a debounced Riverpod Notifier that surfaces errors through state, FocusNode/TextInputAction/onFieldSubmitted traversal, keyboardType/textCapitalization/autofillHints/TextInputFormatter, mandatory TextEditingController/FocusNode disposal, submit-enabled derived from validity (not stored), and scoped rebuilds so a keystroke never rebuilds the whole form. Use when building a Form, TextFormField, or FormField; wiring sync or async validation; managing FocusNode, focus traversal, autofocus, TextInputAction, onFieldSubmitted, or onEditingComplete; setting keyboardType, autofillHints, textCapitalization, or InputFormatter; disposing TextEditingController/FocusNode; enabling/disabling a submit button; or handling keyboard-avoidance on submit.
i18n-rtl-l10n
Enforces the gen-l10n/ARB localization contract: every user-facing string routed through AppLocalizations from a template app_en.arb with key + placeholder parity across locales, nullable-getter:false so a missing key is a compile error, ICU plural/select over string concatenation, Directional-only geometry (EdgeInsetsDirectional, AlignmentDirectional, TextAlign.start, Icons.adaptive) for correct-by-construction RTL, one FSI/PDI bidi-isolation helper for mixed-script runs, per-locale NumberFormat with a pinned numbering system fed to chrome and canvas alike, canonical UTC-epoch + ASCII storage with calendar/numeral projection only at render, and normalize-to-ASCII before any numeric parse. Use when adding or translating an ARB key, building an RTL screen, formatting or parsing dates/numbers/numerals, wiring l10n.yaml, AppLocalizations, or MaterialApp localization delegates, isolating technical IDs like an account or order reference, or touching app_*.arb.
lint-and-style-config
Enforces a strict analysis_options.yaml built on very_good_analysis with strict-casts/strict-raw-types, a fixed set of silence-producing bug classes promoted to error (unawaited_futures, discarded_futures, empty_catches, use_build_context_synchronously, cancel_subscriptions, close_sinks, avoid_dynamic_calls, exhaustive_cases, avoid_print), dart format as the sole whitespace authority, generated-file excludes mirrored to coverage, and line-scoped-only suppression discipline; teaches the version-pinned-include trap (a missing include silently disables all rules), the errors-only-re-ranks-vs-linter-enables mechanic, and the sealed-switch analyze-vs-compile gap. Use when editing analysis_options.yaml, adding or disabling a lint, writing an `// ignore:`/`// ignore_for_file:`, bumping the Dart SDK or very_good_analysis version, wiring riverpod_lint, or explaining why discarded_futures, use_build_context_synchronously, close_sinks, or missing_provider_scope fires.
local-notifications-scheduler
Enforces an on-device reminder engine where the local database is the only source of truth and the OS pending-notification set is a disposable cache reconciled through one idempotent syncNotifications() entrypoint; keeps flutter_local_notifications behind a single NotificationGateway port, all scheduling math pure and Clock-injected, recurring schedules stored as wall-clock + recurrence rule (never UTC instants) and resolved to a TZDateTime in tz.local for DST correctness, inexact-alarm default with SCHEDULE_EXACT_ALARM as an opt-in, iOS ~64-cap budgeting, isolate-safe @pragma('vm:entry-point') tap handlers, and Android boot re-arm. Use when writing or editing notification_gateway.dart, fln_notification_gateway.dart, reminder_scheduler.dart, recurrence_rule.dart, syncNotifications, zonedSchedule wiring, snooze or mark-done re-anchoring, or diagnosing missed or wrong-hour notifications.
naming-conventions
Enforces Effective-Dart casing (UpperCamelCase types, lowerCamelCase members/constants, lowercase_with_underscores files) plus architectural role suffixes so a name or grep reveals the layer — Screen/Notifier/Repository/Dao/Service/Gateway/Failure, file=primary-declaration, units-and-semantics in identifiers, booleans as is/has/can/should assertions, no get-prefix, no Hungarian, no SCREAMING_CAPS, grouped-and-sorted imports. Use when creating a file, naming a class/enum/mixin/extension/typedef/variable/function/getter/constant/parameter, organizing imports, choosing a role suffix, or reviewing a diff for naming and directive ordering.
navigation-and-routing
Enforces one app-wide GoRouter in lib/routing/ wired via MaterialApp.router, deep-linkable identity in path params never state.extra, context.go-vs-context.push discipline, redirect guards as pure functions driven by a Riverpod refreshListenable, StatefulShellRoute.indexedStack for branch-state-preserving BottomNavigationBar/NavigationRail shells, CustomTransitionPage transitions that respect reduced motion, PopScope (canPop/onPopInvokedWithResult) for unsaved-changes interception, and an errorBuilder 404 route. Use when adding routes, GoRoute, redirect, auth/onboarding gates, deep links, ShellRoute or nested navigation, bottom-nav/rail tab shells, page transitions, back-button/unsaved-changes handling, notification-payload-to-location mapping, typed routes, go_router_builder, or wiring go_router into app.dart.
persistence-drift
Governs the on-device Drift/SQLite data layer: package:drift and package:sqlite3 confined to lib/data/ behind DAOs that map rows to immutable value objects (no Drift symbol leaks past the repository), invariants pushed into the schema (STRICT tables, CHECK/FK/partial-UNIQUE indexes), foreign_keys/WAL pragmas re-asserted idempotently in beforeOpen, one db.transaction per mutation, persist-before-publish, every query awaited, canonical integer storage, derived state recomputed-on-read never stored, scoped .watch streams, keyset (seek) pagination not OFFSET, and WAL-safe backups (checkpoint + VACUUM INTO, verify-by-reopen, never File.copy a live WAL DB). Use when defining or altering a Drift Table, Companion, DAO, index, or CHECK; writing a repository transaction or scoped watch provider; wiring the connection/beforeOpen pragmas; adding SQLCipher; building or verifying a backup; or reviewing a data-layer diff. Migrations and their tests live in run-migration.
project-structure-and-packages
Enforces Flutter/Dart project scaffolding where the layout makes defects greppable — a single-package app by default (feature-first under lib/features/, shared foundation split by role in core/ data/ services/ routing/ theme/ l10n/, a thin main.dart that calls bootstrap(), no lib/src in the app), extracting a generically-named pure-Dart package only when a body of logic earns it (public barrel over private lib/src/ for PACKAGES only, meta-only deps as the compile firewall, resolution:workspace member, downward-only dependency DAG), with pubspec treated as the audit artifact and no utils/helpers/common/misc/grab-bag-shared junk-drawer folders. Use when creating any .dart file or directory, deciding where a repository/Notifier/MethodChannel/value-type/token belongs, authoring or fixing a pubspec.yaml, adding a workspace member, writing an import directive, mirroring a test under test/, or reviewing a diff for organisation.
scaffold-feature-module
Stands up one navigable feature the same way every time — a fixed lib/features/<feature>/presentation/ folder (dumb View + one 1:1 Notifier/AsyncNotifier ViewModel + widgets/ + scoped <feature>_providers.dart), downward-only dependencies with no cross-feature imports, reactive reads as scoped StreamProviders over a repository .watch(), every mutation through one repository single-write-path method, typed Result/Failure surfaced as AsyncValue, a typed go_router route carrying identity in path params, ARB parity across locales, family+autoDispose keying, and EdgeInsetsDirectional-only geometry. Use when adding a screen, tab, or feature folder; wiring a feature Notifier/ViewModel or a scoped stream provider; registering a route; adding ARB keys for a new screen; splitting an over-grown feature; or adding a persisted record its View reads.
service-boundary-and-native
Wires every side effect and native channel as an injectable interface behind a Provider that throws UnimplementedError until the composition root overrides it, with one live impl per flavor, value-typed signatures returning typed results, hand-written contract-honouring fakes over mocks, MethodChannel quarantined to one lib/native/ directory, and versioned cross-language contracts edited on both sides in one commit. Use when adding or changing a ShareService/AnalyticsService/RemoteConfigService or any side-effect port, injecting a Clock (package:clock) via clockProvider, a MethodChannel/platform channel or native widget bridge, a flavor entrypoint (main_*.dart) or per-flavor provider override, a shared-file/JSON contract mirrored in Kotlin/Swift, replacing a stray DateTime.now() or direct SDK call inside a widget/notifier/repository, or wiring a fake via ProviderScope(overrides:) in tests.
state-management-riverpod
Enforces feature state as one Notifier/AsyncNotifier/StreamNotifier ViewModel over an immutable state value with value equality, private mutable state mutated only through intent methods, derive-don't-store, a single write path through a repository, and unidirectional data flow; Riverpod 3.x is DI (providers-as-collaborators, ProviderScope overrides per flavor, throwing seams), reads split ref.watch/.select for display vs ref.read(p.notifier) in callbacks vs ref.listen for side effects, async modeled as AsyncValue, per-entity state family-keyed + autoDispose, and stale-closure captures / legacy StateProvider-StateNotifierProvider-ChangeNotifierProvider / get_it / package:provider are banned. Use when adding state to a screen, writing a feature controller/ViewModel, wiring providers or DI, deriving a read model from a stream, or reviewing rebuild/state-leak/disposal/write-path issues.
testing-strategy
Enforces test doctrine where shape follows code not the pyramid: pushes logic into Flutter-free packages tested with pure package:test and an injected Clock; asserts invariants with seeded fuzz tests against an independent oracle plus round-trip and rounding goldens; prefers bare-implements fakes over mocktail for code you own; tests the data layer against a real NativeDatabase.memory Drift engine, never a mocked DAO; drives Notifiers headlessly with ProviderContainer overrides; guards one end-to-end acceptance gate and a runtime invariant tripwire; floors coverage on unrecoverable-bug files not a global percentage; and fixes the coverage-lies-upward gap. Use when writing tests under test/ or integration_test/, choosing unit vs widget vs integration, adding a fuzz or round-trip property, wiring a fake or ProviderContainer test, gating coverage, or triaging a flaky-suite failure.
value-objects-money-and-units
Enforces a pure-Dart value-object core that stores every quantity canonically — money as integer minor units keyed to each currency's real ISO-4217 exponent (never *100), physical amounts as SI whole units, timestamps as UTC — and converts only at the presentation edge; forbids double/num money, cross-currency arithmetic, and defaulting an unknown currency to two decimals; routes every division of money through one largest-remainder allocate() primitive so parts always sum to the whole to the exact minor unit; derives totals instead of storing them, links entities by stable id, and injects a Clock instead of DateTime.now. Use when defining or changing Money, Currency, or a unit value object; parsing or formatting an amount; splitting, prorating, discounting, tax/tip, or distributing money; adding a currency or FX rate; converting quantities; or fixing float-money, hardcoded-100, cross-currency, off-by-a-cent, or stored-total-drift bugs.
widget-composition
Enforces Flutter widget composition — extract named const Widget classes never `Widget _buildX()` methods, lean build() (no I/O/formatting/domain math, precompute in the ViewModel), dumb Views that watch one Notifier and route intents via ref.read, StatelessWidget by default with every controller disposed, lazy `.builder` lists, cheapest-widget choices (SizedBox/ColoredBox/Align over Container), a strict key policy (ValueKey for reorderable lists, never GlobalKey), gesture→visible-focusable-fallback wiring, plus structural layout — full-bleed background vs SafeArea content, computed cell sizing, the GridView cross/main-axis spacing trap, EdgeInsetsDirectional, and resizeToAvoidBottomInset/IME handling. Use when building or refactoring any screen or widget, splitting a large build() into components, writing GridView/ListView/LayoutBuilder/SafeArea/Scaffold, wiring onTap/onLongPress/Draggable, choosing a key or data class, or reviewing widget code in a diff.
widget-golden-and-a11y-testing
Enforces a disciplined widget/layout/golden/a11y test surface — one pumpApp harness that pins tester.view.physicalSize x devicePixelRatio and layers MediaQuery (textScaler/boldText/accessibleNavigation) above MaterialApp, an overflow net that never suppresses (one testWidgets per device x scale x bold tuple because overflow reports once per RenderObject), a computed getSize/getRect fit-and-geometry gate instead of goldens, two golden lanes (Ahem geometry + one pinned-OS real-font) with loadAppFonts and blocked --update-goldens, RTL goldens under Directionality, pure-Dart WCAG/APCA contrast on colour VALUES, and honest limits on meetsGuideline. Use when writing test/support/harness.dart, calling pumpWidget/pumpApp, chasing an "overflowed by N pixels" failure, reaching for takeException/ignoreOverflowErrors/FittedBox/withClampedTextScaling, adding matchesGoldenFile, or writing a11y_test.dart with isSemantics/simulatedAccessibilityTraversal/meetsGuideline.
catchlaw-content-pipeline
Governs the CatchLaw content pipeline that compiles hand-authored rules.yaml, species.yaml, vernacular.yaml, citations.yaml, zones.yaml and plates.yaml plus a Catalogue of Life extract into the read-only reference.db asset — the tools/content_builder CLI as a first-class deliverable, ten assertions that FAIL the build on a min_size with no measurement_method, an unresolved content_string key in any of the six locales, a null gender in a gendered locale, a citation with no retrieved_on, a plate failing the illustrator death-year test, a search_norm not written by the shared normalise, a rule-engine contradiction, or a missing per-jurisdiction changelog diff. Use when authoring rules.yaml or species.yaml, adding a locale or a vernacular name, extending tools/content_builder, seeding reference.db, adding a citation or a bundled plate, clearing a plate licence question, or reviewing content_builder_assertions.dart in a diff.
catchlaw-conventions-index
The front door to the CatchLaw repository and the routing table every other skill hangs off — the five product invariants of a wholly offline app with no network code path, verdicts phrased as statements of fact and never instructions, a citation on every result, colour as never the only signal and an expired ruleset still evaluated behind an ochre bar, the one-way layer map from the pure-Dart rule_engine package through lib/data/ to lib/ui/, the pub workspace shared with the content_builder CLI, the three database files assets/db/reference.db.gz, the extracted reference.db and the writable user.db, and a task-to-skill matrix spanning the sixteen app skills and thirty-three general ones. Use at the start of any CatchLaw work, before editing bootstrap.dart, when deciding which skill owns a change, when a task crosses rule_engine, data and ui, when adding a dependency to pubspec.yaml, or when reviewing a diff that touches an invariant.
catchlaw-measurement-ruler
Governs measurement as a legal act: the method system TL, FL, SL, CW carapace width, SHL shell length and ML carried on the (species, jurisdiction) rule row not the species, every length stored as an INTEGER of millimetres in length_mm, conversion display-only, every figure rendered beside its method so a bare 38 cm is a defect, calibration against the ISO/IEC 7810 ID-1 card at 85.60 x 53.98 mm saved as pxPerMm, a plausibility band rejecting an implausible scale, step-and-mark with a running total and a restoring cancel, manual millimetre entry working before any calibration exists, and a RulerPainter taking textDirection as a parameter and never mirroring. Use when building RulerPainter or CalibrationSheet, storing a length in millimetres, formatting a reading, wiring step-and-mark segments, wrapping a ruler in Directionality, passing textDirection into a CustomPainter, or reviewing measurement_method.dart in a diff.
catchlaw-offline-guarantee
Enforces CatchLaw's zero-network claim as four layers of proof — no http, dio, firebase_core or connectivity_plus in pubspec.yaml so an import is an unresolved-URI compile error, depend_on_referenced_packages promoted to error, android.permission.INTERNET stripped from the main and release AndroidManifest.xml with tools:node="remove", iOS resting on layers 1 and 4 since ATS blocks only cleartext, a no_network_test.dart guard banning HttpClient, Socket, WebSocket and InternetAddress while File, Directory and Platform stay for drift, an allowlist for transitive http edges under printing and flutter_svg, and a tcpdump capture, never an HTTP proxy. Use when adding a dependency to pubspec.yaml, editing AndroidManifest.xml, writing no_network_test.dart, reviewing Image.network, NetworkImage, PdfGoogleFonts or launchUrl in a diff, auditing a transitive package edge, running the release packet capture, or wiring check_no_network.sh into CI.
catchlaw-reference-database
Governs CatchLaw's two-database split and the pre-seeded reference asset — reference.db read-only and replaced wholesale, user.db writable and migrated forward-only, LazyDatabase over NativeDatabase.createInBackground readOnly, the assets/db/reference.db.gz payload, its reference.build.json sidecar and a generated kReferenceBuildId, an INSTALLED stamp over the circular content_meta read, temp-file plus atomic rename with orphan sweep and sha256 check, a 6-second determinate first-launch budget outside the 1.2-second cold start, catch rows denormalising scientific_name, citation_text and content_version, and refusal when user_version exceeds schemaVersion. Use when writing ReferenceDatabase or ReferenceInstaller, awaiting an open near runApp, replacing the shipped rule pack, adding a column to catches, bumping schemaVersion, picking a path_provider directory, reaching for ATTACH, or reviewing first-launch progress.
catchlaw-rule-engine
Governs the pure-Dart rule_engine package shared by the app and content CLI: resolution filtered on jurisdiction, species_id and water_type with valid_from at or before the injected date, collapsed to the greatest valid_from per zone_id and citation_lineage_id, matched against NULL, equal or ancestor zones, ranked by the specificity ladder exclusion 40, reserve 30, bank 20, subzone 10, region 0, expiry TAGGED and never filtered so a lapsed orden de vedas still evaluates, disagreeing ties returned as Resolution.ambiguous rather than chosen, FindingKind precedence protected, closedSeason, maxSize, minSize, bagLimit and vesselLimit, and one NFKC-first normaliseSpeciesTerm. Use when writing a resolution query, touching valid_to or isExpired, adding a FindingKind or Resolution variant, replacing DateTime.now with an injected Clock, indexing species_alias rows, debugging hamour against هامور search, or reviewing rule_resolver.dart in a diff.
catchlaw-verdict-contract
Governs every word CATCHLAW prints about a rule — the five-part carve-out keeping it a reference tool and not legal advice, covering statements of fact never instructions, the banned imperatives keep, return, release and throw it back, no second person or permission verbs, the numeric margin plus a named method of total length, fork length or shell length, a mandatory Citation of instrument, article, publishedOn and checkedOn, both instruments printed when equally specific rules collide, the unsoftened no-rule-recorded wording, a ban on edibility, toxin and ciguatera claims, a stale-pack notice instead of a withheld verdict, and a non-dismissable disclaimer naming the authority to verify with. Use when writing a verdict string, authoring verdict keys in app_en.arb or app_ar.arb, adding a Verdict or Citation field, wording a missing-rule or expired-pack case, wiring the ambiguity dialog, or reviewing any user-facing sentence in a diff.
lonja-buttons
Enforces the CatchLaw action ladder, buttons as printed stamps — one primary per screen and never two, LonjaButtonVariant primary a solid harbour 1B4D5E field at radius 0, secondary an ink outline, quiet a rule-grey outline, destructive oxblood 7A2320 behind a confirmation, link only in prose, zero elevation and NoSplash.splashFactory instead of shadows, a default, hover, focus, pressed, disabled and busy matrix resolved in WidgetStateProperty, 56dp regular and 46dp compact heights glove mode floors to 66dp, 44dp IconButton carrying a real semanticLabel, a busy latch so a double tap never writes two rows, and a verb label naming exactly what happens. Use when adding a button, styling ElevatedButton, FilledButton, TextButton, IconButton or SegmentedButton, editing lib/ui/core/lonja_button.dart, wiring onPressed to a Notifier, choosing between primary and quiet, adding a destructive affordance, or reviewing any tappable in a diff.
lonja-design-tokens
Governs every aesthetic VALUE in the Lonja design system for CatchLaw — the two-tier palette from L-star-named primitives paper90 E6E4DC, ink11 16201C, harbour30 1B4D5E, verdant36 2E5E3A, oxblood28 7A2320 and ochre47 8A6A16 up to role slots surface, onSurface, hairline, ruleBearing, accent and verdictPass, the 4pt spacing spine s1 through s8, the four rule weights 0.5, 1, 2 and 3, a radius ceiling of 2, the no-shadow no-elevation policy, the three hand-authored themes paper, night and sunlight, the orthogonal glove density set, and the LonjaTokens snapshot a painter takes in its constructor. Use when adding a colour or gap, editing lib/theme/lonja_tokens.dart, choosing a rule weight or radius, authoring the sunlight palette, reaching for Colors. or Color(0x or BoxShadow or BorderRadius.circular, tuning glove-mode targets, checking a contrast pair, or reviewing any widget that paints a colour, rule, gap or radius in a diff.
lonja-dialogs-and-surfaces
Enforces Lonja modal and transient-surface policy across CATCHLAW dialogs, sheets, snackbars and plates — earning a modal only for a decision that must resolve before the user continues, squaring LonjaPanel and LonjaPlate off as ruled inset paper with no BoxShadow, no BorderRadius, no elevation and no scrim gradient, forcing barrierDismissible false on destructive and ambiguity modals, returning typed results like AmbiguityChoice instead of a bare bool, naming the consequence in the confirm label instead of OK, restoring focus to the opener after showLonjaDialog, and rendering the AmbiguityDialog that prints both conflicting instruments and refuses to choose. Use when adding showDialog or showModalBottomSheet, building lonja_ambiguity_dialog.dart, writing a destructive confirmation, wiring a SnackBar undo window, styling a panel or plate surface, choosing a modal over a route, or reviewing any barrier or dialog result in a diff.
lonja-forms-and-controls
Enforces the Lonja input controls as printed instruments rather than Material chrome — the search field as a ruled entry line with a 1.5px ink hairline and BorderRadius.zero instead of a filled rounded box, square LonjaSwitch toggles because paper has no pills, LonjaSegmented as ruled cells sharing one divider, LonjaStepper and the big LonjaKeypad for manual length entry set in mono tabular figures, LonjaTargets.control at 56dp rising to 66dp under glove mode with 8dp separation for wet hands, serif value text over ink-faint italic hintText that never carries meaning typing destroys, and a species field that never rewrites the user's Arabic or diacritics. Use when building a search field, adding a toggle or segmented picker, wiring the numeric keypad, sizing a hit area for glove mode, writing placeholder or unit copy, styling InputDecoration, or reviewing any control in a diff.
lonja-icons-and-plates
Enforces the Lonja icon and illustration system for Catchlaw — one authored stroked icon family on the 24 grid at 1.45 stroke with butt caps and mitre joins, a stroke width tracking the theme ink weight and NEVER the glyph size, the fixed 16/22/30/44 size scale with cap-height alignment, LonjaIcon and LonjaGlyph in place of banned Icons., CupertinoIcons. and IconData literals, the engraved species plate with its PL. XVII number, 0.7 and 1.1 hatching and mandatory illustrator provenance, the silhouette-versus-plate rule for protected and look-alike species, binomial asset keys such as epinephelus_coioides, the no-illustration empty-state policy, and a total ban on emoji. Use when adding an icon, wiring a species plate, building an empty state, naming an asset under assets/plates/, choosing between SvgPicture and a painted path table, sizing a glyph beside a label, or reviewing any Icon, LonjaIcon or LonjaPlate call in a diff.
lonja-lists-and-tables
Governs every CatchLaw row, ledger table and non-happy state — species row anatomy of engraved silhouette, local name, italic binomial and a compact rule line, hairline dotted rule dividers at C2C5BB instead of card gaps, elevation or zebra stripes, tabular-figure numerics end-aligned so they mirror in Arabic, the whole row as one 64dp InkWell target rising to 76dp in glove mode, ListTile and DataTable banned in favour of LonjaSpeciesRow, LonjaLogRow and LonjaLedgerTable, Dismissible guarded by confirmDismiss and an undo, and the four mandatory states every list authors — empty, loading skeleton, error and the ochre STALE bar when the bundled rule pack has expired. Use when building a species or trip list, writing a bag-limit or penalties ledger, styling a divider, wiring swipe-to-dismiss, authoring an empty or stale state, choosing between Column and a builder list, or reviewing any _row.dart or _list_screen.dart in a diff.
lonja-navigation-chrome
Governs the Lonja navigation chrome in CatchLaw — the frozen five destinations Check, Today, Trips, Reference and Settings; the bottom bar drawn as a ruled ledger strip with a 2dp ink #16201C top rule, paper-sunk #DEDBD1 ground and hairline BorderDirectional cells instead of a floating Material pill; a selected state encoded by a 3dp harbour #1B4D5E rail, a lifted paper ground, a filled glyph and a 600-weight label before colour ever counts; the gazette masthead app bar carrying the wordmark, the dated mast-meta line, the zone chip and the rules-checked currency chip; the back affordance mirrored under Directionality; and the verdict takeover that suppresses the bar. Use when adding a destination, building LonjaNavBar or LonjaMasthead, wiring selectedIndex, styling the zone or stale-rules chip, translating a nav label through AppLocalizations, mirroring a chevron for Arabic, or reviewing bottom nav or app bar code in a diff.
lonja-typography
Enforces the Lonja type ramp and its four mandatory roles across CATCHLAW — serif for legal text, species accounts and the verdict stamp, sans for chrome and labels, mono with FontFeature.tabularFigures for every measurement, code, article number and citation, the Arabic Naskh stack at a 1.12 optical uplift, named steps verdict, display, legal, ui, eyebrow, datum, citation and articleNumber resolved only through LonjaType.of(context), tracking authored in logical pixels rather than em, a 65-character reading measure on legal prose that scales with textScaler, and a ramp that never clamps and never ships a runtime webfont. Use when adding a TextStyle, editing lib/theme/lonja_typography.dart, styling the verdict stamp or a species account, setting 38 cm or Ministerial Decision 580/2015 Art. 3, choosing between serif, sans and mono, wiring Arabic or RTL text, sizing headings, eyebrows and captions, or reviewing any text surface in a diff.
lonja-verdict-and-status
Enforces the CatchLaw result surface — the letterpress verdict stamp struck between 4dp double rules 48dp beneath the engraved plate, the four categories meets, below-minimum, closed-season and protected, three non-colour signals per category so glyph and word survive greyscale and glare, protected separated from below-minimum by mark and wording because both take oxblood 7A2320, the non-blocking ochre StaleRuleBar under the app bar, a citation footnote carrying instrument, article, published and checked dates, and a permanent non-dismissable disclaimer. Use when building the result screen, adding a VerdictCategory, styling LonjaVerdictPanel or CitationFootnote or LonjaDisclaimer, wiring rule-pack expiry, tuning sunlight mode where every grey is deleted, auditing colour-only status encoding, checking app_ar.arb for imperative verdict strings, or reviewing verdict_panel.dart in a diff.
Bio shown is the top-scored skill's repo description as a fallback — real GitHub bios land in a future update.