ChartnautDocs

Overview

Find what you see in the left column. The cause and the fix are in the same row; the link is only for more depth.

Most chart symptoms show as an icon on the indicator's row in the chart legend. Hover it: the tooltip names the problem in the words used below. A red icon means the script stopped, amber means it ran with a problem, grey means information.

Indicators on the chart

You see

Likely cause

Fix

script error on the row, red

The script threw on a bar. The tooltip gives the message and the bar time.

Open the indicator, fix the line the message names, and save. Add ctx.log(...) before the line to see the values.

stopped, with "to keep the chart responsive"

The script hit a processing budget, such as too many loop iterations or more than 5 seconds in one call. The tooltip ends with the remedy.

Do what the remedy says: fewer loop steps per bar, less history, or fewer outputs. Budget exceeded

still processing

One calculation has taken more than 2 seconds.

Wait. If it happens every time, do less per bar or declare less history.

code loading or code not loaded

The script has not reached the chart's worker.

Wait a few seconds. If it stays, reopen the indicator.

loading history

The script declared higher-timeframe history and runs once it lands. The tooltip shows how many buckets have arrived, e.g. 4h (0/4,200).

Wait.

history not loaded or data unavailable

Nothing is fetching the data the script needs.

Reload the chart.

no data

The data does not exist for this symbol, timeframe and range.

Pick another symbol or timeframe.

too many indicators for your plan

The chart runs as many indicators as your plan allows, counting the ones an indicator brings with it.

Remove an indicator from this chart, or upgrade.

reads too many timeframes

The indicator reads more timeframes than your plan allows.

Reduce the timeframes in its settings, or upgrade.

"This chart is on 1d. Switch to 5m, 15m to preview it."

The script's runOn does not include the chart's timeframe.

Switch the chart timeframe, or change runOn in the script. Timeframe handles and runOn

"This indicator is hidden on this timeframe."

Its settings hide it on this timeframe.

Change the timeframe or the setting.

"Volume-at-price data is not available for …"

The script reads the volume tape and this asset class has none. FX, index and commodity CFDs carry no tape.

Use a crypto instrument, such as BTC.

dependency output empty, amber, or a blank plot that reads another indicator

A declared dependency produced no values for the output the script read.

Check the dependency's output key, version and settings. Guard null on early bars. Dependency unavailable

no shapes to draw

The script ran and drew nothing. Its condition never fired, or every bar was still in the warmup.

Check the settings and the condition. Log the values the condition tests.

nothing in this view

It has drawn things, just not in the visible range.

Zoom out or scroll.

drew nothing

Its rows are in view and paint put nothing on screen.

Fix the layer's paint code. Painting a layer

no price scale on its pane

A chart fault, not a script fault.

Reload the chart.

Blank, no icon, and the lint is clean

A wrong-typed value reaches the chart as NaN and draws nothing. Or the paint call does not match the declared output kind.

Read the editor's type errors. Use the paint call that matches each output.* declaration.

Drawn on the price pane instead of its own pane

pane(...) is declared but the outputs do not pass { pane }.

Pass the pane handle to each output. Panes and scales

A layer is paused, "frame budget exceeded"

Paint took more than 4 ms for three frames running.

Draw at most one shape per pixel row: merge bins under 1 px, or move to paintGL.

Values change on refresh, or differ between two charts

The script keeps state but its warmup is too short, so values depend on where the chart's data starts.

Call warmup(...) after your inputs: w.ema(length) for an EMA, w.wilder(length) for RSI, ATR or ADX, w.day() for a daily reset, or w.forever() for a running total. Warmup and memory

History capped

The script asked for more history than your plan's indicator memory.

Read a higher timeframe, or use ctx.summary for a long-window high, low or total.

History limited by your plan

Your plan's history window ends here, so an "all-time" high is a high since that date.

Upgrade for more history, or label the value "since <date>".

History starts at this instrument's first bar

There is no older data.

Nothing to fix.

Not enough volume history

The volume tape starts too late for the declared warmup.

Lower the warmup, or use a higher timeframe.

A v3 badge on the row, "Pinned to v3, latest is v5"

This copy runs an older version of the script.

Expected when you or a dependent pinned it. Newer versions do not reach it until the pin moves.

Definitions

