| name | market-open-report |
| description | Produce the TC-TIDE morning report — scan the watchlist for trend state, entries, exits and open positions, and render a standalone HTML brief. Use when the user asks for the morning report, the daily brief, a pre-open scan, or "what is my watchlist doing today". |
Morning report
Which list it scans
The run prints a [source] line before anything else, naming where the watchlist came from:
[source] watchlist: your saved list "TC-MASTER-WATCHLIST", exported 2026-08-24T02:46:48.582Z
[source] watchlist: the scan list that ships with the report, not your TradingView watchlist
Quote that line. Never infer the source from the symbol count — the saved list and the shipped
list can hold the same number of names, and presenting one as the other is the same failure as
presenting a stale price as a live one.
Resolution order is: the MARKET_OPEN_REPORT_LIST environment variable, then
smart-trader-settings.json at the workspace root, then the CSV shipped inside this skill. A
recorded path that no longer exists is discarded and the run says so on stderr, because a missing
CSV scans zero symbols and still produces a complete, well-formed, entirely empty report.
To save or inspect the choice, use the skill's own tool rather than editing either file by hand:
node scripts/settings.mjs --show
node scripts/settings.mjs --import-watchlist <watchlist_export.json> --name "<name>" --chart-layout "<layout>"
tvcontrol-setup Step 7 does this as part of getting someone set up. It only persists if the chat
has a real workspace folder — in a throwaway wcore-temp- workspace it is gone next session, and
--show prints the path so you can tell which one you are in.
Runs a daily scan over the watchlist and produces two things: a plain-text
report and a standalone HTML brief.
It does not read the user's TradingView chart, and does not need TradingView
Desktop, the TVControl connector, or any API key. Prices come from Yahoo daily
closes and the strategy is computed here. That is deliberate: scanning seventy
symbols through the chart means seventy symbol changes and seventy study
reloads, and every one of those is a place the UI can fail silently.
Running it
Both commands run from this skill's own directory, but the output directory is
relative to the WORKSPACE ROOT — not to this directory. So pin it to an
absolute path FIRST, while you are still standing in the workspace root, and
only then change into the skill directory:
OUT="$PWD/artifacts"; mkdir -p "$OUT"
cd <this skill's directory> # e.g. .wayland-core/skills/market-open-report
node scripts/morning-report.mjs --tier 1 --slots 20 --json "$OUT"/mr.json
node scripts/briefHtml.mjs "$OUT"/mr.json "$OUT"/morning-brief.html
Resolve the output directory after that cd and a bare artifacts lands beside
this script instead — under a hidden engine directory the Workbench does not
show, so the brief exists and the user never sees it.
Node only. No dependencies, no install step, no Python.
It works with no arguments and no setup. A default watchlist ships in
data/TC-MASTER-WATCHLIST.csv (74 names) and an empty holdings template in
data/positions.csv, so a brand-new user gets a real report on the first run —
about 13 seconds cold, since it fetches every symbol. Do not ask them to supply
a watchlist before running it once.
Override any of it through the environment, so nothing is written where it does
not belong:
| variable | meaning |
|---|
MARKET_OPEN_REPORT_LIST | watchlist CSV (defaults to the bundled one) |
MARKET_OPEN_REPORT_POSITIONS | the user's holdings CSV (absent is valid) |
MARKET_OPEN_REPORT_CACHE | Yahoo cache directory. Leave it unset unless you have a writable path: it overrides the script's own probe for a writable cache, and if it points anywhere the sandbox refuses (anywhere outside the workspace, home included) mkdir fails EPERM, every symbol reports NO DATA, and the run still exits 0. |
Write --json and the HTML brief to the output directory, resolved against the
workspace root (default artifacts/, i.e. <workspace>/artifacts/) — never
against this skill's own directory. Never write beside this skill's own script:
.wayland-core/skills/ is a hidden engine directory the Workbench does not show,
so a brief written there exists and is invisible. Never write into a git
repository.
Reading the result — this part matters
Check the exit code, and check the NO DATA line. A run where Yahoo rate
limits or blocks produces a complete, well-formed, entirely empty report:
every symbol listed under NO DATA, every table empty, and it looks fine. The
Python original returned success in exactly that case. This version exits
non-zero when every scanned symbol failed — but a partial failure still exits
zero, so read the NO DATA count and say it out loud to the user rather than
presenting an empty brief as if it were a quiet market.
If the report says "0 names scanned", something is broken. Say so plainly.
Things that will trip you up
--start takes YYYY-MM-DD. --end takes YYYYMMDD. They are different
formats in the same CLI, inherited from the original; --end in the wrong
shape used to produce a confident empty report.
- There is no market-calendar awareness. Run on a Saturday and it reprints
Friday's bar. The masthead carries both the bar date and the build date for
exactly this reason — quote the bar date to the user, not today's.
- The cache grows by roughly one file per symbol per day, because the cache key
includes the end date. Prune it.
- Entries and exits happen at the CLOSE of the bar that signalled them, so the
report describes a decision to act on at the next open. Do not describe it as
a live signal.
Scheduling it
This is a good candidate for a daily routine. It needs no chart, no browser and
no API key or login, so it runs unattended. Offer it; do not enable it without
asking.