# TradingAgents–Investboard: reproducibility packet

Prepared on 11 October 2026 for InvestingStack's article, **From TradingAgents analysis to a reviewable investment decision**. Author: David Bartas, founder of Investboard. AI assisted source review, drafting and the local test harness.

## Evidence stage

**Completed:** pinned source review, the connector's 172 existing unit tests, and the additional offline boundary checks in `boundary_checks.py`.

**Not completed:** model calls, authenticated Investboard reads or writes, real server mandate verdicts, broker orders, a v0.6.0 compatibility test, or investment-performance evaluation. HTTP responses and completed agent state in this packet are deliberately mocked. A mock storage acknowledgement is not a verified Investboard decision record.

`profiles.json` contains four fictional investors. SAP.DE is only an instrument identifier: all holdings, prices, quantities, proposals and policy documents in this packet are synthetic. `protocol.json` specifies the subsequent model comparison. Its model IDs and market-response archive must be locked before that comparison begins. Do not treat this as a finished model experiment or a ready-to-run live analysis script.

## Reproduce the completed checks

Use Python 3.12 in an isolated environment. Dependency downloads need internet; the boundary-check harness blocks socket connections while executing the checks and needs no credentials. `requirements.txt` records the versions resolved in our environment, with both source projects pinned to Git commits.

```sh
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python -r requirements.txt
.venv/bin/python boundary_checks.py --output reproduced-observations.json
```

The script exercises the real installed connector renderer, graph context override, payload builder, HTTP client and outbox replay code. It skips graph initialization and replaces the upstream identity lookup; it does not invoke the agent graph. It writes all twelve context cells, a sample serialized payload and named observations to the chosen output file. Assertion failures exit unsuccessfully.

To repeat the connector's own suite, clone the pinned source separately:

```sh
git clone https://github.com/Investboard/tradingagents-investboard.git connector
git -C connector checkout 01f7a0c05c1b2f885829abd569e5c0af1da1a0d4
.venv/bin/python -m pytest -q connector/tests
```

The reported result is `172 passed in 21.31s` on macOS arm64, Python 3.12.12. The suite uses mocks; passing it does not verify a production service or an LLM's rule compliance. Runtime can differ on another machine. `unit-test-summary.json` includes test names and result counts without local paths or machine identifiers.

## Proposed model comparison

Read `protocol.json` before running. It defines four profiles × three context arms × three repetitions, with a fixed EUR 2,000 addition funded from existing cash. A completely priced household worth EUR 100,000 therefore keeps that denominator after the transaction. The instrument limit is a direct holding limit, not look-through issuer exposure via funds. Costs, taxes, FX and other holdings' prices are held constant. These are experiment assumptions, not a production portfolio model.

The baseline receives the common proposal and instrument identity, but no investor policy or position. The prompt and connector arms receive the same rendered policy and position text in the same `instrument_context` location. Our offline checks verify this equality. A hand-pasted policy supplied only to a final chat message would be a different treatment and needs a separate experiment.

The model stage must archive and hash every market-data response, including paths outside the core vendor registry. It must prevent unrecorded market access, use separate empty memory/checkpoint directories, record exact model IDs and settings, and log all prompts and tool calls. Select a supported provider and model before locking the protocol; no model was silently substituted in the completed checks. The included synthetic analyst reports are parser fixtures, **not** the required full market-response archive.

Evaluate only what each arm could know. The baseline cannot be expected to identify an undisclosed exclusion or limit. It can be evaluated for whether it invents investor facts or qualifies the missing context. Score rule recognition in the context arms, missing-information handling, and record completeness separately; do not collapse them into a trading-performance score.

Separate the context experiment from the service integration exercise. Apply the same local serializer to all arms. Posting automatically in the connector arm is an integration feature, not proof of better reasoning. In a dedicated fictional account, verify returned record ID, stored contents, server check or explicit skip reason and policy/position version. Archive the response verbatim and distinguish it from the independently written scenario oracle. No real account is used by this packet.

## Files

- `profiles.json`: fictional policy/position API shapes, common proposal and independently specified expected outcomes.
- `protocol.json`: treatments, controls, rubric, replication and stop rules for the unrun model stage.
- `boundary_checks.py`: executable, credential-free connector checks.
- `observations.json`: output from executing that script, including all context cells and a canned-state payload.
- `unit-test-summary.json`: observed result of the connector's existing test suite.
- `requirements.txt`: frozen Python dependencies and pinned source installs.
- `manifest.json`: SHA-256 file hashes. The manifest and ZIP itself are excluded from their own hash list.

The packet's original fixtures, protocol and harness are released under CC0-1.0. External projects retain their own licenses. No third-party source code is bundled.