You see

Likely cause

Fix

Nothing marked on the chart

The definition is not kind: "flow", the event uses paint: "none", emits have no label, or the condition never fires on this range.

Set meta({ kind: "flow" }), omit paint or use "pin", pass { label } on every ctx.emit, then log the condition. Emit not collected

Zero events after running over history

Emits were dropped (unknown_event_id, missing_label), or the condition never fired on that range.

Read the drop reason first. Declare the event id, add the label, or widen the range. Emit not collected

Fewer events than expected

oncePer on the event allows one emit per key tuple for the whole run. Emits during warmup bars are never recorded.

Remove oncePer, or add a key that changes when you want another event.

Events on the chart but not in history

The history run covers a different version, profile, timeframe or range.

Run the definition over history again for the version and profile you are looking at. Run a definition over history

Run over history refused with timeframe_not_allowed

The timeframe is not in the definition's runOn. An omitted timeframe defaults to 1d.

Pick a timeframe from runOn.

Coverage says the range is covered, the study still finds nothing

Coverage is kept per version and per profile. Saving the definition made a new version, which has no events yet.

Run the new version over history, or pin the study to the version that has events. Versions and profiles

Profile marked Needs setup or Needs configuration

A code change left the profile without values for new settings. It cannot run over history until they are set.

Fill in the missing settings on the profile.

Volume-based definition refused for an instrument

The instrument has no volume tape.

Pick a crypto instrument, such as BTC. No range or timeframe fixes it.

ctx.security or ctx.tf errors

Both were removed.

Declare const daily = timeframe("1d") at module scope and read daily.last in onBar. Timeframe handles and runOn

Nothing paints from a timeframe handler

Paint and emit calls are refused inside timeframe(...).onBar.

Keep the value in the handler's state and paint from the chart onBar, gated on handle.closedThisBar.

"module is not defined", or an import error

CommonJS or a package import.

Use export function onBar(ctx) and relative imports with the extension: import { x } from "./levels.js". Multi-file packages and imports

No data around 21:00 UTC on BTC

BTC halts daily from about 20:55 to 21:05 UTC.

Try again after the halt.

Studies

You see

Likely cause

Fix

"no flow events for this instrument/timeframe in the selected window"

The study is pinned to a definition version with no events in that window, often one version behind the one you ran over history.

Read the rest of the message: it names the pinned version. Update flows.declare({ version }) to the version with events.

Study finished with no rows

Every event threw (check the errored-event count first), the filters in onEvent drop everything, or ctx.event.flow is compared to the slug instead of the as alias.

Fix the first reported error. Compare against the alias you gave flows.declare({ as }).

Rows collected, results empty

onFinish groups or filters on the wrong key.

Log the collected rows in onFinish and check the key names.

A baseline reads 0 while the main series is fine

ctx.candles or ctx.indicators was called in onFinish, where it returns nothing.

Measure in onEvent and collect the value.

Multi-day study collects nothing

ctx.session.key(t) is a date string, so arithmetic on it gives NaN.

Use ctx.temporal.containing(t, { period: "day" }).start and do the day math in seconds.

A later event is never found

limit in ctx.flows.<as>.events({ after, filter, limit }) is applied before the filter.

Drop limit and filter in your code.

Results from before your edit

The run belongs to an older study version.

Run the study again.

budget_wall_clock, too_many_event_timeouts, script_execution_timeout

The run passed 10 minutes, or events took more than 15 seconds each.

Use a shorter range and do less per event. Budget exceeded

dependency_failed

A definition run the study waited on did not finish.

Retry the run over history, then the study.

Forward Insights

These are the states of the popover that opens when you click an event on the chart.

You see

Likely cause

Fix

No study pin on this chart yet

No study for this definition is attached to the chart.

Open Go to Studies, run a study, and use Attach to chart. Forward Insights on the chart

Not set up for this profile

The Forward Insight was saved under a different profile from the one the chart's definition uses.

Use the Switch to button in the popover, or save a Forward Insight from a study run on this profile.

Can't use this pin on 5m

The Forward Insight was saved for another timeframe.

Switch the chart to the timeframe it names, pick another Forward Insight, or save one for this timeframe.

No study insight for this event

The study leaves events like this one out: its scope(ctx) returns null for them.

