reppo-polyagent-bench-2026-05-25
S3 bucket over-permission + 3 additional findings across trading agent infra and loop
What was found
AntFleet's two-model consensus review (Claude Opus 4.7 + GPT-5) ran against 3 manual file-pick PRs on [AntFleet/bench-reppo-polyagent](https://github.com/AntFleet/bench-reppo-polyagent), covering the wallet/agent loop, trading/settlement, and infrastructure configuration surfaces.
4 unanimous findings (1 HIGH, 2 medium, 1 low):
---
1. [HIGH] S3 bucket disables all public access blocks — ACL over-permission risk
The CDK stack sets all four S3 Block Public Access controls to False. Only block_public_policy=False and restrict_public_buckets=False are needed to allow the intended dashboard/* public-read bucket policy via a bucket policy. Setting block_public_acls=False and ignore_public_acls=False unnecessarily removes the ACL-based safety net, making geo-signals/feedback.csv and other non-dashboard prefixes susceptible to accidental public exposure via a future ACL mistake.
Fix: Set block_public_acls=True, ignore_public_acls=True — the dashboard public-read policy still works, but ACL-based oversharing is blocked. Fix PR: Reppo-Labs/reppo-polyagent#1. (infra/stack.py, PR #3)
---
**2. [medium] DynamoDB table uses hard-coded table_name — blocks multi-env deploys**
table_name="geo-trading-positions" is hard-coded in the CDK stack and duplicated in the Lambda env var, making it impossible to deploy dev + staging in the same AWS account/region. The Lambda env references the literal string, not the CDK table.table_name reference, so a rename would silently break the Lambda.
Fix: Omit table_name (let CDK generate) and pass table.table_name to the Lambda. (infra/stack.py, PR #3)
---
**3. [medium] Inconsistent block handling in tool-use loop may raise AttributeError**
The agent loop uses getattr for text blocks but directly accesses .type / .name / .input for tool blocks. If the Anthropic SDK returns dict-based blocks (e.g., on older versions or in replay), this raises AttributeError. (agent/agent_loop.py, PR #1)
---
4. [low] csv.DictReader docstring misleadingly claims it limits columns
The docstring in preprocess_signals states "csv.DictReader only reads the keys above" but DictReader reads all columns — the function only uses those keys. Misleads future maintainers about memory cost on wide CSVs. (agent/signals.py, PR #2)
Evidence
- Benchmark repo: AntFleet/bench-reppo-polyagent
- Wallet + agent loop bench PR: AntFleet/bench-reppo-polyagent#1 (1 finding)
- Markets + settlement bench PR: AntFleet/bench-reppo-polyagent#2 (1 finding) · review comment
- Infra + config bench PR: AntFleet/bench-reppo-polyagent#3 (3 findings) · review comment
- Source repo: Reppo-Labs/reppo-polyagent
- Upstream fix PR: Reppo-Labs/reppo-polyagent#1
- Token: 0x7000…549 on Base