Portfolio Agent EvalsHarbor task suite · ETF analyze → backtest → rebalance
End-to-End Multi-Step Reviews/pf-e2e-change-request-minimal-amendment

Absorb a late client change with a minimal amendment to the plan

Produce a rebalance plan, then absorb a late client change (an exclusion and tighter bands) by amending the plan minimally rather than regenerating it.

T3hardEnd-to-endmulti-metricready2-step
Edit
readystatic
Agent budget
20 min / step
Verifier budget
3 min
Tier target
25–50% pass expected

instruction.md

What the agent sees (CONVENTIONS.md is appended automatically)

Plan, then amend (multi-step)

Step 1 (plan): produce trades.csv to targets under the basic constraints.

Step 2 (amend): the client now excludes one ETF entirely (sell it; reallocate within its sleeve pro-rata to the sleeve's other ETF targets) and tightens the equity band to +/-3%. Produce trades_v2.csv and diff.json. Keep every step-1 trade that remains consistent with the new constraints and minimise additional turnover relative to v1. Prices have moved one day since step 1.

Steps

Harbor multi-step layout; rewards aggregate by mean

  1. 1
    planmin_reward 0.5

    Initial trade list.

  2. 2
    amend

    Minimal amendment under new constraints.

Verification

reward.json metrics · weights sum to 1.00

MetricWeightCheck
step1_plangate
0.3
Feasibility gate and closeness as in the basic task.
exclusion_honouredgate
0.2
Excluded ETF fully sold; pro-rata reallocation. GATE.
bands_v2
0.15
All sleeves within new bands.
minimal_delta
0.35
Turnover of (v2 minus v1) <= oracle + 1%.

Gates: step1_plan, exclusion_honoured. A gate failure caps or zeroes the trial reward regardless of other metrics.

Harbor scaffold

Generated from this record — task.toml, Dockerfile, verifier, oracle stub

schema_version = "1.4"

[task]
name = "portfolio-agent-evals/pf-e2e-change-request-minimal-amendment"
version = "1.0.0"
description = "Produce a rebalance plan, then absorb a late client change (an exclusion and tighter bands) by amending the plan minimally rather than regenerating it."
keywords = ["etf", "portfolio", "e2e", "end-to-end", "change-management", "minimal-diff-reasoning", "trade-generation"]
# Per-step rewards roll up by mean; gates are declared per step below.
multi_step_reward_strategy = "mean"

[metadata]
author_name = "portfolio-agent-evals"
difficulty = "hard"
category = "quant-finance"
tags = ["end-to-end", "tier-3", "e2e", "multi-metric"]
theme = "End-to-End Multi-Step Reviews"
tier = 3
reward_type = "multi-metric"

[agent]
timeout_sec = 1200.0

[verifier]
timeout_sec = 180.0

[environment]
# Offline by design: all data is synthetic and generated at build time.
network_mode = "none"
cpus = 2
memory_mb = 4096
storage_mb = 10240
build_timeout_sec = 900.0

[[steps]]
name = "plan"
# Initial trade list.
min_reward = 0.5
[steps.agent]
timeout_sec = 1200.0
[steps.verifier]
timeout_sec = 180.0

[[steps]]
name = "amend"
# Minimal amendment under new constraints.
[steps.agent]
timeout_sec = 1200.0
[steps.verifier]
timeout_sec = 180.0

Traps

Each must carry signal: a trap-blind solution must lose credit

  • Regenerating from scratch changes many trades and is penalised.
  • Pro-rata rule uses target weights, not current weights.
  • Step-2 prices differ from step-1 prices.

Inputs

Fixtures mounted in the environment

Outputs

What the verifier reads from /app/output

  • /app/output/trades.csv
    CSV
    Step 1 plan.
  • /app/output/trades_v2.csv
    CSV
    Amended plan.
  • /app/output/diff.json
    JSON
    Kept, changed, added, removed trades.

Anti-gaming

Excluded ETF and band change are seeded; oracle solves the amendment as a MILP with v1 fixed as the anchor.

Oracle notes

solution/solve.sh must score 1.0 on five seeds

MILP minimising |v2 - v1| subject to v2 constraints.

Reviews (0)

Design review before a task is marked ready

    Reviews are read-only in static export.
    Tier 3 · Expert25–50% pass expected. Created 2026-01-01, updated 2026-01-01.