narrata — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited narrata (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Use this skill for OHLCV-to-text workflows.
Open, High, Low, Close, Volume columnsfrom narrata import narratetext = narrate(df)narratecompareanalyze_summary, describe_summaryanalyze_regime, describe_regimeanalyze_indicators, describe_indicatorssax_encode, describe_saxastride_encode, describe_astridedetect_patterns, describe_patterns, describe_candlestickfind_support_resistance, describe_support_resistancedigit_tokenizefrom_ccxt, from_coingeckoto_plain, to_markdown_kv, to_toon, to_jsonAvoid internal/private helpers unless explicitly requested.
narrata auto-detects sub-daily frequencies (1min, 5min, 15min, 30min, hourly) and scales indicator defaults (SMA crossover, volume lookback, volatility lookback) to match daily-equivalent horizons. For patchy or unevenly-spaced data, pass the frequency explicitly: narrate(df, frequency="15min"), --frequency 15min (CLI), or the frequency field in MCP tools. Output labels adapt automatically ("SMA 10/40", "26-bar avg", "bars ago").
from_ccxt(ohlcv, ticker=...) — converts ccxt's [[ts, O, H, L, C, V], ...] to narrata DataFramefrom_coingecko(data, ticker=...) — converts CoinGecko market chart response (close-only) to DataFrameBTC-USD) work directly with narrate(), no adapter neededClose-only data (CoinGecko, or any DataFrame with just a Close column) works — patterns/candlestick sections are silently omitted, everything else runs normally.
By default, narrata silently omits sections with insufficient data or empty results (e.g. "none detected"). This minimizes token usage. Use verbose=True / --verbose to show all sections.
narrate(df) output.narrata ships a CLI that reads OHLCV data from CSV, TSV, or Parquet and prints narration to stdout:
# Format auto-detected from extension
narrata data.csv --ticker AAPL
narrata data.tsv --ticker AAPL
narrata data.parquet --ticker AAPL
# Stdin (defaults to CSV; use --input-format for others)
cat data.csv | narrata --ticker AAPL
cat data.tsv | narrata --input-format tsv --ticker AAPL
# Output formats: plain, markdown_kv, toon, json
narrata data.csv --format json
# Precision (default: 2; use 0 for BTC, 4 for forex)
narrata data.csv --precision 0
# ASTRIDE instead of SAX
narrata data.csv --symbolic-method astride
# Disable specific sections
narrata data.csv --no-summary --no-sparkline --no-regime
narrata data.csv --no-indicators --no-symbolic --no-patterns --no-support-resistance
# Show all sections including empty ones
narrata data.csv --verbose
# Compare two periods
narrata compare q1.csv q2.csv --ticker AAPLThe input must have a datetime index column and at least a Close column (Volume optional, column names case-insensitive). All narrate() parameters are exposed as flags — run narrata --help for the full list.
Install: uv tool install narrata[all] or pip install narrata[all].
If user wants MCP integration:
src/narrata-mcp (narrata_mcp)uv run --project src/narrata-mcp --no-sync narrata-mcpnarrata_narrate_ohlcvnarrata_compare_ohlcvnarrata_summary_ohlcvnarrata_regime_ohlcvnarrata_indicators_ohlcvnarrata_symbolic_sax_ohlcvnarrata_symbolic_astride_ohlcvnarrata_patterns_ohlcvnarrata_levels_ohlcvWhen changing narration behavior:
make update-examplesmake checkmake test~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.