Return a tuple from scope(ctx) for every event you want a reading on. Forward Insight errors

This insight can be wrong on live events

The study has no scope(ctx). It groups events by calling ctx.scopeEvent inside onEvent, where reads after the event can decide the group, so a live marker can land in a different cell than the study counted.

Click Update. The study builder's agent moves the grouping into scope(ctx).

Need more chart history

The study needs more bars or indicator data to evaluate this event.

Scroll back or wait for data, then click again.

Could not check cohort with "missing frozen study source"

The Forward Insight was saved before its source was stored.

Save a new Forward Insight from the study run.

Could not check cohort with "Study script is not loaded"

The study code has not loaded in this session.

Open the study in the builder once, then click again.

Could not load pin results

The popover layout matched nothing for this event.

Check that the study's pin_cell rows carry every dimension the event is scoped on. Forward Insight errors

Popover shows 100% for one outcome everywhere

An outcome was declared as a scope dimension.

Declare outcomes with role: "report" and keep them out of the tuple scope returns.

Save pin fails, or "needs study updates before it can be saved"

The study does not publish what the design needs.

Forward Insight errors

Saving and lint

You see

Likely cause

Fix

A rule id such as window/warmup-required on save

A lint rule failed. Errors block the save; warnings do not.

Look up the id in Lint and error codes.

dialog(...) is required

Every indicator needs a settings dialog.

Add dialog({ title: "My indicator" }).

tf/untyped-source or tf/use-input-timeframe

A timeframe comes from input.select or a template string.

Use input.timeframe({ id, label, default, options }) and pass the handle to timeframe().

The same lint errors come back after the Agent fixed them

The draft and the saved version disagree.

Save the draft and run it again.

The Agent proposed code that fails

Its proposal failed lint or a dry run.

Reject it with the error text so it can fix it. Agent lint and dry-run

From the CLI or API

Scripts you run with the CLI or the API run on Chartnaut's servers, the same way a definition runs over history. The run's failure.kind and the CLI's exit code tell you which row to read. Errors and exit codes

You see

Likely cause

Fix

Exit code 3, plan_limit on every command

Your account is on Free, which has no CLI or API access.

Upgrade to Starter or above.

Exit code 3, forbidden_scope

The API key is missing the scope that command needs.

Make a key with that scope under Developers. API keys

Exit code 1, with path:line: error: lines

The script failed validation. The lines are the same lint you get on save in the app.

Fix every error line, then run chartnaut validate again. Lint and error codes

Exit code 2, failure.kind: script

Your code threw on a bar or an event.

Read console on the run: it holds the first 50 lines your script printed, and console.log works.

failure.kind: out_of_coverage or data_not_ready

There is no data for that instrument, timeframe and range, or it has not landed yet.

Pick another range or instrument. For data_not_ready, wait and run again.

Exit code 5, busy or rate_limited

Your runs at once are in use. The app and the CLI share one pool per account.

Wait, then run again. Limits

A blank output from a script that reads another indicator, and a dependency.browser_only warning from validate

The dependency is a built-in that only runs in the chart's browser, so it reads empty on the server.

Depend on a scripted indicator instead, or run the script in the app.

emit_never_reached in summary.warnings

The definition ran and its condition never fired on that range.

Log the values the condition tests, or widen the range.

window/warmup-empty-after-gap in summary.warnings

The data has a gap longer than your warmup. Warmup is counted in time, so the bars after the gap started with empty state: a stored previous close, a running sum or a counter reset there.

Declare a warmup longer than the gap the warning names, or treat values right after it as a fresh start.

A study finds no events from a definition you ran with chartnaut run

chartnaut run returns that run's events only. A study reads the events the definition has from running over history.

Run it over history with chartnaut collect <definition> --on BTC --tf 5m --last 1y --wait. A study run from the CLI does this for its declared definitions. Definition events

The app still shows the old code after a run

chartnaut run <folder> runs your local files and saves nothing.

chartnaut push <folder> -m "what changed" saves a new version.

chartnaut push refused with version_conflict

Someone saved the script in the app since your last push or pull.

chartnaut pull <slug>, re-apply your change, and push again. --force saves over the app's version. Saving and versions

Questions that are not symptoms are in the FAQ.