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 value-objects-money-and-unitsgit 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/value-objects-money-and-units)<a href="https://agentmods.dev/skills/zakariaf/flutter-skills/value-objects-money-and-units"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/value-objects-money-and-units/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/value-objects-money-and-units"><img src="https://agentmods.dev/badge/skills/zakariaf/flutter-skills/value-objects-money-and-units.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.00209 | $0.04024 |
| Opus 5 | $0.00105 | $0.02012 |
| Sonnet 5 | $0.00042 | $0.00805 |
| Haiku 4.5 | $0.00021 | $0.00402 |
Grade A, and why
value-objects-money-and-units 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 10d 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 — 317 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Value objects: money & units
Store every quantity once, in one canonical form, and convert only when shown or exported. Money is integer minor units plus a currency; physical quantities are whole SI base units; time is UTC. This is what lets a user flip any display preference (currency symbol, unit system, locale) without corrupting one stored row, and lets "sum of parts == whole" be structural, not hoped-for.
This core is pure Dart — no flutter/*, no intl, no dart:io, no plugins.
Formatting and digit normalization happen upstream/downstream, not here. These
value objects live in lib/core/, the sanctioned pure-foundation layer (see
project-structure-and-packages) — never a utils//common//shared/ grab-bag.
Read the reference for the task at hand:
references/allocate-and-splitting.md— the largest-remainderallocate()primitive, its invariants, the two-rounding-sites trap, edge policies, verified test vectors, and the subtotal→tax→tip split pipeline.references/canonical-storage.md— the ISO-4217 exponent rule, the SI unit tables,decimal-based parsing, the cents-accumulator for keypad input, rounding discipline, and the Clock-injected dated-rate / staleness engine.references/domain-model.md— value-type modelling: relationships as id links, derive-don't-store, one currency per aggregate, immutable state with value equality.
Run scripts/check-money-violations.sh and scripts/verify-core.sh before a PR.
Non-negotiable rules
- Money is
intminor units + aCurrency— NEVERdouble/num/REAL. Binary floats cannot represent0.01; drift silently corrupts totals the user can never re-derive. No money API accepts or returnsdouble. - Derive minor-units-per-major from the currency's real ISO-4217 exponent —
NEVER hardcode
* 100,/ 100, or "2 decimals". Exponent is 0 for JPY/VND, 2 for USD/EUR, 3 for KWD/BHD/OMR. A hardcoded100is a 100× error for a 0-exponent currency and a 10× error for a 3-exponent one. Route throughcurrency.minorPerMajor. - Unknown currency code is a typed failure, never a silent default-to-2. The
exponent table lists only shipped currencies;
Currency.tryParsereturns null and the caller emits aFailure. - One currency per aggregate; cross-currency arithmetic is forbidden. Adding
two
Moneyof different currencies is a category error — throw (programmer error) or convert through the FX layer first. Keep currency a fact of the enclosing aggregate soMoneyarithmetic never has to guard it. - Route EVERY division of money through one
allocate(amount, weights)primitive. Shared items, tax proration, tip proration, discounts — all one rounding path, so "parts sum to the whole to the exact minor unit" is proven once and tested once. - There are TWO rounding sites, not one:
allocate()AND percent→minor-units. Round a percentage to integer minor units once before feedingallocate(). A naivedoublepercent is a classic off-by-a-cent bug thatallocatecoverage will not catch. - Never sum independently-rounded parts to get a total. Always
allocate()a known integer total and let the parts absorb the residual. - Derive totals; never store them. A denormalized stored total is the classic drift bug. Totals are computed from items + weights on read.
- Model relationships as stable-
idlinks, not embedded copies. Give every entity an explicitfinal id(e.g. a UUID). Editing a price then leaves assignments intact and deleting a participant just drops them from link sets. - Store canonically, convert at the edge. Physical quantities are whole SI
base units (
intmetres / millilitres / minutes); time is a UTCDateTime..from<DisplayUnit>factories round into canonical;to<DisplayUnit>()getters return adoubleused only at the presentation edge. - Normalize digits/separators to ASCII BEFORE input reaches this core. Never
call
int.parse/double.parse/Decimal.parseon raw localized input — it throws on Eastern-Arabic numerals. Fold upstream (seei18n-rtl-l10n). - Parse with
decimal; round ONCE with an explicit mode at the boundary. Usepackage:decimalfor exact division/parsing, apply an explicitRoundingMode(default half-even/banker's) once at the parse or final-total boundary — never on intermediate sums (accumulates bias). - Inject
package:clock'sClock; NEVER callDateTime.now(), never roll a bespokeClockService. Every time-reading class in this pure core takes aClockconstructor arg; Riverpod/feature code injects the sameClockthrough aclockProvider(seeservice-boundary-and-native) so the two vocabularies compose. Fixed clocks /fake_asyncthen make time-dependent logic deterministic in tests. - The core stays Flutter-free and IO-free. Deps are only
decimalandclock. Formatting lives in the presentation layer; storage in the data layer.
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.
- 10d ago First seen · 317 lines · 209 tokens per session scan A 01600049a6e3
value-objects-money-and-units is a skill published in the GitHub repository zakariaf/Flutter-Skills (2 stars, last pushed 12d ago), licensed MIT. It adds 209 tokens to every session and 4,024 once invoked, about $0.0010 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
vnpy-export
Export a Vibe-Trading backtest strategy to a runnable vnpy CtaTemplate Python class — supports A-share equities, futures, and crypto via BarGenerator + ArrayManager.
yfinance
Skill "yfinance" from HKUDS/Vibe-Trading, covering yfinance, deep yahoo interfaces (references/), quick start, ticker format conversion and supported data types.
rust-check
Run cargo check on the current Rust project to find compile errors.
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.
alpaca-trade-api-sdk
Integrate and build on the @alpacahq/alpaca-trade-api TypeScript SDK for the Alpaca Trading and Market Data APIs (the unified Alpaca client, ergonomic order builders, normalized market-data shapes, pagination, typed errors, resilience, and real-time streaming). Use when writing or reviewing code that imports…