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.
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
- 1planmin_reward 0.5
Initial trade list.
- 2amend
Minimal amendment under new constraints.
Verification
reward.json metrics · weights sum to 1.00
| Metric | Weight | Check |
|---|---|---|
| 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
- /app/portfolio/
- /app/data/prices/
- /app/policy/ips.yamlStep 2 delivers ips_v2.yaml via workdir.
Outputs
What the verifier reads from /app/output
- /app/output/trades.csvCSVStep 1 plan.
- /app/output/trades_v2.csvCSVAmended plan.
- /app/output/diff.jsonJSONKept, 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