nerevu/riko is a Python engine for processing streams of data, modeled after Yahoo! Pipes. It is intended for building data and ETL workflows that can handle sources such as RSS feeds with asynchronous and parallel processing.
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 agentmods add instructions/nerevu/riko/claude-mdgit clone --depth 1 https://github.com/nerevu/rikoWrote 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/instructions/nerevu/riko/claude-md)<a href="https://agentmods.dev/instructions/nerevu/riko/claude-md"><img src="https://agentmods.dev/badge/instructions/nerevu/riko/claude-md.svg" alt="Measured on agentmods" 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 | $0.08098 | $0.08098 |
| Opus 5 | $0.04049 | $0.04049 |
| Sonnet 5 | $0.01620 | $0.01620 |
| Haiku 4.5 | $0.00810 | $0.00810 |
Grade A, and why
riko CLAUDE.md 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 2d 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 — 116 lines — stays where its author put it; the contents beside it link to each section on GitHub.
riko
Python stream processing engine modeled after Yahoo! Pipes.
This file holds the index plus the correctness invariants. Long-form detail lives in _docs/:
_docs/INTERNALS.md— codegen rules, discovery/export surfaces, tooling gotchas_docs/DOCUMENTATION_STANDARD.md— read before writing docstrings/doctests_docs/PHASE_CHECKLISTS.md— live status (start here);_docs/ROADMAP.md— gameplan index
Key Paths
| Path | Role |
|---|---|
riko/collections.py |
SyncPipe, AsyncPipe, SyncCollection, AsyncCollection; Targets export enum, export(), list_targets() |
riko/modules/ |
individual pipe implementations (fetch, filter, hash, etc.) |
riko/modules/__init__.py |
narrow module-dev facade — __all__ is exactly 9 names: processor/operator/splitter, list_modules/get_module_metadata/describe_module, ModuleMetadata/ModuleSubtype/ModuleType. Everything else (PreparedModule, parse_and_cast, get_casters, broadcast, objectify, the types.general aliases, …) is private — import from its defining module (from riko.modules._prepare import PreparedModule), never through this package |
riko/modules/_decorators.py |
Module base + processor/operator/splitter decorators; sync/async wrappers, incl. implicit-looping auto-map: a processor maps over any non-mapping/non-primitive iterable (list/tuple/range/generator/iterator, gated by _iterutils.is_listlike); a mapping/primitive/None stays one item so None still invokes source pipes |
riko/modules/_loop.py |
loop execution — _run_loop_sync/_run_loop_async, loop_embed_sync/loop_embed_async, per-parent _fold_parent/_take/_take_first. LoopRawConf/LoopConf (count/assign/field + compact embed) belong to the explicit loop module — kept, not vestigial, distinct from implicit looping. The legacy nested conf.embed.value form is gone |
riko/modules/_derive.py |
init-time type/subtype derivation (derive_loopable/derive_subtypes) — a leaf (no riko.ext imports) split out of _metadata so decorators can pull it during riko.modules init |
riko/modules/_names.py |
generated discovery surface: flat Modules + Sources/Transforms/Sinks bucket StrEnums (Modules.FILTER is Transforms.FILTER); re-exported from riko. Never hand-edit (run gen-names) |
riko/parsers.py |
sync XML/HTML parsing (xml2etree, LinkParser, etc.) |
riko/dates.py + riko/_date_utils.py |
date helpers. _date_utils is the leaf half (parse_date_string, ensure_tzinfo, date_to_datetime, tt_to_datetime, date_to_tt, tz lookup) — imports nothing from riko outside types, so _iterutils can use it for sort keys without a cycle; dates.py keeps the riko-aware half (NOW/TODAY, get_date, tt_to_datedict) |
riko/bado/__init__.py |
async backend detection (AnyIO or empty fallback) |
riko/bado/io.py |
async file/URL I/O (async_url_read, async_url_open, async_write, get_async_temp_file). async_write is the anyio-native counterpart of meza.io.write (chunk/mode/encoding parity, no sync fallback); get_async_temp_file is a plain def returning anyio's NamedTemporaryFile CM, so async with needs no await. async_url_open is likewise a plain def returning an _AsyncURLStream handle that is both awaitable (await async_url_open(url) → open stream, caller closes) and an async CM (async with async_url_open(url) as f → auto-closes on exit). It is eager-read, lazy-parse — the full body is buffered via response.content/Path.read_bytes (no read-time backpressure), only parsing stays lazy. The fetch parsers pair await async_url_open with _io.auto_close (close-on-iteration); never "tidy" them into async with, which closes the handle before the returned lazy iterator is read. True httpx.stream() body reads + AsyncClient reuse are unimplemented (_docs/IMPLEMENTED.md §2) |
riko/bado/itertools.py |
async itertools: async_map + streaming async_map_stream/async_map_ordered_stream, async_merge, coop_reduce/async_reduce, async_iter |
riko/bado/_util.py |
async utilities (async_sleep, defer_to_process) |
riko/_pubsub/ |
pub/sub package (send/receive/coroutine, reset_pubsub) — state via contextvars; _sync.py/_async.py. (riko/utils.py/helpers.py are gone — decomposed into _io/_iterutils/_serialize/_strutils/_logging, graph→compile.py, parse_context→context.py, pub/sub→_pubsub) |
riko/exceptions.py |
hierarchy rooted at RikoError (ModuleError/PipelineError/PubSubError bases): UnsupportedModuleError (unresolved leaf module) / UnsupportedPipelineError (unresolved pipe_* sub-pipeline) — both from resolve_module in compile.py; PipelineStateError; pub/sub ReceiverUnavailableError/DuplicateReceiverError. Only RikoError/PipelineStateError/Unsupported* are stable (ROOT_EXCEPTIONS in riko/_api_surface.py) — bases + pub/sub errors are not |
riko/_api_surface.py |
private declaration of the supported import contract — STABLE (= BADO/COLLECTIONS/COMPILE/MODULES/OTHER/ROOT_EXCEPTIONS), EXTENSION, TYPES, PRIVATE_RESOLUTION frozensets. Source of truth for _docs/API_SURFACE.md + tests/public/test_imports.py; not itself public |
riko/dotdict.py |
DotDict — case-insensitive nested dict for pipe items (dotted keys = nested paths; see _docs/gameplans/dotdict-parsing.md for the data-derived-key footgun) |
riko/cli/ |
compile.py (compile-pipe), convert_dag.py (convert-dag), gen_config.py (gen-config), gen_names.py (gen-names), manage.py (manage). compile-pipe reads stdin when its path is -/omitted (pipe name anonymous) so it chains off convert-dag; -v reports deps + bytes to stderr, keeping stdout a clean source stream. The legacy bin/compile is gone — it had been dead since riko.utils was decomposed, and its -p/-o/-s options scraped Yahoo! Pipes (retired 2015). Don't resurrect it |
riko/types/configs.py |
fully generated per-module <Name>Objconf(DynamicConf) parse-time types; imports + re-exports DynamicConf from riko/types/base.py (edit modules.py contracts, run gen-config — never hand-edit) |
riko/types/base.py |
hand-maintained DynamicConf(Objectify[Any]) base, kept out of generated configs.py so it can regenerate safely |
riko/types/_module_ids.py |
generated ModuleId (every built-in id) + LoopableModuleId (loopable subset); pure typing-only leaf. Never hand-edit (run gen-names) |
riko/ext/names.py |
ModuleName(StrEnum) base + ModuleNameLike/normalize_module_name; derive_category/SINK_NAMES |
riko/ext/codegen.py |
codegen — enum_member_name, catalog_entries, generate_module_names, plus ruff_format(str)->str, the shared formatter for all three generators |
riko/transform.py |
column transformation helpers (shelved; ideas folded into _docs/gameplans/) |
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.
- 2d ago Changed · +4 lines · +1,175 tokens per session 2613917eef5e
- 5d ago First seen · 112 lines · 6,923 tokens per session scan A 01977193fd62
riko CLAUDE.md is an instructions file published in the GitHub repository nerevu/riko (1,606 stars, last pushed yesterday), licensed MIT. It adds 8,098 tokens to every session, about $0.0405 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-30.
Other instructions, from other repositories
spiceai copilot-instructions.md
Copilot instructions for spiceai/spiceai, covering spice.ai agent instructions, data correctness — absolute top priority, evidence — no claim without a reproduction, build, test, lint (expensive — read first) and git & prs.
quant-mind AGENTS.md
Instructions for LLMQuant/quant-mind, covering quantmind — agent instructions, progressive context loading, what this is, positioning and module map.
spiceai AGENTS.md
AGENTS.md instructions for spiceai/spiceai, a project described as: Add a real-time analytics node to your operational database. Spice is a portable, accelerated SQL query, search, and LLM-inference engine in Rust for data-grounded AI apps and agents.
OpenContracts CLAUDE.md
Claude Code instructions for Open-Source-Legal/OpenContracts, covering claude.md, project overview, baseline commit rules, essential commands and backend (django).
FreshRSS php.instructions.md
Instructions for FreshRSS/FreshRSS, covering php files and autoloader.
gem-dota CLAUDE.md
Claude Code instructions for whanyu1212/gem-dota, covering claude.md, commands, install project + dev dependencies, run all tests, including slow/integration markers and run a single test file.