This document owns cross-script validation, lifecycle checks, and the manual
matrix for scripts that do not have a more specialized development manual. The
orderbook browser/CDP matrix is owned by
docs/binance-orderbook-trade-ui-automation.md; Strategy 27 rendering is owned
by docs/binance-strategy27-events-development.md; Brooks/m3u8 behavior is owned
by docs/brooks-media-sync-workflow.md. Release and remote-publish mutations
are owned by skills/userscript-release/SKILL.md.
The eight-script performance audit, operation-count baselines, and reproduction
commands are recorded in docs/userscript-performance-review.md.
The later Binance multi-tab investigation, live observations and request/marker/
depth changes are recorded in Binance Multi-tab Performance Review.
The behavioral test rules, reviewed fake contracts, virtual-time boundaries, and explicit migration inventory are owned by Behavioral Test Policy. Use Affected Test Selection for dependency-based local and CI selection, and Source Coverage for the complete-source coverage scope, threshold policy, and report interpretation.
| Script | Editable source | Artifact | Focused checks | Detailed guide |
|---|---|---|---|---|
| Binance Strategy 29 Bollinger | src/binance-strategy29-bollinger/ |
scripts/binance-strategy29-bollinger.user.js |
npm run test:binance-strategy29-bollinger, npm run build:binance-strategy29-bollinger, npm run check:binance-strategy29-bollinger |
docs/binance-strategy29-bollinger-development.md |
| Binance orderbook trade | src/binance-orderbook-trade/ |
scripts/binance-orderbook-trade.user.js |
npm run test:binance-orderbook-trade, npm run build:binance-orderbook-trade, npm run check:binance-orderbook-trade |
docs/binance-orderbook-trade-development.md and docs/binance-orderbook-trade-ui-automation.md |
| Binance trading data | src/binance-trading-data/ |
scripts/binance-trading-data.user.js |
node --test test/unit/binance-data-panel-*.test.js, npm run build:binance-trading-data, node --check scripts/binance-trading-data.user.js |
this document |
| Binance CoinMarketCap data | src/binance-coinmarketcap-data/ |
scripts/binance-coinmarketcap-data.user.js |
node --test test/unit/binance-data-panel-*.test.js, npm run build:binance-coinmarketcap-data, node --check scripts/binance-coinmarketcap-data.user.js |
this document |
| Binance Strategy 27 events | src/binance-strategy27-events/ |
scripts/binance-strategy27-events.user.js |
npm run test:binance-strategy27-events, npm run build:binance-strategy27-events, npm run check:binance-userscripts |
docs/binance-strategy27-events-development.md |
| m3u8 downloader | src/m3u8-downloader/ |
scripts/m3u8-downloader.user.js |
node --test test/unit/m3u8-downloader-course-export.test.js, npm run build:m3u8-downloader, npm run check:m3u8-downloader |
docs/brooks-media-sync-workflow.md |
| Shared Binance route/lifecycle helpers | src/shared/ |
every affected generated artifact | affected unit tests, npm run build:binance-userscripts, node --check on affected artifacts |
this document plus the affected script guide |
| Auto refresh | scripts/auto_refresh.user.js |
same file | node --test test/unit/auto-refresh.test.js, node --check scripts/auto_refresh.user.js |
this document |
| CoinMarketCap valuation helper | scripts/coinmarketcap-valuation-helper.user.js |
same file | node --check scripts/coinmarketcap-valuation-helper.user.js |
this document |
Use the affected checks during implementation and commit/push preparation.
skills/userscript-release/SKILL.md owns the full-suite release gate and reuse of
passing local results for unchanged inputs. A focused check establishes only its
tested layer; it does not replace an affected build, generated-artifact comparison,
or required live validation step.
The default suite runs all test/unit/**/*.test.js and test/dom/**/*.test.js
files. Scripts under test/manual/ are explicit manual probes and previews;
they are not automatically executed by the test runner.
Test changes also run npm run lint:tests. npm run test:affected -- --list
explains the selected Node and browser files before execution. The scheduled
Userscript Tests workflow runs the complete Node and browser coverage pipeline;
ordinary PR and main-push runs select tests using an explicit Git base. Existing
script-specific workflows retain their independent checks. All three workflows
read the Node version from .nvmrc.
- A migrated script is edited under
src/; its generated artifact is rebuilt and inspected after behavior changes. An unmigrated script is edited in itsscripts/*.user.jsfile and checked directly. - Route and symbol identity come from the documented pathname/route contract. Do not infer a symbol from a page title, stale DOM, or a neighboring panel.
- The shared route parser activates scripts only for
/[locale/]futures/<asset>USDTand<asset>USDCperpetual routes, with an optional trailing slash. The asset must be nonempty; Unicode letters, numbers, and underscores retain their exchange identity. This is the scripts' supported route syntax, not a live exchange listing check. Individual strategies retain their narrower USDT market and timeframe requirements. Other quote assets, dated contracts, landing pages,home,quiz, multi-chart pages, calculators, and wallet routes do not activate panels or business requests. Keep the broad metadata match and lightweight route watcher so SPA navigation from a landing page can activate a supported contract and remove it on return. - Binance identifiers share the Unicode letter/number/underscore character
contract in
src/shared/binance-symbol.js. Include Chinese, one-character, numeric-only, and numeric-prefixed assets when validating route, depth, order scope, and available-balance parsing. Canonical gateway symbols retain the separate exact server contract insrc/shared/canonical-symbol.js. - Async work must carry the symbol, route, and lifecycle identity that started it. A route change, symbol change, panel close, or page teardown invalidates work before its result can render or update shared state. Follow each script's visibility contract: the two data panels below retain an activated session while hidden; visibility alone does not invalidate its requests.
- Both data panels cancel business requests and timers on
pagehide. A BFCachepageshowrestores a previously activated route watcher and starts one new current-route session, including when that activated page remains hidden. Visibility events during suspension and repeatedpageshowevents cannot duplicate initialization. A never-visited hidden page still waits for its first visible activation, and a closed panel stays closed after restoration. - Timer, observer, drag, and unload listeners are part of the lifecycle. Stop business work when its route or panel is inactive, remove listeners when the panel is removed, and keep only the route watcher needed to discover a future matching route.
- Cache, snapshot, fallback, and neutral values retain their provenance. A cached or partial result must not be presented as current data or counted as a fresh directional vote.
- Errors keep the observed HTTP, parse, mapping, or contract reason. Do not turn an unknown or ambiguous upstream result into a guessed default.
The trading-data and CoinMarketCap panels store independent {left, top}
preferences. Only a completed primary-button drag that changes the displayed
position writes that panel's preference. Creating, resizing, reloading, or
closing a page must not save its temporary viewport adjustment or overwrite a
position saved by another tab. Header clicks and collapse controls do not save
coordinates. A drag interrupted by resize, window blur, or a move with the
primary button already released is canceled without saving.
For every resize, project the saved preference into the current viewport while keeping the header reachable. Enlarging the viewport restores the saved coordinates. Trading is 320 px wide and CMC is 336 px wide, limited by the viewport. Without a saved preference, one panel uses the right edge with a 16 px margin and a 60 px top offset. When both are present, viewports at least 704 px wide place them side by side, with CMC to the left of trading and a 16 px gap. Smaller viewports split the available height into two scrollable panels with 8 px outer margins and an 8 px vertical gap. These defaults are never persisted. Saved positions remain authoritative, even when a user's chosen positions overlap; an overwritten earlier position cannot be reconstructed.
src/shared/data-panel-layout.js owns this presentation calculation. Mount,
close, and removal notify the other panel through the local
jh-data-panels-layout-change event. Reflow cancels an active drag before
projecting coordinates, so an automatic move cannot become a saved drag when the
mouse is released. The event only reflows existing panels; it does not start
business work or broadcast again. Close and removal clean up the listener.
Completing a real drag saves once and recalculates the available body height.
e2e/binance-orderbook/specs/data-panel-position.pw.js covers this contract with
the generated scripts, real browser geometry, native storage, and isolated data
providers. JSDOM lifecycle tests do not establish viewport geometry.
Both panels use the existing pathname locale contract: /zh-CN/ selects Chinese;
English and other supported routes select English. Names, controls, explanations,
status text, number units, and time formatting change together. Ordinary ratios
and percentages use two decimal places; funding percentages and small token
prices retain enough significant digits to distinguish nonzero values from zero.
The panel runs only on an actual Binance futures trading route. It derives the symbol from the shared route parser and aligns five-minute data to Binance server time. An initially hidden document waits for its first visible activation. Once activated, hiding the tab retains the same route session, in-flight requests, data, and historical schedule. Closing the panel or leaving a trading route stops the business loop. The route watcher remains active off-route and while hidden so a later SPA transition can start a new session; old-symbol and old-path responses cannot publish into that session.
Current funding refreshes 15 seconds after request completion in the foreground and 60 seconds after completion in the background. Successful and failed requests both establish this deadline; the displayed receipt timestamp changes only on success. Visibility changes recalculate the deadline from that same completion time, never restart initialization or overlap an existing request. Returning to an overdue quote schedules one refresh while retaining its existing value and provenance. An active session includes calibration and initial requests that are still pending.
Historical data retains its five-minute boundaries, five-second first delay, 10/15/20/30-second retry schedule, and hourly server calibration while hidden. A delayed timer starts only the latest publication window. Initial and periodic responses that arrive after their own five-minute window expires are discarded before updating values, votes, or the receipt timestamp; the current window is then scheduled once. Browser timer throttling can delay these requests, and a frozen or discarded page cannot execute JavaScript until resumed or reloaded.
The one-second age display retains its footer elements and updates only changed text. It pauses while hidden and updates immediately on return, including removal of a current funding quote whose settlement has expired. It does not recreate the timestamp row or alter the historical data-fetch schedule.
Each period fetch records which endpoint produced fresh data and which endpoint used a cached value or has no value. Fresh and cached indicators remain distinct when the panel computes directional votes. A stale request must not render into a newer symbol or lifecycle epoch. 4xx parameter/authentication failures are not treated as transient network failures; any recovery behavior must remain explicit in the source contract.
The table has metric, historical trend, and value columns. Names follow the approved Binance data-page terminology. Each chart uses the observations' actual timestamps, rather than equally spaced synthetic timestamps. Missing observations break the line. One observation is a point, and an empty series stays unavailable. Taker activity uses separate buy and sell volume bars; its numeric field is clearly labelled as the buy/sell ratio. Click or focus a chart to inspect its values and dated observations; arrow keys select points and Escape closes the detail.
Compact rows use 4 px padding and 26 px charts, with 2 px horizontal padding
around each trend. The name column uses 40% of the table, with 30% each for trends
and values. Five-minute sampling and settled funding
history remain distinct; individual observation counts appear in the opened
history detail. The funding row also retains its settled-history caption, last
settled value, current rate, confirmed interval, and countdown. The composite heading opens the voting rules
with native details/summary; its current open state survives display refreshes.
Body text remains 13 px on desktop and annotations remain at least 11 px.
All Binance requests use the existing https://www.binance.com origin:
| Display | Endpoint | Source fields |
|---|---|---|
| Open interest | /futures/data/openInterestHist |
timestamp, sumOpenInterest |
| Top trader account ratio | /futures/data/topLongShortAccountRatio |
timestamp, longShortRatio |
| Top trader position ratio | /futures/data/topLongShortPositionRatio |
timestamp, longShortRatio |
| Global account ratio | /futures/data/globalLongShortAccountRatio |
timestamp, longShortRatio |
| Taker volume and buy/sell ratio | /futures/data/takerlongshortRatio |
timestamp, buyVol, sellVol, buySellRatio |
| Basis rate | /futures/data/basis |
timestamp, basisRate; requests use pair and contractType=PERPETUAL |
| Settled funding history | /fapi/v1/fundingRate |
fundingTime, fundingRate; up to 40 settlements |
| Current funding and next settlement | /fapi/v1/premiumIndex |
symbol, lastFundingRate, time, nextFundingTime |
| Current settlement interval | /fapi/v1/fundingInfo |
the unique matching symbol and fundingIntervalHours |
The six five-minute series retain period=5m, limit=30, the publication grace
period, and the existing delayed-publication retry schedule. History parsing
requires finite numeric values and increasing timestamps. Malformed values do
not become zero or fresh votes. The open-interest-to-market-cap row divides
sumOpenInterest by CMCCirculatingSupply in the same contract base unit; it does
not apply another multiplier to 1000-token contracts.
The single funding row combines the last settled rate and its historical chart with the separate current rate, interval, and countdown. Only the settled value participates in the existing simplified funding vote. Current funding follows the visibility cadence above, with a 10-second request deadline. Interval metadata refreshes independently at activation and each full historical cycle, also with a 10-second deadline. It must never block a historical refresh. An absent metadata row means an unknown interval, not an assumed eight hours.
Requests and responses retain session, path, and symbol ownership. Changing
routes, closing, or pagehide aborts the seven historical requests as well as the
current-rate, interval, and clock requests. One route-session controller owns
history; the other three request types retain their independent controllers and
deadlines. Lifecycle cancellation starts no network retry and is not recorded as
an endpoint failure or cached result. Superseded responses cannot publish.
A failed current refresh can retain an actual
previous quote with a visible cache/error label. A first failure without data is
labelled unavailable rather than cached. Metadata cache status is independent.
Server-clock requests have a five-second deadline. Samples whose round trip exceeds two seconds are rejected; accepted samples use the request/response midpoint to estimate offset. The countdown states when calibration is unavailable. At the supplied settlement time it shows waiting for update and withdraws the old current quote until a new authoritative next settlement arrives. The one-second display timer updates existing value/status nodes. Current and clock updates do not recreate historical charts or reset the history footer's receipt timestamp.
test/unit/binance-trading-data-market.test.js retains numeric samples observed
at 2026-10-09T07:16:15Z: STRK current funding was 0.00005000, while the latest
settled rate was 0.00000029 at 1791518400000; the next settlement was
1791532800000, with a reported four-hour interval. These are dated fixture
values, not current quotes. A 1000PEPE sample had OI 17073744019 and Binance CMC
supply 413772355107.944; CMC's underlying PEPE supply was
413772355107943.94. Their ratio requires no additional 1000 multiplier and
displays 4.13%.
Public GETs on the scripts' actual www.binance.com origin were also checked at
2026-10-09T09:05:25Z: premiumIndex?symbol=STRKUSDT and fundingInfo both
returned HTTP 200, and STRK's unique interval row reported four hours. Protocol
reference: official Binance market-data SDK.
SDK titles establish API meaning, not exact website text. The approved English
labels still need a verbatim check against the live native data page; that visual
check and installed Tampermonkey verification are separate from offline tests.
The panel runs only on a matching futures route and resolves the current Binance
base asset to one deterministic CoinMarketCap asset. Missing or ambiguous
mapping results remain visible failures; the panel must not select an arbitrary
same-symbol asset. API and page-snapshot data are labeled by their actual source
and timestamp, and a failed refresh must not overwrite a newer symbol's panel.
The existing 1000 and 1000000 multiplier mapping recognizes Unicode letters
as the start of an asset name; numeric-only names such as 4 retain their digits.
Route changes, panel close, and panel removal invalidate the refresh epoch and clean up business timers. Responses belong to the complete pathname as well as the symbol, so even a same-symbol language change starts a new session. A route watcher remains to detect later matching pages, including transitions while hidden; it does not run business requests off-route or after close.
Each refresh owns one cancellation signal across the map, detail, page-snapshot,
and holder requests. Route changes, close, pagehide, and a superseding manual
Refresh abort the current GM request. Every terminal transport callback removes
its abort listener. Cancellation ends the chain without a page fallback or holder
lookup; stage boundaries also reject an already-changed pathname before the route
watchdog runs. Existing provider failures retain their documented fallback and
20-second transport timeout.
An initially hidden document waits until first visited. An activated panel keeps its data, expanded interpretation, pending requests, and session when hidden. Automatic refresh uses one timeout: 30 seconds after the last completed attempt in the foreground and five minutes in the background. Failed attempts also set the deadline without claiming a successful fetch. Returning before that deadline makes no request; returning after the foreground deadline silently refreshes once without replacing the table with Loading. Visibility cannot duplicate an in-flight refresh or reset its timing anchor. A manual Refresh keeps its explicit superseding-request behavior. Browser throttling or freezing can delay the schedule; missed intervals are not replayed.
The CMC table has metric, value, and interpretation columns, with expandable definitions. A short name and separate qualifier identify each ratio's numerator, denominator, period, and unit. The display uses CMC-reported turnover and liquidity ratios rather than recomputing them from potentially asynchronous fields. FDV's comparison is the snapshot's FDV divided by circulating market cap; supply share uses circulating divided by total supply. Missing or non-positive comparison denominators do not produce a ratio. Null, empty, or invalid provider numbers stay unavailable, while genuine zero stays zero. Treasury holdings retain their token unit and cannot become a holder-address count.
Compact rows use 3 px horizontal padding and keep their brief interpretation visible. The interpretation header and text are right-aligned. Both panel footers contain only source or update timestamps; refresh and sampling notes are omitted. Secondary notes are in the interpretation button's tooltip and expanded explanation, and token units share the value line when space allows. Automatic table layout reserves the complete width of a small token price or 24-hour change before wrapping prose; browser checks compare text ranges against their own cells as well as overall overflow. Body text remains 12 px on desktop and annotations remain at least 11 px. The generated-panel browser scenarios require both default panels, all metric rows, and both footers to fit a 1366-by-768 desktop without scrolling in Chinese and English. Narrow screens retain separate scroll areas and no horizontal overflow.
Interpretations describe what the value supports. The volume ratio's 50% threshold is explicitly a descriptive convention, not a statistical anomaly or trading signal. Valuation comparisons need peers, volume changes need history, DEX liquidity is not Binance order-book depth, and profile disclosure scores do not establish project safety. The refresh schedule, mapping rules, source timestamps, and API/page-snapshot provenance remain separate from presentation.
For a browser-openable offline implementation preview, run
node e2e/binance-orderbook/helpers/data-panels-preview.mjs after the two builds
and open output/data-panels-preview/index.html with a file:// URL. The generator
embeds unchanged generated artifacts and labelled example data. It supports both
languages, light/dark themes, and each panel separately, without external network
requests. It is not live Binance or Tampermonkey evidence.
Trading-data 1.2.4 and CMC-data 0.2.4 passed 40 focused cancellation scenarios
and 14 host-boundary tests on Node 24.16.0, alongside the existing response,
background, lifecycle, and funding checks. The controlled history request count
remains 7 -> 7 -> 7 through BTC/ETH/SOL navigation and reaches zero after leaving
futures. Queued failures cannot start off-route retries. CMC checks cover all four
pipeline stages, every GM terminal callback's listener cleanup, manual
supersession, and pathname changes that precede the route watchdog.
Simulated BFCache checks verify one restored session and its normal subsequent
refresh, preserved hidden-page activation rules, and a closed panel that stays
closed. Both builds, generated syntax and metadata checks, changed-test lint, and
git diff --check passed. These are deterministic request and DOM checks, not CPU
or memory measurements. They do not establish real Chrome BFCache, installed
Tampermonkey behavior, or live Binance/CMC responses. Rendered fixture checks and
aggregate results are recorded in the
multi-tab performance review.
Trading-data 1.2.3 and CMC-data 0.2.3 passed all 2548 Node tests and all 41
generated-panel browser scenarios. Both builds, generated syntax and metadata
checks, test lint, and git diff --check passed. The laptop scenarios verify
320 px trading and 336 px CMC panels, complete data rows, a right-aligned CMC
interpretation column, and timestamp-only footers in both languages, including
three-digit daily changes.
Small prices remain inside their value cells, and resized or reopened panels
retain the original saved position preferences.
The four offline preview combinations were rendered and checked without external requests, panel overlap, or horizontal overflow. Desktop body text remains 13 px for trading and 12 px for CMC; annotations remain at least 11 px. Real Binance pages and the installed Tampermonkey scripts were not operated.
Trading-data 1.2.2 and CMC-data 0.2.2 passed the full 2548-test Node suite,
including 23 focused background-lifecycle scenarios, and all 41 generated-panel
browser scenarios. Both builds, generated syntax and release metadata checks,
test lint, and git diff --check passed. The browser checks cover simulated
visibility and suspended animation frames; the rendered English panels were
inspected with both historical and CMC interpretation details kept open.
The controlled host verifies that ten quick returns preserve the same rows and initial request batch, without postponing the original foreground deadline. Other checks cover background cadence, request completion while hidden, failure cooldowns, late initial/cycle responses, full-path ownership when the host replaces its history methods, clock continuity, and settlement expiry on return. These are deterministic request and UI checks, not CPU or memory measurements. Current Chrome timer throttling, freezing or discarding, Tampermonkey installation, and live Binance responses remain untested.
Trading-data 1.2.1 and CMC-data 0.2.1 passed the full 2528-test Node suite,
all 39 panel browser scenarios, both builds, generated syntax checks, test lint,
metadata/install URL checks, and independent source review. Six new browser
scenarios verify complete default panels on a 1366-by-768 screen and precise
small prices staying inside their value cells at 1366/320 px in both languages.
Resize scenarios wait for browser rendering frames before reading geometry.
At the same 1600-by-1056 preview viewport, the Chinese trading panel decreased from approximately 897 to 500 px high and CMC from 779 to 567 px. English heights decreased from 913 to 534 px and 826 to 618 px. Both widths were 384 px, with unchanged 13/12 px desktop body text and a minimum 11 px annotation size. The four preview combinations again have no panel overlap, horizontal overflow, page errors, or external HTTP requests. These are offline rendering results; the installed Tampermonkey scripts and live Binance pages were not operated.
The trading-data 1.2.0 and CMC-data 0.2.0 implementations passed independent
source review, both builds, generated syntax checks, test lint, metadata/install
URL checks, and exact preview-to-artifact comparison. Full npm test passed
2501 tests. The four rendered preview combinations cover Chinese/English,
light/dark themes, desktop, and 390/320 px widths; they have no default panel
overlap, horizontal overflow, page errors, or external HTTP requests.
Full npm run test:ui passed 605 of 606 cases, including all 33 data-panel
position/presentation cases. The remaining failure is in
active-ladder-context-behavior.pw.js, before its saved-order-count change:
the existing pauseScenarioClock reads page time and then calls
pauseAt(pageNow + 100) across process boundaries. The recorded delay exceeded
that margin, producing Cannot fast-forward to the past. The scenario, helper,
fixture, orderbook artifact, and package inputs match the unchanged base commit
6b0f788e; this is an outstanding browser-test timing failure, not a passed
scenario. Live native-page comparison and Tampermonkey installation remain
unverified, including verbatim English labels.
auto_refresh.user.js is intentionally narrow:
- a non-matching URL performs no work;
- a matching URL schedules the configured target time without moving an already missed target to the next day merely because the window regains focus;
- manual reload, focus, visibility, and repeated scheduling preserve the next target-time semantics;
- the script does not add a second interval or reload unrelated pages.
Run the smallest affected set and record each path as tested or untested. Do not claim live behavior from source inspection alone.
- Place the two panels separately, shrink the window, and enlarge it again; both return to their saved positions without rewriting the position keys.
- Open or reload a small second window and close it; the original saved positions remain available in a larger window.
- Drag a panel in one tab, then close an older tab; reopening uses the newer position.
- Click the header or collapse control without dragging; only the collapse preference may change. Complete a drag; only that panel's position is saved.
- Interrupt a drag by resizing, switching window focus, or releasing the mouse outside the document; later movement cannot continue or save the old drag.
- Mount or close the other panel while the header is held without movement; releasing it must not save the resulting automatic layout.
- Check both installation orders, a single panel, and both panels at desktop and narrow widths. Defaults must not cover each other or write position preferences.
- Collapse, drag to a lower position, and expand; content scrolls inside the remaining height without an extra position write.
- Switch symbols while a fetch is pending; old results must not appear under the new symbol. Each superseded historical batch must be cancelled, leaving only the current seven requests pending; leaving futures must leave none and must not start an immediate retry from an already-queued failure.
- Open near a five-minute boundary and verify the current period is fetched after the server-time boundary rather than skipped.
- Switch tabs repeatedly within 15 seconds; retain the same rows, current quote, and history timestamp without new calibration or history requests. Once current funding is overdue, returning requests it once without clearing the old value.
- Keep the initialized tab hidden: funding refreshes at 60-second completion intervals, history retains its five-minute schedule, and hourly calibration continues. The second-by-second display stops and catches up immediately on return, including a settlement boundary crossed while hidden.
- Delay browser callbacks or pending history across several publication windows; process only the latest window after its five-second delay. A late initial or cycle response cannot appear as freshly received current-period data.
- Close the panel and verify background polling does not restart it.
- Simulate a partial endpoint failure; cached rows are marked as cached and are excluded from directional vote totals while missing rows remain explicit.
- Navigate from a non-trading route to a futures route and back; only the matching route owns a panel and active business loop.
- Switch Chinese/English routes and themes; inspect metric names, ratio units, controls, errors, timestamps, and keyboard chart details in both languages.
- Compare current funding with the native top-of-page quote and settled points with the native data chart at matching times. Check the reported interval and countdown, including settlement expiry, unavailable metadata, and calibration failure. Do not compare quotes captured at different times as equal snapshots.
- Delay or fail the current funding and interval endpoints; history must still render. Current-only refreshes must preserve the historical chart and footer.
- Check a tiny nonzero settled rate, genuine zero, missing data, and a 1000-token contract; none may acquire a fabricated zero, interval, or multiplier.
- Switch symbols during a map, detail, page, or holder fetch; the superseded request must be cancelled and must not initiate the next stage.
- Exercise a known mapping, a missing mapping, and an ambiguous mapping; only the known mapping renders data.
- Verify the displayed source and update time distinguish a page snapshot from a data API response.
- Hide the tab while a refresh is pending; its current-symbol response still renders and a quick return causes no duplicate request or Loading state.
- Keep the tab hidden through a five-minute refresh, then return; only an overdue foreground snapshot triggers one silent refresh. Repeated returns after errors must respect the completion-based cooldown.
- Close or leave the route while a refresh is pending; no stale render or timer survives removal, and visibility events cannot reopen a closed panel.
- For either panel, leave a page with pending requests and restore it through
browser back/forward navigation. Verify
pagehidecancels the transports and BFCachepageshowstarts one current session, followed by the normal refresh schedule. Repeated visibility/restore events and restoration of a closed panel must not start extra work. - Navigate between matching and non-matching Binance routes and verify the route watcher does not leave a business loop running off-route.
- Expand interpretations for FDV, volume/cap, liquidity/cap, supply, holders, and profile score; their stated bases must agree with the displayed data.
- Check partial/missing fields and very small token prices in both languages; unavailable values and genuine zero must remain distinguishable.
- Matching URL: the configured target causes one reload at the intended time.
- Non-matching URL: no timer or reload is installed.
- Regain focus after the target time: the page reloads instead of silently postponing the target to tomorrow.
- Manual reload and visibility/focus changes leave the next target calculation correct and do not create duplicate intervals.
- After each migrated-source build, compare the generated metadata, version, install URLs, and source identity with the editable source.
- Run
git diff --checkand report failures rather than retrying until a green result appears. - State live/browser paths that were not exercised, and keep account, order, cookie, and private-site evidence out of repository artifacts.
Start with this document for trading-data, CoinMarketCap-data, auto-refresh, or cross-script lifecycle work. Then read the specialized manual named in the script matrix when the change crosses into orderbook UI/CDP, Strategy 27 chart rendering, Brooks media export, or release/publish behavior.