tv spec is available in v0.33.0 and later. It describes the running binary
without Desktop, credentials or provider access. It does not validate a proposed invocation or
claim that the provider is currently available.
tv spec
tv spec mcp alert history
tv spec chartThe first form returns a compact-purpose index of public command paths and their
short descriptions, excluding duplicate autogenerated help routes. A command path returns only that command's detail and direct
subcommand names. Use paths without flags or argument values. Unknown paths use
the existing validation-error envelope on stderr with a nonzero exit. Successful
JSON uses the normal stdout success envelope, command spec, and a data object
with contract_version: cli_spec.v1 and binary_version (including build identity).
commandcontains canonical path segments;commandsis present for the index.- Detail includes
description, commandaliases,subcommandsandarguments. - Argument metadata comes from clap:
id, long/short flags and aliases, positional index, required/global flags, action, recognized parser type, value names, arity, delimiter, defaults, choices, conflicts and description. Defaults are strings as declared by clap. Arity maximumnullmeans unbounded. A type ofnullmeans an unclassified parser, not unconstrained input. Empty choices do not mean that every value is valid. coverage.syntaxisclap_metadata;coverage.validationispartial. Conditional requirements and adapter checks are not fully represented. Read the command description and skill guidance for remaining conditions.coverage.semanticsisdocumentedfor the annotated command paths described below, including official technical snapshots. Inspect the running binary's coverage field for the selected path; unannotated paths reportunavailable.semantics: nullmeans not annotated, never no side effects. More commands can acquire annotations without changing how they execute.- Documented read semantics contain source, prerequisites, account/provider effects,
output contract, static constraints, dynamic discovery instructions and argv
examples. The default read deadline and cap reuse execution constants.
Authenticated reads can refresh local credentials;
account_mutation: falsedoes not promise zero local state changes. - Dynamic account IDs or symbols are not fetched by specification lookup.
Symbol discovery points to
tv mcp search <query>anddata.symbols[].symbolin its output. Placeholders require caller input; examples do not prove access, data availability or scope authorization.
Before: inspect nested help and interpret prose to assemble a history request.
After: read tv spec mcp alert history, choose a symbol from the indicated
search result when necessary, then invoke history under the user's authority.
This reduces guessing; it does not guarantee fewer tokens than short help.
The index may be larger than root help because it includes nested commands.
tv schema exports the supported output schemas described below.
tv validate checks candidate argv without executing it, as described below.
Existing tv discover remains a Desktop-backed API diagnostic and is unrelated
to offline specification lookup.
In v0.34.0 and later, tv schema lists supported paths;
tv schema values and tv schema mcp bars
export their JSON Schema 2020-12 descriptions without connecting to Desktop or
MCP. Successful output uses the normal envelope with command schema and
data.contract_version=cli_schema.v1; binary_version identifies the build.
The index has commands as path arrays. Details have canonical command,
coverage=documented_fields, unchecked, and the schema in data.schema.
Validate the actual success or error envelope against data.schema, not the
schema command's wrapper. Schemas preserve legitimate nulls, empty/short bar
results, unknown study identity and arbitrary dynamic study values. Additional
object properties are allowed. Error details and runtime meaning are not fully
specified. Structural conformance does not prove series meaning, freshness,
complete history or consistency between counts and arrays. Date formats are
annotations, not a market-time guarantee. References are local to the document.
Unknown paths fail with unknown_command; known unsupported paths fail with
unsupported_command in cli_schema.v1 error details (validation exit 1).
Outer --target-id is rejected as unsupported_target. No existing values or
MCP output format changes, and schemas are descriptions for the current binary,
not a new version marker inside unversioned command output.
In v0.34.0 and later, pass argv after a required separator, without an executable name:
tv validate -- values
tv validate -- --target-id example-target values
tv validate -- mcp bars NASDAQ:EXAMPLE --timeframe 1D --count 20Only values and mcp bars have local validation support initially. The real
clap parser checks syntax; MCP bars reuse execution's request preparation,
Desktop-target rejection and deadline rules. Values have no command-specific
arguments. Target existence, environment configuration, credentials, provider
availability and data quality remain unchecked. Validation neither executes
the candidate nor reads its files, and does not initialize tracing or accounts.
It is optional preparation, not permission to perform the operation.
Success uses command validate, data.contract_version=cli_validate.v1, the
canonical command path, status valid and checks syntax/local_constraints
passed, runtime not_checked. Input values are not echoed. Errors use stderr,
exit 1, kind validation and cli_validate.v1 details with nullable command/field:
| Outcome | status / code | checks.syntax / local_constraints |
|---|---|---|
| Invalid syntax, empty input or missing separator | invalid / invalid_syntax | failed / not_checked |
| Invalid local request | invalid / invalid_request or unsupported_capability | passed / failed |
| Known command without local support | unsupported / unsupported_command | passed / not_checked |
| Candidate help/version or spec/schema/validate | unsupported / non_executable_request | passed or not_checked / not_checked |
| Target option on the outer validate invocation | invalid / unsupported_target | not_checked / not_checked |
Runtime is always not_checked. For example, count 5001 fails locally with
field count; a syntactically valid data equity invocation is unsupported,
not approved for execution. Use target options inside candidate argv. Keep
credentials, account IDs and file contents out of shared examples; diagnostics
omit candidate values and raw clap messages. Existing commands retain their
normal errors and execution ordering; this tool adds no retry or source fallback.
Path after tv spec |
Constraints and next-step guidance |
|---|---|
mcp search |
Query tokens are joined with spaces; the UTF-8 byte limit and allowed --type values come from request validation. Results remain candidates. |
mcp columns |
Market choices and group/search byte limits; overview without group/search, detail otherwise. Group discovery uses data.groups[].group. |
mcp symbol |
Qualified symbol syntax, unique column names, per-name byte limit and the actual default column set. Discover columns via data.columns[].name from a detail query. |
mcp symbols |
The same field constraints plus 1–50 unique symbols; ordered returned/missing/unreported outcomes. No automatic chunking. |
mcp bars |
Actual timeframe list, count bounds and unsupported date-range inputs. Count satisfaction does not establish calendar coverage or legacy-source equivalence. |
mcp alert history |
Shared symbol syntax, history bounds, timeout and symbol discovery. Coverage and notification delivery remain unconfirmed. |
max_bytes counts UTF-8 bytes, not characters. nonblank rejects whitespace-only
text and control_characters: false rejects control characters. Symbol patterns
are ASCII and case-preserving; duplicate checks compare exact strings. Column
names must be unique; omitted columns resolve to default_when_empty, not all
available fields. These annotations describe client checks, not provider field
availability. Default argument values remain in clap-derived arguments.
Search receipt time is not market-data time. Single-symbol identity may remain
unconfirmed; batch missing and unreported outcomes have different meanings.
Absent fields and explicit nulls are not interchangeable or zero. limits
records these distinctions. All six operations can update local authorization
through token refresh without mutating account watchlists or alerts.
tv spec mcp watchlist create|update|add|remove|delete and
tv spec mcp alert create|update|stop|restart|delete describe changes; looking
up those specifications never dispatches them. Choose one action per invocation.
Each detail includes ID discovery, examples with synthetic targets, shared
input bounds and the output/error contracts. Names use Unicode scalar counts,
unlike the byte limits on market-data queries. Watchlist IDs are canonical
unsigned decimal strings; alert IDs are positive integers bounded by the
existing signed-64-bit provider limit. --timeout is unsupported for mutations.
Watchlist add moves existing members to the end. Update preserves omitted fields, while an explicitly empty description clears it. Alert update reactivates an inactive alert even if only its name changes. Alert restart uses existing conditions and notification settings; delete also removes fire history. Create defaults notifications and auto-deactivation to false. Specs expose these effects so an agent can check them against the user's requested operation.
readback describes the CLI's automatic follow-up and a separate read command.
A usable reply and identifiable target are needed before that follow-up can
run. response_received does not prove persistence; inspect the readback status
and per-target observations. An item absent from an incomplete list is not a
confirmed deletion. After outcome_unknown, inspect state before considering
another mutation. For an uncertain create, do not select by name or create a
replacement automatically. Examples are instructions for syntax, not permission
to change an account.
Desktop semantics cover symbol, timeframe, type, range, info, state,
readiness and tab list. variants describes argument-dependent behavior;
tv spec does not accept an invocation's values or select a variant for you.
Each when uses clap argument IDs: present, absent, or
exactly_one_present; lifecycle paths also use flag_true, flag_false and
runtime observations that spec lookup cannot evaluate. A null common effect or requirement means that callers
must inspect the variants, not that the effect is absent.
| Path | Behavior |
|---|---|
symbol, timeframe, type |
Omit the positional argument to read; provide it to change the selected chart. Chart-type names/codes use the execution table. |
range |
Neither bound reads; both bounds request a range change and may load older history. One bound alone is rejected. Bounds must be finite with from < to. |
info |
No symbol reads the selected chart; an explicit symbol uses credential-free symbol_search_rest without switching the chart. |
state |
Reads the selected chart's current state and readiness clues. |
readiness |
Checks Desktop/chart/bar readiness; a successful envelope may contain ready=false. |
tab list |
Lists targets without activating them. data.tabs[].id supplies --target-id; it is not the numeric index used by tab switching. |
Examples containing <target_id> require a selected live ID. Specification
lookup never obtains one or changes the chart. Desktop authentication is left
unknown because session/data access belongs to the running application; these
commands do not use MCP OAuth. A null output contract means no versioned contract
is advertised here. Other Desktop commands remain explicitly unannotated,
including other data/export paths.
| Path | Effect and follow-up |
|---|---|
launch |
Reuses a responding CDP endpoint. Otherwise may start the app and, with --kill-existing, terminate an existing session first. Inspect readiness and warnings. |
tab switch |
Activates a chart target using data.tabs[].index from tab list. |
tab new |
Activates the source chart, then opens an app tab. --from uses data.tabs[].index; omission requires exactly one chart tab. |
tab close |
Closes an app tab using data.app_tabs[].index, not the chart index. Refuses the last app tab. |
chart compare |
Visits 2–10 symbols on the selected chart, attempts restoration after each read, and stops on an item error. Restoration is not guaranteed. |
A responding CDP endpoint is reused even if --kill-existing was passed.
Starting an app requires an installation or a valid explicit executable file;
process startup does not prove chart readiness. Specs do not probe processes,
paths or endpoint availability.
Tab indices can change between listing and execution. Select from the correct
list, and inspect the new list after a mutation. App-tab operations also need
a usable app-window UI. --target-id cannot substitute for their index arguments.
If creation or closure returns an error, inspect the application before retrying.
Chart comparison is an operation with temporary changes, not a read-only query.
The output retains per-item status and restoration evidence, final chart context
and a summary. Successful JSON can contain partial results. Desktop-free
tv compare remains a separate scanner-backed workflow, never a fallback.
Specs cover all seven Replay commands: start, step, stop, status, autoplay, trade and log. Status is read-only; the others change Replay or practice-position state on the selected Desktop chart. Replay trades are not broker orders.
start --date accepts a calendar date; omission selects the first available date.
Availability depends on the chart and timeframe. Startup failure can attempt to
stop Replay, so an error does not establish unchanged state. Step, autoplay,
trade and log require an already-started session. Stop handles an already-stopped
session without starting it.
autoplay toggles playback on every call. A positive --speed changes the delay
in milliseconds before toggling. Zero or omission keeps the delay and still
toggles; zero does not mean stop. Specs use the model's accepted delays and
practice-trade actions.
log advances 1–100 steps and emits replay_step_log.v1 JSONL on stdout.
Its summary reports actual progress and the end state; the command does not
start or stop the session. OHLCV summary attachment is optional, and an explicit
count requires its attachment flag. Chart screenshots require both the flag and
output directory. They use deterministic replay-step-0001.png names without
overwrite. Setup can create the directory before session readiness is known.
Attachments follow successful steps; an attachment failure does not repeat the
step. Specs describe conditional file effects rather than classifying logging
as a read. Specification lookup writes no attachments and always returns its own
normal JSON envelope, even when describing this JSONL command.
All ten ui commands have semantic details. find observes elements; click,
hover, keyboard, type, scroll, panel, fullscreen and mouse can change the UI.
eval has unknown effects because it runs arbitrary JavaScript. Spec lookup
never connects to the page or enables TV_ALLOW_UNSAFE_UI_EVAL; actual eval
requires that variable to equal 1.
Find supports text, aria-label and CSS queries. Click/hover support text, aria-label, data-name and class-contains, but not CSS. Discovery results are observations, not stable identifiers; inspect the first matching target before acting. Hover can change a menu or tooltip. Find returns at most 20 rows and does not prove complete UI coverage.
Keyboard shortcuts and typed text go to the current focus. Type output includes a text prefix, so it is not a credential-entry workflow. Coordinate clicks use the current page geometry. Scroll amounts must be finite but may be negative; scrolling does not establish a requested date range. Panel actions default to toggle, and fullscreen also toggles. Repeating these calls can reverse state.
UI mutation does not imply a known account effect: the focused element or page code determines that. Specs leave account effects unknown except for find. Prefer a dedicated operation when available and inspect the result before retrying a UI input. Names in examples require the user's selected UI target; examples do not authorize account changes.
Specs cover indicator add/get/set/toggle/remove and the equivalent data indicator
read. Resolve chart-local entity IDs from data.studies[].id in tv state on
the selected target. Names are not IDs. Get may omit long string inputs and leave
visibility/inputs unknown; it is not a complete export.
Add resolves a trimmed, case-sensitive metainfo description with exactly one candidate. There is no dedicated metainfo search command. Supplied inputs must be a nonempty JSON object with scalar values and JavaScript-safe integers; keys must match that metainfo. Insertion is awaited and one new study with the requested name/inputs must be verified. Failure can attempt cleanup, but does not guarantee rollback. Inspect mutation and cleanup evidence before retrying.
Set accepts a nonempty object and updates matching input IDs. Other keys can remain unmatched even on success; no match fails. Its local validator does not apply add's scalar restriction. Returned updated values are requested values, not verified persistence; inspect unmatched inputs and read the study again.
Toggle is a setter despite its name: no flags or --visible shows the study,
--hidden hides it, and both flags are rejected. The operation reads visibility
back. Remove checks absence of the same entity ID after removal. Specification
queries do not perform any of these operations.
Specs cover shape/position/list/get/remove/clear on the selected chart. Position
drawings are visual objects, not broker orders. List supplies data.shapes[].id
for get/remove; IDs from another chart are not interchangeable.
Shape coordinates must be finite. Second and third points each require both
price and time. A third point requires a second point, type parallel_channel,
time3 == time, and no nonblank text. That path has dedicated point/identity
verification; ordinary one/two-point creation observes IDs/counts rather than
verifying every property. Generic shape types remain runtime-dependent, not an
invented local enumeration. Overrides must be a JSON object, which may be empty.
Position direction is either positional or --direction, never both. Long
requires stop_loss < entry_price < take_profit; short reverses those bounds.
Prices/time must be finite and optional account-size/risk/lot-size values must
be positive. Without entry-time, execution uses the visible-range end or current
Unix time. Levels round to the selected symbol's pricescale; inspect the drawing
rather than assuming exact geometry from input prices.
Clear defaults to deleting every drawing on the selected chart and checks an
empty inventory afterward. --dry-run reports targets/counts without deletion;
it does not freeze the set for a later invocation. Empty inventory is a no-op.
Remove checks absence of the selected ID. Errors after mutation require reading
current state before retrying; no rollback is guaranteed by specification lookup.
pane list/layout/focus/symbol operate on the current Desktop chart collection;
layout list/switch enumerate and load account-saved charts. Pane layout codes
come from the execution catalog. Pane indices come from data.panes[].index
and are distinct from tab indices and saved-layout IDs.
Pane focus attempts a click but does not verify active-pane identity. Symbol
first focuses, then changes the active chart; its returned symbol echoes the
request. Read pane list afterward to check the intended pane. Pane layout
returns both requested layout and observed_layout without asserting equality.
These limitations remain visible in the specification rather than upgrading
existing mutation results into stronger evidence.
Saved-layout selection matches an exact ID first, then a case-insensitive exact
name, and rejects ambiguous matches. layout switch --dry-run resolves the
selection through Desktop without loading it. Normal execution can navigate;
switched is not proof that loading finished. The command reports observed
unsaved-change dialogs without dismissing them. Refresh targets after navigation
and inspect the intended chart before continuing. layout list is inventory,
not active-layout readback; inspect data.error even with a successful envelope.
All thirteen Pine paths have semantic details. Analyze and alertconditions read
UTF-8 source from --file or non-terminal stdin and run locally. Check uses the
same input selection but sends source to the credential-free Pine facade; it is
neither offline nor official MCP. No source-input command implicitly reads the
Editor, and none writes a local file. Static findings and best-effort alert
condition indices do not establish successful TradingView compilation.
Desktop get/errors/console may open the Editor. Set and new replace and verify text without creating a new saved-script binding. In particular, new writes a template into the current Editor; saving afterward can affect the existing script. Open resolves a unique saved name and verifies identity/version binding without source-only fallback, saving or compilation.
Compile may add or update a chart study and returns markers and study counts;
those observations are not exact study identity or runtime correctness proof.
Raw-compile can also invoke a save action and returns no diagnostic verification.
Save requires explicit saved/clean UI evidence for an already named script; it
does not handle naming a new script or independently retrieve a saved revision.
Errors reads current markers without compiling, while console reads visible log
entries. Empty markers or logs do not establish a fresh successful execution.
Saved-script list can return data.error inside a successful envelope.
Ohlcv reads recent loaded chart bars without moving the viewport. Count defaults to 100 and clamps to 1–500, so zero requests one bar. Export chart-bars instead rejects counts outside 1–500 and defaults to 500. It changes the visible range before reading recent bars; the output is JSON on stdout, not a file or a range-filtered historical dataset. Inspect requested and returned ranges and the range-match diagnostics. The previous viewport is not restored on completion or a later read failure. Summaries are derived aggregates; missing numeric fields can be skipped or defaulted by the current summarizer.
Scroll uses loaded bars and an approximate time window around the date. It does not request older history or verify that the final viewport is centered exactly there. Its date/window fields describe the request; use range for readback.
Screenshot writes a local file, creates missing parent directories and overwrites an existing output. Full captures the page, while chart and strategy capture a visible region; the operation does not open Strategy Tester. Clipped capture can fall back to a crop of the full page. Render waiting is optional, with a 500–30000 millisecond bound and 5000 millisecond default. A timeout argument requires the wait flag. Stable observations do not guarantee every pixel or fresh market data. Wait failure precedes capture/write, but a file-write failure is not atomic. Replay screenshot attachments retain their separate no-overwrite behavior.
Search returns up to 15 candidates, not an exhaustive list. Choose a qualified
data.results[].full_name when the exchange matters. Bare-symbol bars lookup
selects the first exact symbol match from search rather than rejecting multiple
exchanges. Inspect requested_symbol and resolved_symbol. Symbol resolution can
perform network I/O before later bars validation; specification lookup stays
offline even when an execution would fail validation.
Bars uses the undocumented, unauthenticated WebSocket route with split adjustment
requested. It does not imply MCP/Desktop equivalence, verified entitlements or
realtime data. Recent mode defaults to 100 bars and accepts 1–500. Date-range mode
requires both dates, defaults to a 500-bar cap and permits up to 5000. Range mode
supports fewer timeframes than recent mode; exact choices and aliases are in the
specification. Filtering uses period-start timestamps and includes the entire
UTC to date, without expanding weekly/monthly bars into daily coverage.
Count fulfillment and period coverage are separate. A complete range can contain fewer bars than its cap, while reaching a cap need not cover the requested period. Read range_coverage_status, range_fetch_summary and data_quality.completed; summary.coverage_status and data_quality.partial_result describe count fulfillment. Timestamp-bound coverage is not a trading-calendar gap audit. A failure stage locates the error but does not authorize repeated requests or provider fallback.
Quote semantics depend on both symbol and source. Without a symbol, the default, chart and auto routes read the current Desktop chart. Scanner and quote-data require a symbol. With a symbol and no explicit source, quote uses scanner REST; explicit chart can temporarily switch the chart symbol and attempt restoration. Bare-symbol comparisons do not establish strict identity across exchanges. Inspect observed symbol and restoration/freshness evidence.
Auto falls back to scanner only when connecting to Desktop fails. Once connected, it uses the chart path and returns its failures without scanner fallback. Quote-data instead observes Desktop network events and returns quote_data.v1; it neither switches symbols nor participates in auto routing. Scanner extended hours, chart last-bar/session data and quote-data rtc/lp have different meanings.
Quotes accepts 1–25 nonblank symbols and preserves order, requested_index and duplicates. Mixed results use a successful envelope with per-item errors; all failures produce an error with ordered batch details. Missing session prices stay unknown rather than borrowing another source's value.
Scanner metainfo discovers fields for america. Repeated --field values are trimmed/deduplicated; omission requests all available fields. Inspect missing_fields and optional metadata. This discovery is a provider read, not proof that every requested field or scan capability is available.
Values reads formatted data-window observations, preserving separate same-name studies and optional identity, visibility and compact inputs. It can omit studies without readable values and include hidden ones. Values are not timestamped numeric series, and absence is not zero. Use same-chart entity IDs and inputs to distinguish instances; the command accepts no per-study selector.
Strategy, trades and equity select the only candidate or, among several, the only report-bearing candidate. Unresolved ties remain ambiguous; hidden and unready candidates remain unavailable. These reads do not open Strategy Tester or change visibility. Inspect strategy_context and data.error even when the envelope succeeds. Report availability means some capability was detected, not that the requested reader has usable data.
Metrics and trades can fall back to already rendered DOM content. Its strategy identity is not independently verified by strategy_context, and row/metric shapes differ from internal report data. Trades defaults/clamps to 1–20 entries, with no newest-first guarantee or pagination. Compare total and returned counts where available; DOM content may be only the rendered subset.
Equity retains report buyHold, equityData, then strategy-bars precedence.
series_source records that branch as report_buy_hold, equity_data or
strategy_bars. series_kind identifies Buy & Hold as buy_and_hold; other
series remain unconfirmed, not guaranteed strategy equity. Rows retain their
existing shape; strategy bars preserve zero drawdown and use null for missing
values. Performance-only output reports performance_summary with
series_kind=unavailable; empty/error output uses unavailable for both labels.
Confirm series meaning before calculating returns. equity_summary with
data_points=0 remains summary-only.
Data lines/labels/tables/boxes read Pine primitives on the selected Desktop chart. Their filter is a case-sensitive name substring without trimming; an empty filter selects all readable studies. Rows lack study entity IDs, so duplicate names can remain ambiguous. Missing primitives and suppressed per-study errors can omit rows. These commands neither filter by visibility nor read hand-drawn objects.
Lines round y endpoints to two decimals before horizontal comparison, deduplicate levels and sort descending. Boxes similarly round/deduplicate high/low zones. Verbose output adds primitive detail but does not restore precision or establish coordinate units. Neither summary validates a trading level.
Labels omit entries lacking both text and numeric y. Max defaults to 500 per study, accepts zero, and keeps the last readable entries in primitive iteration order. Counts distinguish extracted, readable and returned labels. This is not a chronological/pagination guarantee or a Desktop collection limit.
Tables group and sort integer table/row/column keys, default missing keys to zero
and overwrite duplicate coordinates. Output contains only row strings joined
with |, dropping empty cells/rows and original coordinates/IDs. Delimiters in
text are not escaped; the result cannot reliably reconstruct a typed rectangle.
There is no tables verbose or max option.
Scanner scan defaults to the first page, with limit 20 and a 100-row clamp; zero is rejected. An explicit offset selects one page and adds offset to the otherwise flattened page payload. Max-results selects sequential aggregation and conflicts with offset/limit. Page-size requires aggregate mode. The spec lists limits, fixed field choices, defaults, filter domains and CLI argument IDs.
Max-results is a permitted population ceiling, not a top-N request. Aggregate requires numeric totals within that ceiling and exact expected page sizes; missing totals, incomplete/overfull pages and request failures return errors. Rows deduplicate by exact symbol, retaining first occurrence. The result includes duplicate and total-drift observations, request fingerprint and start/end times. It is not an atomic snapshot: membership and ordering can change without a total change. The fingerprint identifies query fields, not a frozen dataset.
Both modes use credential-free scanner REST, not Desktop Screener or official MCP. Column/sort fields use a local allowlist; provider metainfo is a separate catalog. Numeric filters must be finite; price/volume/valuation thresholds are nonnegative, signed performance/change thresholds may be negative, RSI is 0–100 and recommendations are -1–1. Provider operators are greater/less; min/max pairs are not checked for ordering. Inspect the actual filters rather than assuming inclusive thresholds or a sensible interval.
Snapshot and compare assemble scanner quote, REST symbol info and scanner fundamentals without Desktop or MCP. They return snapshot.v1 and compare.v1. Sections are separate observations, not a synchronized dataset. Snapshot accepts one symbol and fundamentals group/field selection; compare accepts 2–25 symbols, preserves order/duplicates and uses default fundamentals fields. Group expansion precedes explicit fields and deduplicates them; specifying either replaces the default selection only for the fundamentals section.
Any successful section makes a symbol packet successful. Compare resolved_count therefore does not count fully populated packets. Complete coverage checks section success and tracked fundamentals missing fields, not every quote/info field, identity agreement, freshness or entitlements. All-section/all-item failure retains the packet in outer error details. Use sections, errors and missing_evidence alongside summary. The top-level symbol uses quote, then fundamentals, then info rather than requiring cross-section agreement.
Follow-up hints do not execute or authorize actions. Their non_mutating flag
means no chart mutation: chart_quote is false because it can switch/restore a
symbol, while screenshot remains true. effects.chart_mutation and
effects.local_file_write describe those possible effects separately; screenshot
has the file flag true. Read-only hints have both false. Packet-level
non_mutating remains true because producing hints executes none of them.
Inspect the hinted command's own specification before acting.
MCP screener requires authentication and remains Desktop-free. Its specification uses mcp_screener.v1 and the common read timeout metadata. Filters are a JSON object with up to 50 fields and 16384 input bytes. Numeric bounds are two finite numbers or nulls with min <= max; index, sector, industry and analyst_rating also accept strings. Columns use shared defaults and uniqueness limits. Types and symbolset are optional exact-unique string lists; their provider meaning is not validated by local shape checks. Presets are explicit accepted names, not trading judgments or a replacement for technical indicator observations.
The single read has no paging/offset. Empty success is valid, while inconsistent counts, duplicate symbols and malformed identities fail normalization. Count coverage limited/all_reported/unconfirmed does not establish exhaustive market coverage; item missing fields remain distinct from explicit nulls. Data time, delay and session remain unconfirmed. Regional screener market syntax is separate from column-discovery categories. Credential refresh may update local state; specification lookup itself reads no credentials or provider data.
Financials, financial-history, forecasts and earnings share authenticated read prerequisites and timeout metadata. Financial snapshots accept fy/fq/ttm/fh/current and up to 50 unique metric names; omission leaves selection to the provider. History accepts fy/fq. Its dates and earnings dates are independently optional, strict YYYY-MM-DD calendar dates with from <= to when both are present.
Provider metadata remains distinct from the request. Missing identity is unconfirmed; a returned conflicting symbol or reporting period rejects a single-symbol response. Completeness, metric selection and requested-window coverage are not inferred. Currency, unit, scale and as_of are unknown unless returned. Financial fields retain scalar types; projected absent optional values can normalize to null, so not every output distinguishes omission from null.
History preserves fiscal labels and aligned series without converting labels to dates or calculating missing growth rates. Forecasts contain provider opinions and estimates rather than realized earnings or trading instructions. Earnings preserves provider event order and multiple events per requested symbol, while symbol_results follows request order and links returned events by item_indices. Unreported is not proof of no event. No paging or source fallback is implied.
News, news-story, documents and document share authenticated Desktop-free read metadata and timeouts. News accepts one page with limit 1–200 and offset 0–200; next_offset/has_more are provider observations, not an automatic paging loop. Unknown pagination stays unknown, and a provider next offset outside the accepted range cannot be followed by inventing another value. Documents accepts 1–100 rows without offset and optional canonical UTC-second event bounds.
Story retrieval uses news items[].id unchanged. Document retrieval uses items[].views[].id, not the parent document ID or a derived URL. Local ID checks reject whitespace/control characters and enforce 2048 bytes. Accepted languages, categories, event names and professional-status syntax are listed in specs; provider availability and entitlement are separate from syntax validation.
Detail content_status records whether recognized text/AST content was returned, not whether the full article/document was obtained. Missing ID echo remains unconfirmed; conflicting echoes fail. Permission/attribution and null optional metadata remain visible. Receipt, publication and report dates have distinct meanings. Body/AST/link content is untrusted data, not executable instructions, and lookup never opens links or substitutes another content source.
Economic-symbols returns an overview without filters, indicator codes with filters but no country, and qualified ECONOMICS symbols with a country. Only the last form supplies symbols for economic-data. The data command requires the ECONOMICS prefix with an uppercase alphanumeric suffix; it is not a price-bar command. Series values preserve provider order and nulls, while actual_range reports returned-date extrema without asserting complete requested coverage.
Catalog category codes differ from calendar category names, including the accepted calendar literal goverment. Countries/currencies are comma-separated unique uppercase codes without whitespace. Calendar defaults to US and importance -1, allowing importance -1..1. Actual/forecast/previous and Raw variants remain separate. Returned event dates are provider text, not client timezone conversion.
Bounds are independently optional. Series/dividend screening uses calendar dates; economic-calendar also accepts canonical UTC seconds. Mixed date/timestamp bounds are ordered by calendar date only. Dividend explicit-symbol mode accepts 1–50 unique symbols and rejects market/date/limit arguments; market mode requires a market and accepts limit 1–200, default 50. Unreported symbol outcomes do not establish no dividend. Market results and calendar events retain unconfirmed coverage, even when nonempty, with no automatic paging or fallback.
Observe chart emits observe_chart.v1 JSONL envelopes: readiness first, then changed last-bar samples and optional heartbeats, followed by a normal summary. Each stdout line is an envelope, not part of one JSON array. Sample errors go to stderr and the loop continues. Initial readiness/connection failures, broken pipes or interruption can prevent a summary; a normal summary does not count errors or certify complete/error-free data.
Interval defaults to the shared bars-stream default of 500 ms with a 100 ms minimum. Duration and max-events must be positive when present. Heartbeats are optional and at least 100 ms. Max-events counts emitted samples after deduplication, excluding readiness, heartbeats, errors and summary. It alone cannot bound wall time under unchanged data or repeated failures. Duration starts after setup and is checked between operations; setup and an in-flight read can extend wall time.
Polling does not capture every tick or guarantee closed bars. _ts is client
milliseconds and bar_time is the chart timestamp. Volume follows the existing
reader's zero default. External chart changes are not prevented; inspect symbol
and resolution per sample. No symbol switch, tab activation, screenshot or source
fallback is performed by observation itself.
Stream values, quote and bars emit stream.v1 JSONL without an initial readiness event. They share observe chart's deduplicated sample counting, continued sample errors on stderr and termination limits. Quote defaults to 300 ms; bars and values default to 500 ms. The minimum interval is 100 ms.
Values reads numeric properties from studies' internal last-bar data rather than repeating the formatted data-window read used by values. Explicitly hidden studies are skipped when visibility is readable; unavailable studies and per-study failures can be omitted. Unknown visibility remains unknown. Identity and compact input changes affect deduplication. There is no study filter, explicit timeframe field or guaranteed per-study timestamp in these samples.
Quote and bars both read the current main-series last-bar OHLCV. Quote uses time and omits resolution/bar_index; bars uses bar_time and includes those fields. Neither is a scanner/MCP quote feed or a historical bars export, and polling can miss intervening changes. Missing/falsy volume follows the existing zero default. Verify chart context before collecting; external chart changes remain possible.
Use stream lines, stream labels or stream tables for repeated Pine graphics
reads. Their optional --filter is a trimmed, case-insensitive substring of the
chart study name, unlike the single-read data commands. Rows have study names
but no entity IDs, so same-name instances remain ambiguous. Hidden studies are
not excluded. Unreadable primitives and individual study failures can omit rows;
study_count is the returned row count. Samples lack resolution and primitive
timestamps. Verify chart and script coordinate context before interpretation.
- Lines returns unique raw endpoint levels sorted descending. Sloped lines also contribute an endpoint; these are not verified horizontal levels. Truthy endpoint fallback can replace zero, and coordinates/IDs/styles are omitted.
- Labels keeps nonempty text and the first 50 entries per study in internal iteration order, without truncation counts or configurable limits. A zero y fallback can become null. Label IDs and x coordinates are absent.
- Tables returns nested text rows rather than the pipe-joined
data tablessummary. Styling, primitive IDs and proof of complete extraction are absent.
stream all reads last-bar OHLCV from chart panes in the current layout; it does
not combine the other stream kinds. Inspect each pane's error even when the
sample succeeds. pane_count includes failed panes and indexes describe current
widget order, not stable identities. Successful rows have symbol, resolution and
time; missing volume can default to zero. Panes are read sequentially, without
an atomic cross-symbol snapshot guarantee or a saved-layout/tab switch.
Defaults are 1000 ms for lines/labels, 2000 ms for tables and 500 ms for all.
Use tv spec stream <kind> when available and help otherwise. The same JSONL
error channels, deduplication and duration/count limits described above apply.
Watchlist list returns items in provider order with decimal-string IDs. Pass
the selected ID unchanged to get, which returns watchlist and checks its ID
against the request. IDs allow zero and reject leading zeros/whitespace. Preserve
symbol order and section labels; a section label is not a tradable symbol.
symbols: null is unknown, not an empty list.
Alert list accepts an optional qualified symbol and explicit --active true or
--active false; omission leaves active state unfiltered. Known response fields
that contradict filters fail, but null fields remain unknown. List rows retain
provider order and positive numeric alert IDs. Get accepts 1–100 distinct IDs
up to 9223372036854775807. It returns requested order with requested_id,
status and nested alert. An unreported ID has a null alert and does not prove
deletion. returned_count counts actual alerts, not placeholder rows; check
ids_status and unreported_count. Unexpected or duplicate IDs fail.
Successful transport does not establish complete account coverage. These reads have no pagination controls or automatic traversal. Receipt time is client time; account time fields remain provider strings. Conditions are a limited projection with unknown completeness, insufficient to recreate complex Pine alerts. Messages and webhook URLs are excluded; notification flags do not establish delivery. Keep account IDs and returned account data private.
Use tv spec mcp status, tv spec mcp login or tv spec mcp logout when
available to inspect effects without performing the operation. These success
payloads use the ordinary CLI envelope without a separate versioned data contract.
All three acquire the local per-user lock and can create local state/lock files;
local-only operations can still fail on storage access or lock contention.
Status does not refresh tokens or contact the provider. Unknown expiration yields
null expiration/expiry fields. A readable record or locally_expired: false
does not establish provider acceptance. next_action is null when a record exists,
even if later login may be needed.
Storage errors are not equivalent to missing credentials.
Login discovers OAuth metadata even when it reuses credentials and may refresh
and save them. Fresh authorization registers a client, requests mcp:read via
PKCE and waits for browser consent through a loopback callback. Human progress
messages appear only on terminal stderr; agents capturing output must explain
and await browser/OS actions themselves. Login success leaves provider acceptance
unconfirmed because it does not call a data/account tool.
Logout deletes only the dedicated local record. It neither signs out the browser
nor revokes remote grants, changes account objects or resets provider limits.
It does not authorize OS interaction: a required deletion prompt produces an
error and needs a separately arranged credential-manager action. Default budgets
are 300 seconds for login and 30 for status/logout. None accepts --timeout.
When supported, inspect the chosen tv spec screener command path before use.
Status reads current state without opening the panel. Get, screens active,
filters list and columns list can temporarily open a closed panel, then attempt
to close it with Escape. opened_for_read records the opening;
restored_open_state is the initial open boolean, not a success flag. False is
expected after a successful closed-to-open-to-closed read. Returned open is the
captured state, not necessarily the final state. After errors, check actual UI
state because opening or cleanup can fail.
Get defaults to 20 rows and clamps positive limits to 100; zero is rejected. It
does not scroll or paginate. visible_row_count counts DOM table rows, not total
matches or strictly viewport-visible rows. Cells contain localized display text.
field_values uses displayed column labels, so duplicate labels overwrite keys
and missing headers can misalign values. Row text is truncated to 500 characters.
Screens active returns title text, not a saved-screen ID. Filter pills are not a full filter definition. Columns list returns displayed names and positional indexes, not storage column IDs. Inspect config/actions before editing. For data-only screening use official MCP when it meets the requested criteria; it does not reproduce saved Desktop screen state. Never silently substitute sources.
Use tv spec watchlist get when available to inspect this distinct Desktop
operation. It reads rendered right-panel content without selecting a list by ID.
Closed/missing panels can return successful empty rows. Extracted symbols are
deduplicated; rendered content does not establish full account-list coverage.
The source field reports panel_closed, no_container, data_attributes, text_scan
or empty. Data-attribute reads infer last/change/change_percent from numeric
cell strings; text scans can return unqualified ticker-like names with null
prices. Neither confirms symbol identity or freshness.
Prefer explicit tv mcp watchlist list followed by get <ID> for account-list
contents. MCP preserves sections and ordering but does not reproduce visible
quote cells or establish which list is selected in Desktop. Do not switch
sources after a failure without deciding that the alternative meets the request.
Screen lists read the title menu by default or open the catalog with --catalog.
They do not enumerate all account storage. Names and indexes are UI observations;
IDs and owner/shared flags can be absent. Scope and exact names matter when
selecting a target. Screen actions report recognized menu entries. save_enabled
means an enabled save candidate was seen, not that saving succeeded.
Filter actions probes one numeric-filter candidate's manual-range popover. Its
range_options does not describe every filter. add_supported is currently
false because this probe does not verify the add catalog; a separate filter-add
command exists. Column actions reads settings categories, while its header-menu
actions are currently empty. Thus remove_supported and reset_supported are
false even though a separate storage-based remove command exists. Reset remains
unimplemented. Treat these flags as limits of the probe, not a CLI capability map.
These menu probes change visible UI even when the Screener is already open.
Successful paths attempt to close their popups and any panel they opened, but
do not reconstruct prior popup/focus state. Early failures can bypass cleanup.
restored_open_state is the initial panel state, not cleanup success.
Columns config instead requires an already open panel and reads screen storage
using the Desktop session. It does not open menus or use MCP OAuth. Missing init
data, failed fetches and exact title mismatches fail. Matching titles alone cannot
distinguish same-title screens. Returned storage fields can fall back to loaded
init data, so they need not match unsaved UI edits. Column id and params come
from storage, while name is paired by visible position and identified with
name_source: visible_column_index; this is not an ID-based name match.
Keep screen IDs/names and configurations private. Official MCP screening can answer suitable data queries but does not supply these saved-screen menus or storage definitions. Reread target state before a separately requested edit.
Dry-run still connects. Switch/save inspect menus; create/rename/save-as can open
and focus name dialogs without submitting. Delete preview fetches account storage.
Cleanup attempts do not reconstruct prior popups or roll back selection/edits.
restored_open_state is the initial panel state, not a cleanup-success flag.
| Action | Execution boundary and evidence |
|---|---|
| switch | Resolves one exact name in the title menu or --catalog scope. Missing/duplicate matches fail. An already-active title returns switched: false; otherwise the new title is observed and left active. No test-name restriction. |
| save | Targets the active screen, with no name argument or test-name restriction. Requires an enabled save action. save_requested: true with confirmation: not_observable confirms the request, not durable storage. |
| create / save-as | Execution requires a destination name containing case-sensitive CLI-Test or テスト. Opens create/copy dialog, submits and waits for the new active title; this is not a uniqueness, content-equivalence or storage audit. |
| rename | --name must match the active title even in preview; --to must differ after trimming. Execution requires the test substring in both names. Success observes the new title, not independent persistence. |
| delete | Resolves an exact saved name through storage. Execution requires a test name and --confirm-delete, and refuses an active target. Preview can report an active target without rejecting it. After deletion by ID, checks name absence in a fresh list. |
Names are trimmed and must be nonempty. Test-name limits are enforced by the CLI, not merely a recommendation for verification. User permission does not remove these implementation restrictions. A failed post-check can follow a completed write; inspect current state before deciding what to do next. Do not blindly repeat create/copy/rename/delete or claim that an error rolled the change back. Keep real names, IDs and account storage replies private.
Inspect tv spec screener columns <action> when supported. Add/remove/reorder
require an already open Screener and readable active saved configuration. They
use the Desktop session to fetch storage; they do not open the panel or force a
UI refresh. Execution is restricted to active screen names containing the
case-sensitive substring CLI-Test or テスト. Dry-run still reads storage,
but only calculates the proposed after_columns without saving.
- Add uses a trimmed nonempty storage
--idand optional JSON-object--params-json(default{}). Omitted--after-indexappends; a supplied zero-based index must refer to an existing saved column. Duplicate IDs/params are not rejected locally, and preview does not verify provider support. - Remove requires exactly one of
--indexor a nonblank--name. The name is a case-insensitive substring and must match one visible column. The visible index then selects the saved column at that position; verify ID/params because this is not an ID-based match. No local guard prevents removing the last column. - Reorder requires distinct in-range saved
--from-indexand--to-index. The destination is the final position after removal, not an insert-after position.
Execution writes the fetched screen document with the new custom column sequence
and active_column_set: custom. It reads storage back and compares ordered
ID/params pairs and count. This does not verify refreshed UI, displayed data or
every screen field. Returned names derive from earlier positional mapping, not
a fresh identity check; init-data fallback can also differ from unsaved UI state.
Intervening edits are not reconciled by the adapter.
A write may complete before readback fails. Inspect current storage before retrying, especially add, which can insert duplicates. These are account-setting changes, not temporary display toggles. Official MCP does not edit these saved column sets. Keep account-local configuration and IDs private.
Inspect tv spec screener filters <action> when available. Filter operations
use different UI and storage paths; do not infer one persistence or permission
rule from the command family. UI add/modify has no test-name guard. Execution
of storage remove/clear/range-modify requires CLI-Test or テスト in the
screen title. These are code restrictions, separate from permission to edit.
Add searches the catalog and matches an existing range option. Supply a nonblank name and at least one finite bound; with both bounds, max must exceed min. Dry-run finds only the candidate, not the requested range option. Success checks a new matching visible pill, not saved storage. Recognized greater/less labels do not establish a uniform inclusive-bound interpretation.
Modify/remove require either a zero-based index or nonblank text, not both. Text uses a case-insensitive substring and must match exactly one visible pill. Modify accepts either a nonblank option or numeric bounds. Numeric presets are: min-only 3, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90; or min 0 with max 3, 5, 10, 20, 30. Max-only is rejected for modify although add accepts it. These are preset selectors, not arbitrary numeric input.
Option modification prefers a normalized exact match, then a unique substring match in either direction. It can clear other selected options before selecting the target. Preview opens the popover; it is not an additive multi-select API. UI readback checks pill text, and an already-matching pill can return no change.
If both the panel and its open button are absent, numeric modify with an index can first try current-screen storage. It supports only simple Condition above/between filters and still applies the public preset bounds; stored bounded ranges require exact zero. Unsupported preflight can proceed to the UI path, but failed post-write verification does not. The storage path requests reload without confirming visible readiness.
Remove and clear previews inspect visible targets only. Execution validates
the test-name guard and equal visible/storage counts, then maps by position.
Count agreement does not prove filter identity. Clear also requires
--confirm-clear and writes an empty saved filter list. Storage writes replace
filters in the fetched screen document and compare ordered definitions on
readback, without reconciling intervening edits.
For remove/clear, a full-page target can reload and poll filter count;
visible_refresh.confirmed checks only that count. False or skipped refresh can
accompany a successful storage change. Dialog targets skip reload. Neither this
flag nor pill text proves row coverage, freshness or every filter condition.
Dry-run can change panel/popover/focus state and can read storage.
restored_open_state is the initial panel state, not cleanup success. Failures
can leave UI or saved settings changed; inspect current state before retrying.
Official MCP can answer a suitable data-only query but does not edit these
Desktop filters. Keep account settings and IDs private.
Prefer official tv mcp watchlist list/get followed by an explicit list-ID
mutation when it meets the request. Legacy watchlist add/add-bulk/remove needs
Desktop and targets the active list; it has no list-ID or dry-run option.
Use tv spec watchlist <action> when available to inspect its behavior offline.
Do not silently replace a requested source or target.
The legacy path first tries the Desktop-session internal API. DOM fallback is limited to recognized pre-dispatch list failures; once a POST is attempted, transport, HTTP and readback failures stop without a second DOM mutation. Readback requires the original list ID and readable symbols, even if another list becomes active. Failure does not imply rollback. Older binaries can replay uncertain writes through DOM or check another list; inspect the installed spec. DOM paths can open the panel and alter focus/input without restoring it. Rendered-row counts and presence/absence are not complete account-list evidence.
Symbols are trimmed and must be nonempty, with no case normalization or strict exchange qualification check. Legacy add skips an exact existing member; official MCP add instead moves an existing member to the end. Legacy remove reports an absent member as an error. DOM remove uses a row control and does not confirm a deletion dialog. Inspect the actual source and outcome before continuing.
Bulk add allows at most 50 unique trimmed symbols, deduplicated case-sensitively.
The delay is 0–10000 ms, default 750, between unique attempts. All unique symbols
are attempted even after failures; --allow-partial changes only the final
result, not continuation. Without it, failures produce an error with the batch
payload in details; with it, the payload succeeds despite failed rows. Neither
mode rolls back earlier changes.
Read each result and its added/already_present/failed/skipped_duplicate status. Requested count includes duplicates; processed count excludes them. Each item resolves the active list again, so selection changes can split a batch across lists. Do not retry a whole batch or repeat uncertain writes without checking current state. Keep account-local details and raw errors out of shared artifacts.
Prefer official MCP for supported explicit-symbol price alerts and explicit-ID
management. Legacy alert list/create/delete uses the selected Desktop session
and private account endpoints. It is not interchangeable with the MCP contract;
use tv spec alert <action> when available before choosing it. Pine indicator
alerts are a separate workflow, not a simple price-alert substitute.
List returns an error for failed reads or malformed row collections; a valid
empty collection still succeeds. Creation/deletion checks use the same strict
reader, so unavailable readback cannot confirm success. Older binaries can
return outer success with data.error; never treat that as an empty account.
Missing active state defaults to true. Provider timestamps are not normalized and projected conditions cannot reconstruct complex Pine alerts.
Messages remain in legacy output, so keep account details private.
Create uses the active chart symbol/timeframe. Conditions crossing, greater_than and less_than map to cross, cross_up and cross_down. The internal API uses on-first-fire, auto-deactivation and about 30-day expiry; popup and mobile push are enabled, email/SMS are disabled and webhook is null. Currency can fall back to USD and resolution to 1. These are different defaults from official MCP. There is no dry-run.
Creation uses the internal API and checks a new matching ID, symbol marker,
message, condition type and approximate price. API preflight failure returns an
error without opening a dialog. There is no automatic DOM or MCP fallback;
failed readback can still follow account creation, so inspect before retrying.
Older binaries can report source: dom_fallback and created: true after a
button click without verifying conditions or persistence; that is not proof
of a correctly saved alert.
Delete requires exactly one of --id and --all. Dry-run is supported only
with all and performs a fresh account read. Execution of all targets every alert
listed at that time, not the chart symbol or a prior preview's fixed set. No
separate confirmation flag is implemented. A missing single ID fails; an empty
all-target set is a no-op. Numeric-looking IDs are converted to JavaScript Number
without a safe-integer bound, unlike MCP's validated integer contract.
Deletion readback checks targeted IDs are absent, not that the account has no newly created alerts. Partial deletion or failed verification does not roll back the write. Inspect current state before repeating a mutation.
tv alert create-indicator uses Desktop and a saved Pine script; official MCP
simple-price alerts do not replace its alertcondition logic. Inspect
tv spec alert create-indicator when available. Supply UTF-8 source via --file
or nonterminal stdin, --script matching exactly one saved name/title, and
exactly one of --condition-title or --alert-cond-id. Use local
tv pine alertconditions --file <source.pine> for best-effort candidates.
The command does not save or compile the supplied source or compare it with the saved script version. Plot IDs depend on preceding outputs. Verify that the source corresponds to the intended saved version before creating an alert. The source text is not uploaded; execution sends derived feature/condition metadata, saved script identity/version and study inputs. It does not add a study, alter its inputs or switch chart symbol/timeframe.
Dry-run is live: it connects and reads the saved-script catalog.
would_create/mutation_supported only describe preview assembly. Missing
script IDs can pass preview but fail execution. Input extraction, chart defaults
and provider creation/readback are not exercised by preview.
Execution takes inputs from the first chart study matching a saved/requested name/title. It does not resolve duplicate names by entity ID or verify source version. Returned input order becomes in_0, in_1, etc.; zero returned values do not prove completeness. Textual input detection can be affected by comments or formatting. When inputs are detected and no matching study is available, it fails; otherwise base metadata can suffice without a study.
Optional symbol/resolution overrides do not change the source of study inputs.
Missing resolution, currency and saved version can default to 1, USD and 1.0.
A trimmed nonblank message overrides the source candidate message, then (none)
is used. The request uses dividends adjustment, on-bar-close, approximately
30-day expiry, auto-deactivation off and all notification channels off.
Readback matches an alert not previously seen by ID, its alert_cond type, condition ID and message; symbol is checked only when reported. It does not verify every input, saved version, resolution or notification delivery. Failed readback does not prove no alert was created. No DOM/MCP fallback is performed; inspect account state before retrying and keep script/account details private.
Use tv data shapes --count <N> [--filter <TEXT>] [--verbose] for Pine plots
represented internally as shapes, not hand-drawn objects or line/label
primitives. Use tv spec data shapes when available, and help otherwise.
Filter is a case-sensitive substring of the first available description, short
name or metainfo ID; whitespace is not trimmed. Hidden studies are not excluded.
Count is a per-study bar-index window, default 100 and clamped to 500, not the
number of signals. Zero can retain plot metadata with no signals. Results run
from newest index backward, with plots in declaration order within each bar.
bars_scanned counts the span even when data rows are missing; scan_count is
the effective cap. Neither is complete historical coverage.
Numeric zero, false, null and nonfinite numbers are omitted. Nonempty strings
and other values can be reported as active; value is not necessarily a price
or boolean. Zero-valued absolute-position plots can therefore disappear. Style
fields come from metainfo/defaults, not verified rendered overrides, and do not
reconstruct all glyphs, offsets or pixel positions.
OHLC uses the main-series row at the same index, without independent timestamp alignment or plot-offset correction, and is rounded to two decimals even in verbose mode. Missing values remain null. Verbose adds plot IDs/indexes/size, not study entity IDs or chart symbol/timeframe. Confirm chart context separately. Per-study errors can omit rows and malformed raw collections can become empty success. Empty results do not prove absent markers, closed bars or valid trading signals; they are bounded observations of currently loaded data.
Use tv spec status or tv spec ui-state when available to inspect these
commands offline. Actual status fetches CDP targets and queries basic chart
metadata for a selected target. Without an explicit target, missing or ambiguous
chart candidates can return success with connected/cdp_connected false and
data.error, even though target enumeration worked. Check target selection and
candidates before treating this as an offline endpoint. Connection failures are
errors; chart evaluation failures can leave unknown fields after connection.
Neither connected nor api_available proves recent bars can be read.
desktop_readiness in status summarizes targets; use tv readiness for the
chart/bar check and retain the intended target's returned target_cli_args.
These commands do not launch Desktop, switch targets or authorize later edits.
ui-state observes DOM layout and chart/Replay state. Open flags use dimension
thresholds or element presence, not proof of usable controls. Button labels are
filtered/truncated, and deduplication strips non-ASCII characters; localized or
repeated controls can be omitted. Key-button matches are mostly English and can
be overwritten by later matches. Coordinates are rounded viewport top-left
positions, not verified click centers or stable selectors.
Chart/Replay errors can be embedded in an otherwise successful UI snapshot. Inspect those sections; no bar freshness, complete button inventory or future action readiness is implied. Recheck after UI changes rather than reusing old coordinates, and keep target URLs/titles and UI content private.
Use tv spec watch compare for offline controls when available. Its readiness
is input validation, not a provider probe. Samples contain scanner quotes, not
all sections of tv compare. Inspect per-item errors and resolved/error counts.
Poll errors go to stderr and the loop continues; successful completion alone
is not collection success.
Only changed samples count toward max-events; timestamps and poll counters
are excluded from deduplication. The interval starts after the poll completes.
Duration is checked between polls, so in-flight requests can overrun it and
postpone heartbeats. _ts is client emission time, not market time. Summary
last-result counts describe the latest successful poll; inspect poll_error_count
as well. A closed output pipe can omit the summary.
Use tv spec fundamentals and tv spec events compare for offline details when
available. Fundamentals reads the america scanner market and preserves raw
field values. missing_fields lists absent array positions, not explicit nulls;
an empty list is not proof of complete financial data. Inspect field_values.
The local identity check compares bare symbols, so verify observed_symbol and
its exchange against the request. No currency, period or freshness is inferred.
Events compare preserves request order and duplicates. Even when every item
fails, its outer response can succeed: inspect item status, failure details and
summary.error_count. Successful items contain events.v1, shaped from scanner
fields rather than a full calendar. no_events_returned does not prove absence
of events. Preserve raw readback and source availability; do not infer timezone,
market session or confirmed/estimated status.
Inspect tv spec screener open or tv spec screener close offline when
available. Default open operates the selected target's dialog and requires its
Screener button, even if a panel is already detected. It either reports the
existing open state or clicks and waits for panel detection. This does not prove
rows are loaded or authorize saved-screen edits.
open --full-page instead activates the first matching Screener target; it does
not use --target-id to select that target or reject multiple matches. If none
exists, it tries CDP tab creation, then a TradingView new-tab tile fallback on
creation error. Post-check can accept another matching target. Inspect tab list
first and use the returned target_cli_args for subsequent operations. The
created/reused flags describe the path taken, not unique tab ownership or data
readiness. Previous focus is not restored; failures can leave tabs or UI changed.
Inspect actual state before retrying rather than assuming nothing happened.
close sends Escape to the selected target only when a panel is detected. It
waits for panel disappearance and fails if still open; Escape may dismiss a
popup instead. An already closed panel returns action=already_closed and
closed=false, which is a successful no-op. This command does not close a tab
and has no full-page option. A full-page panel may remain detected after Escape;
do not automatically substitute a tab-close operation.