Portfolio Agent EvalsHarbor task suite · ETF analyze → backtest → rebalance
Data Forensics & Canonicalization/pf-data-provenance-profile

Profile raw price files against calendar and metadata

Profile every ticker's raw price file against the trading calendar and metadata and emit a structured data-quality report with exact counts.

T1easyAnalyzepartialready
Edit
readystatic
Agent budget
15 min
Verifier budget
2 min
Tier target
≥ 90% pass expected

instruction.md

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

Profile the raw ETF price data

You are given raw per-ticker daily price files under /app/data/prices/, the NYSE trading calendar at /app/data/trading_calendar.csv and ETF metadata at /app/data/etf_meta.csv.

Produce /app/output/profile.json with, for each ticker that has a price file:

  • first_date, last_date (ISO strings)
  • n_rows
  • n_calendar_days_expected: number of trading-calendar dates between first_date and last_date inclusive
  • n_missing_calendar_days: calendar dates in that range with no row
  • n_non_calendar_rows: rows whose date is not a trading-calendar date
  • n_duplicate_dates: number of extra rows sharing a date with an earlier row
  • inception_mismatch: true if first_date is more than 5 trading days after the metadata inception_date

Also include top-level arrays tickers_without_meta and meta_without_prices.

Do not modify anything under /app/data. Write only under /app/output.

Verification

reward.json metrics · weights sum to 1.00 · tolerance Integers exact; dates exact.

MetricWeightCheck
schema_valid
0.2
All required keys present for every ticker with a file.
counts_exact
0.5
Every integer field equals the verifier's recomputation.
sets_exact
0.3
tickers_without_meta and meta_without_prices equal as sets; inception_mismatch flags exact.

Harbor scaffold

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

schema_version = "1.4"

[task]
name = "portfolio-agent-evals/pf-data-provenance-profile"
version = "1.0.0"
description = "Profile every ticker's raw price file against the trading calendar and metadata and emit a structured data-quality report with exact counts."
keywords = ["etf", "portfolio", "analyze", "data-forensics", "data-profiling", "calendar-alignment", "json-contract"]

[metadata]
author_name = "portfolio-agent-evals"
difficulty = "easy"
category = "quant-finance"
tags = ["data-forensics", "tier-1", "analyze", "partial"]
theme = "Data Forensics & Canonicalization"
tier = 1
reward_type = "partial"

[agent]
timeout_sec = 900.0

[verifier]
timeout_sec = 120.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

Traps

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

  • One ticker has three duplicate dates (counted as 3 extra rows, not 3 dates).
  • One ticker has rows on a Good Friday and a Saturday.
  • One metadata entry has no price file; one price file has no metadata.
  • Inception mismatch is measured in trading days, not calendar days.

Inputs

Fixtures mounted in the environment

Outputs

What the verifier reads from /app/output

  • /app/output/profile.json
    JSON
    Per-ticker profile plus set differences.

Anti-gaming

Trap placement is seed-dependent; verifier recomputes every count from the generator.

Oracle notes

solution/solve.sh must score 1.0 on five seeds

pandas groupby plus set difference against the calendar; about 40 lines.

Reviews (0)

Design review before a task is marked ready

    Reviews are read-only in static export.
    Tier 1 · Foundations≥ 90% pass expected. Created 2026-01-01, updated 2026-01-01.