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.
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.
| Metric | Weight | Check |
|---|---|---|
| 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
- /app/data/prices/Mild variant: duplicates and non-calendar rows planted in 2 tickers.
- /app/data/trading_calendar.csv
- /app/data/etf_meta.csv
Outputs
What the verifier reads from /app/output
- /app/output/profile.jsonJSONPer-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