Commit Graph
354 Commits
Author SHA1 Message Date
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
Haozhe Wu 0177a294f6 fix(tools): dragon-tiger seats rank within each listing reason (#1512)
A security listed for several reasons on one day has a top-5 buy and sell
list per reason (TRADE_ID), and each seat report returns them in one list
sorted by amount, so a single running rank mixed reasons (600721 on
2026-09-21: 'BUY rank 4' was rank 1 of its reason). Seats are grouped by
reason and ranked per side, and the 30-seat cap drops whole trailing reasons
(reported as seat_reasons_omitted) instead of every sell seat first. Live
600721: three reasons, 5 + 5 each, ranks 1..5 per side.

The README sentence this PR added in English only is removed; the six
translations do not carry per-tool detail.
2026-09-21 20:24:36 +08:00
Haozhe Wu a458a29cc6 Merge PR #1512: fix(tools): restore dragon-tiger seat reports 2026-09-21 20:23:16 +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
lorenzozanee 9cb8f063e7 fix(tools): restore dragon-tiger seat reports
Signed-off-by: lorenzozanee <wyz0707@proton.me>
2026-09-20 01:41:52 +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
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
Haozhe Wu a21d388ac2 Merge PR #1416 2026-09-18 15:00:08 +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
Antonio 999c3a7f9b feat(providers): add OpenCode provider and send x-opencode-session
OpenCode Go (https://opencode.ai/zen/go/v1) rejects every chat completion
that lacks a stable per-conversation `x-opencode-session` header:

  400 MissingSessionID: Request is missing x-opencode-session and cannot
  be routed efficiently.

The `opencode-go` / `opencode-zen` names (#444) only map env variables;
nothing set the header and neither name is in the settings catalog, so
the only way to reach OpenCode was to re-point another provider at its
URL, which then failed as above.

- Add a canonical `opencode` provider (OPENCODE_API_KEY / OPENCODE_BASE_URL,
  default Go root, Zen offered as a base_url option) to the settings
  catalog, capabilities, swarm allowlist and both CLI onboarding surfaces.
  `opencode-go` / `opencode-zen` are unchanged.
- New `src/providers/session_context.py`: a ContextVar carrying the active
  Vibe session id. `AgentLoop.run()` binds it for the whole run.
- `ChatOpenAIWithReasoning` injects `x-opencode-session` when the provider
  is `opencode*` or the base-URL host is opencode.ai (so a `deepseek`
  label pointed at OpenCode also works). The value is the bound session
  id, or a per-adapter UUID outside a session; a caller-supplied header
  wins. The `Vibe-Trading/<version>` User-Agent identifies the client as
  OpenCode's usage policy asks.
- Tests: registration, host detection, ContextVar scoping and wire-level
  header checks via httpx.MockTransport. README and .env.example updated.

Verified against the live Go endpoint: preflight reports `LLM (opencode)
OK` and a chat session completes where it previously failed every time.

Signed-off-by: Antonio <tonydu@gmail.com>
2026-09-11 16:16:49 +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 WuandClaude Opus 5 a113ee0c74 fix(agent): refuse an identical call on its second failure, not its first
#1363's no-progress budget is right for #1353, but the other half of the
change made a transient failure permanent. `ToolProgress.record` added
every unsuccessful call's identity to the refusal set, and only a
successful MUTATING call cleared it — a pure research run often has
none. A read that failed once for a reason unrelated to its arguments
(rate limit, network blip, the 1800s tool timeout) could then never be
retried in that run. Measured against the branch: main executed such a
tool twice and got its data, the branch executed it once and never did.

Count failures per identity and refuse from the second one on. #1353's
loop reissued the same rejected path ~35 times, so the block still kills
it far inside the 8-iteration budget, while one honest retry survives.

Two-sided coverage, since the PR's seven tests only asserted refusals:
a transient failure whose identical retry must EXECUTE and succeed, and
a unit test pinning both edges of the threshold plus the mutation reset.
Updated the three existing expectations that encoded refuse-on-first
(two in the no-progress suite, one in the deterministic-cache suite that
this PR had already rewritten), and corrected the README paragraph, which
described the old behaviour.

Mutation-checked: putting the threshold back to 1 fails five tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 02:20:53 +08:00
Haozhe Wu d09c0b55a5 Merge PR #1363 2026-09-07 02:17:50 +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
eunwoo song 7b35626678 fix(agent): stop repeated discovery without new evidence
Signed-off-by: eunwoo song <presentsong@naver.com>
2026-09-06 09:08:17 +09: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