319 Commits
Author SHA1 Message Date
Haozhe Wu f3d8cf1f44 docs(readme): add #1517 to the 2026-09-22 news and CHANGELOG 2026-09-22 02:22:52 +08:00
Haozhe Wu f9355d6feb docs(readme): 2026-09-22 news in seven languages, and CHANGELOG 2026-09-22 02:13:52 +08:00
Haozhe Wu 0285acdcf5 docs(readme): 2026-09-21 news in seven languages
Channel configuration from the Web UI (#1520, #1529), the missing-bar alpha
class, the data-tool fixes, Indonesian, and the Requesty removal. The news
entry #1520 carried for 2026-09-20 is folded into it; three entries stay
visible in every README, README_id.md included.
2026-09-21 20:39:53 +08:00
Haozhe Wu 051aeb5509 refactor(providers): remove the Requesty built-in provider
Requesty (added in #474) is an OpenAI-compatible gateway whose capabilities
were a copy of OpenRouter's: same provider/model naming, same
extra_body.reasoning opt-in, no adapter code of its own. Built-in slots are
kept for providers with their own behaviour; a gateway that speaks an
existing wire format is configured through that provider, and #1532 (API
Route) is being closed on the same grounds.

Migration, identical request shape: LANGCHAIN_PROVIDER=openrouter,
OPENROUTER_BASE_URL=https://router.requesty.ai/v1, OPENROUTER_API_KEY=<the
Requesty key>. Past news and contributor credits in the READMEs are left
as history; the supported-provider lists drop it.
2026-09-21 20:35:37 +08:00
Haozhe Wu ed0751809f Merge PR #1529: feat(channels): QQ web configuration with connection test and guided setup 2026-09-21 20:31:28 +08:00
Haozhe Wu 1bf0bd62d4 Merge PR #1520: feat(channels): web-based channel configuration with connection test and hot apply
# Conflicts:
#	frontend/src/pages/Settings.tsx
2026-09-21 20:31:27 +08:00
Haozhe Wu ead3f2e74c fix(gildata): READMEs, order fixtures and token text for the new loader (#1474)
The PR's CI failed on its own changes: the seven README loader tree lines
still said 27 sources without gildata, and two tests pinned a seven-source
A-share order that stops validating once gildata joins the chain.
README_id.md, which landed after the PR's base, also gets the source-table
row, the count and the chain. The loader docstring and CHANGELOG still said
the token rides the URL query string; since the review it is sent in the
Authorization header.
2026-09-21 20:31:02 +08:00
Haozhe Wu e6095d5209 Merge PR #1474: feat(data): Gildata (恒生聚源) A-share OHLCV loader via the raw-api MCP endpoint 2026-09-21 20:29:34 +08:00
shadowinlife b851738741 docs(readme): QQ joins the guided web-config channels
One sentence per README in the existing "Configure from the Web UI"
paragraph: register a bot on the QQ Open Platform (q.qq.com), copy
AppID/AppSecret into the form, verify with Test connection before
saving, then enable - no public callback URL needed (WebSocket via the
official botpy SDK). The DingTalk "first fully-guided channel"
sentence stays; news entries are historical and untouched.

Part of #1519.

Signed-off-by: shadowinlife <shadowinlife@gmail.com>
2026-09-21 12:22:05 +08:00
shadowinlife 90fb39a4f4 docs(readme): add web channel-config news entry in six languages
User-facing features of this size land a dated News bullet per repo
convention; the branch only carried the "Configure from the Web UI"
subsection. Add the 2026-09-20 entry (validate-before-save, masked
secrets, connection test, per-channel hot apply, DingTalk guided
setup) to all six READMEs, and note in the subsection that only
built-in adapters are listed — entry-points plugin channels remain
file-configured. Dated news bullets are excluded from the
test_readme_counts anchors, which stay green.

Part of #1519.

Signed-off-by: shadowinlife <shadowinlife@gmail.com>
2026-09-20 15:26:59 +08:00
Yoruxyv a902b0a143 feat(i18n): add Indonesian localization
Signed-off-by: Yoruxyv <hansvalerie19@gmail.com>
2026-09-20 10:56:54 +07:00
shadowinlife 634a9de733 docs(readme): document web-based IM channel configuration in six languages
Add a 'Configure from the Web UI' subsection to the IM channels section of
all six READMEs: expandable per-channel panel, DingTalk Stream Mode setup
guide, credential probing before save, immediate hot-apply enable/disable,
masked secrets, and the JSON-only editing constraint.

Part of #1519.

Signed-off-by: shadowinlife <shadowinlife@gmail.com>
2026-09-20 11:31:31 +08:00
Haozhe Wu b705d188b0 docs(readme): add September 20 fixes in six languages 2026-09-20 01:09:55 +08:00
Haozhe Wu 2dfbc03dd6 docs(readme): add September 19 data reliability news in six languages 2026-09-19 16:41:45 +08:00
shadowinlife 70bea5b164 feat(tools): get_southbound_flow — the only live Stock-Connect net-flow signal
Southbound (mainland → HK) is the half of Stock Connect whose daily net
buy is still officially disclosed: HKEX publishes per-channel Buy/Sell
Turnover every trading day, and Eastmoney's datacenter series
cross-checks against it exactly. The northbound net ended 2024-08-30
(#1481), which leaves southbound as the only live net-flow signal — and
its tool surface was missing: the hk-connect-flow skill's southbound
methodology could only point at hand-written tushare code whose
southbound fields (ggt_ss/ggt_sz/south_money) have themselves drifted
to cumulative net-bought stock (#1483).

- southbound_tool.py: get_southbound_flow, mirroring the northbound
  envelope. Primary: Eastmoney datacenter RPT_MUTUAL_DEAL_HISTORY
  (MUTUAL_TYPE 002/004) via the shared throttled client, NET_DEAL_AMT
  in 100M HKD. Fallback: the keyless HKEX official daily-statistics
  report (latest trading day, net = Buy − Sell, million → 100M HKD),
  walking back a week past 404s. No tushare path; the envelope note
  says why.
- mcp_server.py: hand-written wrapper (Surfaces 75) + family docstring.
- agent/SKILL.md: manifest heading 74→75 + tool table row.
- hk-connect-flow SKILL.md: Data Access gains the tool route and a
  caveat that tushare's southbound fields are cumulative stock.
- six READMEs: MCP tool list + counts (74→75), repo-tree agent-tool
  count (107→108), MCP prose counts — all six locales.
- tests: 12 cases — merged envelope, trim/clamp, one-channel-missing,
  HKEX fallback triggers (failure + empty rows), 404 walk-back,
  both-down error, a decoy top-10-table regression pinning the live
  HKEX payload shape, parser guards, metadata/description anchors.

Live-verified 2026-09-18: Eastmoney and HKEX agree to the cent on
2026-09-15/16/17 (e.g. 09-17 港股通沪 net 25.0239亿 == HKEX Buy
26,387.65M − Sell 23,885.26M HKD); an incidental live EM SSL failure
exercised the HKEX fallback end to end with identical figures.

Closes #1483

Signed-off-by: shadowinlife <shadowinlife@gmail.com>
2026-09-18 17:18:36 +08:00
sambazhu fd6f07b1e8 feat(tools): three Gildata research tools over the srv-tool NL endpoint
get_cn_macro_series (MacroIndustryData: China macro/regional/industry EDB
— FRED only covered US/global until now), get_cn_announcements
(AnnouncementData: A-share/HK/fund filings with highlighted excerpts —
get_sec_filings covers SEC only) and search_broker_reports
(FinancialResearchReport: the Juyuan report library, coexisting with the
eastmoney-backed get_research_reports). One thin shared client
(gildata_srv.py: JSON-RPC POST + format=json, own throttle bucket, dual
Accept header), routed api_names echoed so a mis-routed NL question is
visible to the agent, rows capped via limit, key-gated on GILDATA_TOKEN
with an optional GILDATA_SRV_TOOL_URL override. News/screening/FinQuery
deliberately left to the existing tools. MCP surface 75 -> 78.
2026-09-18 17:06:57 +08:00
sambazhu 1620acef01 feat(tools): get_fund_nav — NAV history for Chinese off-exchange funds
Off-exchange funds publish daily NAV, not OHLCV, so this lands as an
agent tool instead of stretching the loader contract: NetFundUnitValueReport
behind the same ParamCandidateRecall + disk-cache machinery (new otc_fund
wiring). Serves unit/accumulated/adjusted NAV and daily growth, ascending,
most-recent limit, per-fund errors never abort the batch; exchange-listed
codes are rejected with a pointer to get_market_data. Key-gated on
GILDATA_TOKEN; exposed as MCP tool #75 (manifest + six-README lists).
2026-09-18 17:06:57 +08:00
sambazhu 20fc8541bb feat(data): gildata serves HK equities and CN indices via internal-code recall
HKStockDailyQuotes for 00700.HK-style symbols (raw bars, volume already in
shares, stamped raw as a per-market exception after measuring 00700.HK) and
IndexDailyQuote for exchange-specific CN index codes (000xxx.SH / 399xxx.SZ,
so 000001.SZ stays Ping An Bank). Both tools need a Juyuan internal code:
ParamCandidateRecall with an exact ref_code match, cached to
~/.vibe-trading/cache/gildata-codes.json so a symbol costs one round-trip
per machine. Joins the hk_equity chain tail. US equities excluded — this
token's US history is sparse before ~2022 (12 rows in 2020, 134 in 2021),
which would silently corrupt backtests.
2026-09-18 17:06:57 +08:00
Haozhe Wu e5f719567a docs(readme): extend the 2026-09-18 news entry with the day's second batch across six languages 2026-09-18 15:18:27 +08:00
sambazhu 4b48ed9f40 docs: gildata row in data-routing skill, all six READMEs, changelog
Source-count 27->28, table row, A-share chain line, and an Unreleased
changelog entry describing the loader's caliber and auth behavior.
2026-09-18 13:27:39 +08:00
Haozhe Wu d3c29488ab docs(readme): add the 2026-09-18 news entry across six languages 2026-09-18 02:18:17 +08:00
Haozhe Wu a08ee2e467 docs(readme): add the 2026-09-17 news entry across six languages 2026-09-18 00:07:16 +08:00
Haozhe Wu 1b888f8c3f feat(robinhood): read-only portfolio source and account-bound live trading (#1428, #1442)
One Robinhood login reaches several accounts, and every account-scoped tool
takes account_number. Nothing sent one, and every consumer read the reply one
level too shallow (data.positions where Robinhood nests data.data.positions),
so the portfolio could not use Robinhood and the live runner and pre-trade gate
failed closed on every read.

Shapes: one module, connectors/robinhood/mcp.py, reads every Robinhood reply,
built only from the shapes posted on #1428 (observed get_accounts and
get_portfolio, advertised get_equity_positions outputSchema). A non-empty
data.next, a null list or item, or an unmapped data key is an error, never a
shorter account.

Portfolio (#1428): robinhood-live-mcp-readonly shares the MCP server and
OAuth grant. A connection instance carries account_ref, chosen from
get_accounts through the API, the CLI (connector select-account, setup
--account) or the connection center, with nothing preselected. A source with
no account errors before any call. Positions stay unpriced, because the profile
declares no quotes.read. A non-zero or unreported options, crypto, futures,
event-contract, mutual-fund or fixed-income value fails the source.

Live (#1442): /mandate/commit requires an account for such a broker and checks
it against get_accounts (listed, not deactivated, agentic_allowed). The Web
confirm dialog and the CLI REPL ask the user to pick from GET /live/accounts,
and never take the account from the agent-written proposal. Runner reads and
submits, the ceiling fetch and the gate's reads resolve the mandate's account
on each call and unwrap through the same module. The gate refuses an unbound
mandate or an order naming another account, and prices held positions through
the order-notional quote path, failing closed per row.

Existing gate and runner tests encoded replies Robinhood never sends. They now
use tests/robinhood_mcp_helpers.py.
2026-09-17 21:33:20 +08:00
Haozhe Wu 902b45b36b docs(readme): add the 2026-09-16 news entry across six languages 2026-09-16 15:47:27 +08:00
Haozhe Wu a5b79422f9 docs(readme): add the 2026-09-15 news entry across six languages 2026-09-15 01:27:07 +08:00
Haozhe Wu 0828686fac docs(readme): add the 2026-09-14 news entry across six languages 2026-09-14 16:54:40 +08:00
Haozhe Wu 3213ab92dd Merge PR #1417 2026-09-14 16:51:54 +08:00
Haozhe Wu b11ae7379a chore(readme): KIS + Upbit + Toss make 17 broker connectors 2026-09-14 16:44:44 +08:00
Haozhe Wu 12f3f64e31 Merge PR #1409 2026-09-14 16:42:30 +08:00
Haozhe Wu d1430abc86 Merge PR #1408 2026-09-14 16:42:05 +08:00
Haozhe Wu 4e5649c870 Merge PR #1407 2026-09-14 16:35:36 +08:00
cgycorey df164d3a61 feat(trading): add a read-only Scalable Capital MCP connector
Scalable Capital's Agentic Investing MCP endpoint is registered read-only.
They publish no paper environment, so the tier is bounded-live behind the
mandate gate, and no built-in profile places orders.

- 29-name catalog pinned in connectors/scalable/classification.py (18 READ /
  11 WRITE; preview_* is WRITE on purpose, since its confirmation feeds
  submit_*), seeded allowlist = the READ names only, wildcard refused. A
  hand-enabled WRITE tool assembles gate-wrapped and is refused at the intent
  step, because no extractor is registered for this broker.
- The profile exposes quotes.read only. account.read / positions.read are
  withheld together with the portfolio compatibility tier: those two are
  exactly what is_portfolio_connection_profile requires, and nothing maps
  Scalable's holdings reply into the shared positions shape, so a refresh
  would store a complete snapshot holding zero positions. Add the pair back
  with the normalisation once a live tools/list settles the reply shape.
- The READ/WRITE name sets in the tests are pinned literally rather than
  derived from the map, so a tool cannot be moved between classes (or seeded)
  without a test diff naming it.

Refs #1367.

Signed-off-by: cgycorey <cgycorey@users.noreply.github.com>
2026-09-13 19:17:01 +01:00
heonjinjeongandClaude Sonnet 5 044d46a0e9 feat(trading): add Toss Securities (토스증권) broker connector
Adds a new broker_sdk connector for Toss Securities KR/US equities via the
Toss Invest Open API (developers.tossinvest.com, launched 2026-05), OAuth2
client-credentials + requests only, no third-party SDK.

Per the tracker (HKUDS/Vibe-Trading#1367): no documented sandbox and no
account-response field distinguishing test from live were found in the
public docs (flagged there as lower-confidence than the Upbit/KIS reads,
since the docs render client-side and I could not get a maintainer-grade
read on every endpoint). Applying for API access itself requires a real
Toss Securities brokerage account, which points the same direction.
Following the Trading 212 precedent, this connector is therefore fully
read-only: place_order/cancel_order hard-refuse for every profile, paper
included, with the environment check as the first statement in each
function (same guard shape Trading 212 uses, verified by
test_paper_capped_connectors_refuse_live.py).

Also updates the anti-drift guards: toss added to _PAPER_CAPPED, portfolio
compatibility tier (experimental), broker count/table across all six locale
READMEs (14 -> 15 brokers), and the "brokers without paper trading" exceptions
paragraph now names Toss Securities alongside IBKR/Robinhood/Trading 212.

New agent/tests/test_sdk_connectors_toss.py covers profile registration, the
always-refuse guard (including the declared-paper case, since there is no
verified sandbox to simulate against), secret redaction, and service
dispatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYruJS2jFvSoi7DdWWuMvW
Signed-off-by: heonjinjeong <hj.jeong@okestro.com>
2026-09-13 21:18:20 +09:00
heonjinjeongandClaude Sonnet 5 7ff36917ae feat(trading): add Upbit broker connector
Adds a new broker_sdk connector for Upbit, Korea's largest KRW crypto
exchange, via its public JWT-signed REST API (requests + PyJWT only, no
third-party SDK).

Per the tracker (HKUDS/Vibe-Trading#1367): Upbit has no sandbox and no
runtime paper/live discriminator -- one access/secret key pair reads the
same account regardless of the declared profile. Following the
Longbridge/Dhan/Zerodha precedent, this ships paper (order placement
simulated locally against a live quote) + read-only live only; place_order
and cancel_order hard-refuse any non-paper config as the first statement in
each function, structurally -- not a flag checked later -- before any
network call, matching the pattern test_paper_capped_connectors_refuse_live.py
enforces for every capped broker.

Also updates the anti-drift guards: upbit added to _PAPER_CAPPED, portfolio
compatibility tier (experimental), broker count/table across all six locale
READMEs (14 -> 15 brokers).

New agent/tests/test_sdk_connectors_upbit.py covers profile registration,
the structural paper-only guard, a bug a code review caught before this PR
(a notional order returning a fabricated "ok" result with a null price/
quantity when the live-quote lookup failed -- now fails closed), secret
redaction, and service dispatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYruJS2jFvSoi7DdWWuMvW
Signed-off-by: heonjinjeong <hj.jeong@okestro.com>
2026-09-13 21:11:43 +09:00
Haozhe Wu e476b4ce4c docs(readme): add the 2026-09-13 news entry across six languages 2026-09-13 16:34:40 +08:00
Haozhe Wu ae2db70cfd docs(readme): add the 2026-09-12 news entry across six languages 2026-09-12 00:29:59 +08:00
heonjinjeongandClaude Sonnet 5 4a4aa12b01 feat(trading): add KIS (한국투자증권) broker connector
Adds a new broker_sdk connector for Korea Investment & Securities (KIS)
KOSPI/KOSDAQ equities via the official KIS Developers REST API.

Per the tracker (HKUDS/Vibe-Trading#1367): KIS has a genuine structural
paper/live discriminator confirmed against the docs — 모의투자 (paper) and
실전투자 (live) are reached through entirely separate hosts and ports
(openapivts.koreainvestment.com:29443 vs openapi.koreainvestment.com:9443),
each issuing its own OAuth2 client-credentials token. This ships paper (which
places real orders against KIS's own paper-trading server, not a local
simulation) + read-only live. It deliberately does not wire a mandate-gated
live-trade profile yet -- that would need a new AssetClass.KR_EQUITY in the
mandate model -- mirroring how Zerodha/Dhan/Shoonya shipped conservatively
for a first connector into a new market.

TR_ID transaction codes and response field names were sourced from the
official example repo (koreainvestment/open-trading-api) and public docs,
not verified against a live KIS account -- flagged in the tracker thread.

Also updates the anti-drift guards: kis added to _LIVE_CAPABLE (genuine
discriminator, unlike the paper-capped brokers), portfolio compatibility
tier (experimental), broker count/table across all six locale READMEs
(14 -> 15 brokers).

New agent/tests/test_sdk_connectors_kis.py covers profile registration, the
host-separation guard, order validation (including two bugs a code review
caught before this PR: a fractional cancel-quantity truncating into a
full-quantity cancel, and get_historical_bars(limit=0) returning the full
history instead of nothing), secret redaction, and service dispatch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GYruJS2jFvSoi7DdWWuMvW
Signed-off-by: heonjinjeong <hj.jeong@okestro.com>
2026-09-11 22:39:56 +09:00
Haozhe Wu afe7d7df58 docs(readme): add the 2026-09-11 news entry across six languages 2026-09-11 21:31:58 +08:00
Haozhe Wu f9cb061b3f docs(readme): add the 2026-09-10 news entry across six languages 2026-09-10 11:23:24 +08:00
Haozhe Wu a44ed6e807 docs(readme): correct the Data Sources section and guard what drifted
`test_readme_loader_tree_line_matches_the_registry` guarded the loaders line
of the repo tree and only that line, so the tree line was right while the
prose two hundred lines above it and the table directly beneath it were not:

  * the intro claimed "23 free market-data sources" against a registry of 27
    — contradicting the tree line in the same file
  * nobitex and wallex never reached the table in any language, so two
    sources that shipped this cycle were listed nowhere a reader looks
  * tickerall was in the English table only; the five translations never got
    a row when it landed as the 25th source
  * the engines tree line said 8 where the code ships 9 plus the composite,
    while the feature badge — which is checked — said 10

Three guards now cover those spots, anchored on code literals (`source:
"auto"`, `engines/`, a backticked source name) so they survive translation,
per this file's founding constraint. The table check runs against the
registry rather than across READMEs, so all six being uniformly wrong still
fails; that is how tickerall stayed missing from five of them.

Mutation-tested: reverting the count to 23, deleting the nobitex row,
reverting the engines line to 8, and deleting tickerall from one translation
each fail exactly one test.
2026-09-09 16:30:38 +08:00
Haozhe Wu 5f85c6d515 docs(readme): merge the two 2026-09-09 news entries into one
The release entry and the day's sweep entry carried the same date, so the
timeline showed 2026-09-09 twice in all six languages.

They are not redundant, though — the two bullets shared no references at all
(release: #1317, #1376, #1377, #1395; sweep: #1392, #1393, #1394, #1396,
#1397, #1398, #1399, #1400), so deleting either would have dropped eight
pull requests from the README. The sweep's substance is spliced into the
release entry ahead of its "new this cycle" segment instead, where it reads
as what it was: the last batch to land before the tag, and a miniature of
the same three themes the release is about — a contract classified into the
wrong market, a fill default inventing a return, and a default value that
must not read as a looked-up one.

Verified per language that the merged bullet carries all 12 references and
that the whole file's reference set is unchanged, and the collapsed list
gives back one entry so three stay visible.
2026-09-09 16:21:12 +08:00
Haozhe Wu cc54832cb5 release: 0.1.15 — data that says what it is
Rolls up 551 commits / 162 merged pull requests since 0.1.14, from 35
contributors.

Served price frames now stamp the adjustment caliber they carry, and a
source whose caliber was never measured against a live payload reports
`unknown` rather than guessing one. The Alpha Zoo's NaN contract moved out
of the individual alphas and into the registry: an alpha branching on an
`np.where` comparison never sees a NaN, so blanking every declared input on
one bar left 84 of 462 alphas returning a number anyway, each consumed as a
real signal because `dropna()` is what keeps a gap out of an IC. The same
sweep afterwards finds none. The futures loader chain was the last instance
of that class and closes in this release.

New markets and surfaces: UK equities (LSE .L/.IL, SDRT modelled as a
purchase-side-only duty), Zerodha Kite Connect as the fourteenth broker
(paper plus read-only, since Kite exposes no runtime live discriminator), a
read-only multi-broker portfolio across Web / REST / CLI / agent tool,
fifteen Quant Library additions, Brazilian Portuguese as the eighth locale,
read-only Nobitex and Wallex, and an offline evals harness that emits
NOT_EVALUABLE rather than passing when instrumentation is absent.

`test_release_version_consistency.py` caught a fourteenth declaration site
the eleven it was written for did not cover: the `app.version` mock in
`frontend/src/components/layout/__tests__/Layout.test.tsx`. The comment in
`test_cli_update.py` that named the current version is de-versioned here —
a version in a comment has no guard and goes stale at the next bump.

Reader-facing counts were re-measured rather than incremented: 74 MCP tools,
107 registry tools, 10 engines, 90 skills, 462 alphas, 27 data sources, 30
swarm presets, 14 broker connectors. None had drifted.
2026-09-09 15:47:15 +08:00
Haozhe Wu ca94a93011 docs(readme): add the 2026-09-09 news entry across six languages 2026-09-09 02:00:00 +08:00
Haozhe Wu d99062e1e0 docs(readme): add the 2026-09-08 news entry across six languages 2026-09-08 01:32:28 +08:00
Haozhe WuandClaude Opus 5 a4f06a29f6 docs(readme): add the 2026-09-07 news entry across six languages
Today's landings: the composite engine's shared sub-engine dropping a
50 oz gold order to zero and charging an index future's fee schedule,
the futures product codes that fell through to the default multiplier of
50, the four Alpha Zoo factors that fabricated a signal through a halt,
the per-regime position sizing, and the no-progress budget with its
second-failure retry rule.

Same shape as the existing entries: three visible, 2026-09-04 demoted
into the collapsed block, one date set and one link set across all six
files. Every figure quoted was measured on this tree rather than taken
from a PR description; the ~35-iteration figure is the reporter's and is
attributed as such.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 02:43:58 +08:00
Haozhe Wu c09deeaa04 docs(readme): add 2026-09-06 news across six languages, and pin the loaders tree line
The news entry leads with the day's two guard failures — the MCP order gate
sizing a quantity order from the live quote alone, so a buy limit at twice the
market could fill at twice the authorized notional, and the report auditor
returning PASS after skipping every unverifiable point — then the grounding,
trade-journal, compaction and Windows fixes, then Zerodha, the two Iranian
sources, and Anthropic prompt caching. Three visible entries as always;
2026-09-03 moves into the collapsed block.

Writing it surfaced a real drift. Each README's repo-tree line both counts and
NAMES the loaders, and it read '24 sources' while the registry held 27 —
nobitex and wallex from #1263 were never added, and tickerall had been missing
for longer. All six were wrong in exactly the same way, so the existing count
tests, which only prove the READMEs agree with each other, stayed green. Same
failure mode the broker pin was added for after eToro shipped as the 13th
connector against a pin of 12.

The line is fixed in all six and now guarded against the live LOADER_REGISTRY
by name, not just by count, so omitting a source fails even when the number is
edited to match. Both mutations are killed: reverting the count to 24 fails,
and dropping a single name while keeping the count correct also fails.
2026-09-06 22:41:41 +08:00
Haozhe Wu 90f5d4ae8e Merge remote-tracking branch 'origin/main' into work-1193 2026-09-06 14:44:26 +08:00
Haozhe WuandClaude Opus 5 5c2766f9ec docs(readme): add 2026-09-05 news across six languages
Leads on the grounding gate matching `close` but not `closed`, so a
fabricated USD price passed in English while the identical Chinese claim was
caught, and on the compaction/dedup deadlock that left a run answering
"fundamental data not retrieved" for data it had already fetched.

2026-09-02 folds into <details> so three entries stay visible. All six files
carry the same 16 PR/issue links and the same 11 acknowledgements, checked
by set comparison rather than by eye.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 21:40:00 +08:00
Haozhe Wu d71ed8dd28 docs(readme): add 2026-09-03 and 2026-09-04 news across six languages
Two dated entries, one per day of merges, matching the commit dates on main.

2026-09-03 — a data source that never answers, and dated figures that could not
be proved: stooq's proof-of-work page read as "no data" so the second link of
the US-equity chain was dead weight with nothing in the log (#1342), and a
generic tool result lost the date it carried alongside its price, so a dated
claim had no evidence that could match it (#1333). Plus the MCP goal wrappers
demanding an id the registered tools call optional (#1331), the Codex adapter
dropping provider token counts (#1334), and real subprocess coverage for the
swarm's MCP stdio path (#1335).

2026-09-04 — every Claude 5 run failing at the first request (#1330), a halted
position re-marked at entry cost and printing a drawdown with no market event
behind it (#1332), three commit-time mandate-widening paths closed with cash-only
restored as the floor of the leverage axis (#1285), the elapsed clock surviving
navigation and reload (#1340), and the seven npm advisories patched.

Both entries are visible; 09-01 and 08-31 move into the folded block, keeping
three on screen per the news convention. Cross-checked by script: the PR/issue
references and the acknowledged handles are identical in all six files. Every
closes-reference verified against the PR's own closingIssuesReferences, and
every acknowledgement against the PR author.

The forward-fill limit is described without a bar count: it is 5 within one
market and 10 across markets, so naming "5-bar" would have been wrong for any
cross-market run.
2026-09-04 15:22:10 +08:00
Haozhe Wu 7b43ba37f0 docs(readme): add 2026-09-02 news across six languages 2026-09-02 17:32:23 +08:00