Harden the Placemint book extract for the larger tenant
Results
The ticket
This is PROBLEM.md exactly as the agent received it. Vendor documentation and the starter repository ship inside the task environment and are not reproduced here.
Harden the Placemint book extract for the larger tenant
From: Integrations / Revenue Ops Vendor: Placemint Surface: polling Category: harden · Tier: 3
Context
Every night this connector pulls Meridian Talent Group’s placement book out of Placemint and writes the extract Finance bill from: one row per placement, with the account it sits under and whether that account is still trading with us. It has run against our own tenant for a year and nobody has touched it.
We are moving it onto the bigger tenant next week, and the pilot run has come back badly. Dana in Finance:
“I have raised invoices against two accounts that were shut down before Christmas, and one that we stopped working in January is on here for four placements. There are account names in this file that those clients stopped using when they rebranded — my AP contact did not recognise them. I cannot send this out.”
Revenue Ops keep their own note on this job at
docs/meridian-account-book-note.md. Full vendor documentation is in docs/ —
start at docs/index.md.
The rules, unchanged
- One row per placement on the book. A placement Placemint has retired is not on the book and is not in the extract.
billableis Revenue Ops’ rule and has not changed: the account the placement sits under is still trading with Meridian. Anything else is on hold.- The account name and industry on a row are that account’s current ones.
fee_total_billableis the sum of the fees on the billable rows; a placement carrying no fee still gets a row.
What we need
The harness runs your code exactly as follows — this command is the contract:
python -m placemint_book_extract extract
# -> writes the output artifact listed below
- Work out why the account side of the extract is wrong.
- Fix it, keeping the rules above.
- Re-run; two runs over an unchanged tenant produce the same extract.
Output artifacts
output/book_extract.json—placement_count,billable_count,on_hold_count,fee_total_billable, andplacements: one entry per placement on the book, sorted byplacement_id, each with itsplacement_id,client_id,client_name,client_industry,candidate_name,role_title,stage,fee_amount(null when it carries none) andbillable.
Environment
| Variable | Meaning |
|---|---|
VENDOR_BASE_URL | Vendor sandbox base URL (e.g. http://vendor:8000) |
PM_CLIENT_ID | Vendor credential injected by the test harness |
PM_CLIENT_SECRET | Vendor credential injected by the test harness |
ACCOUNT_BOOK_FILE | Path to Meridian’s weekly account snapshot |
OUTPUT_DIR | Directory where output artifacts land (defaults to ./output) |
Engineering expectations
This ships to production, so the usual bar applies:
- Well-organized, modular code — keep transport, sync logic, and output concerns separate.
- Tests, runnable with
pytest, covering the core logic you add or change. - Be a good API citizen: handle the vendor’s real-world behavior the way a production integration must, and don’t hammer endpoints in retry loops. Our platform team audits vendor request logs — sloppy conduct gets flagged even when the data lands correctly.
Done when
The entry command exits 0, the extract covers every placement on the book and nothing else, every row carries the account Placemint holds it under and the right billing verdict, the totals agree with the rows, and a second run produces the same extract.
Graded checks (420)
Names of every assertion the grader runs for this task. Per-attempt pass/fail and details are on each trajectory page.
- book_extract_run_completed
- account_book_was_read_from_placemint
- extract_covers_the_live_book_exactly
- book_row_plc_00001_carries_the_account_placemint_holds
- book_row_plc_00002_carries_the_account_placemint_holds
- book_row_plc_00003_carries_the_account_placemint_holds
- book_row_plc_00004_carries_the_account_placemint_holds
- book_row_plc_00005_carries_the_account_placemint_holds
- book_row_plc_00006_carries_the_account_placemint_holds
- book_row_plc_00007_carries_the_account_placemint_holds
- book_row_plc_00008_carries_the_account_placemint_holds
- book_row_plc_00009_carries_the_account_placemint_holds
- book_row_plc_00010_carries_the_account_placemint_holds
- book_row_plc_00011_carries_the_account_placemint_holds
- book_row_plc_00012_carries_the_account_placemint_holds
- book_row_plc_00013_carries_the_account_placemint_holds
- book_row_plc_00014_carries_the_account_placemint_holds
- book_row_plc_00015_carries_the_account_placemint_holds
- book_row_plc_00016_carries_the_account_placemint_holds
- book_row_plc_00017_carries_the_account_placemint_holds
- book_row_plc_00018_carries_the_account_placemint_holds
- book_row_plc_00019_carries_the_account_placemint_holds
- book_row_plc_00020_carries_the_account_placemint_holds
- book_row_plc_00021_carries_the_account_placemint_holds
- book_row_plc_00022_carries_the_account_placemint_holds
- book_row_plc_00023_carries_the_account_placemint_holds
- book_row_plc_00024_carries_the_account_placemint_holds
- book_row_plc_00025_carries_the_account_placemint_holds
- book_row_plc_00026_carries_the_account_placemint_holds
- book_row_plc_00027_carries_the_account_placemint_holds
- book_row_plc_00028_carries_the_account_placemint_holds
- book_row_plc_00029_carries_the_account_placemint_holds
- book_row_plc_00030_carries_the_account_placemint_holds
- book_row_plc_00031_carries_the_account_placemint_holds
- book_row_plc_00032_carries_the_account_placemint_holds
- book_row_plc_00033_carries_the_account_placemint_holds
- book_row_plc_00034_carries_the_account_placemint_holds
- book_row_plc_00035_carries_the_account_placemint_holds
- book_row_plc_00036_carries_the_account_placemint_holds
- book_row_plc_00037_carries_the_account_placemint_holds
- book_row_plc_00038_carries_the_account_placemint_holds
- book_row_plc_00039_carries_the_account_placemint_holds
- book_row_plc_00040_carries_the_account_placemint_holds
- book_row_plc_00041_carries_the_account_placemint_holds
- book_row_plc_00042_carries_the_account_placemint_holds
- book_row_plc_00043_carries_the_account_placemint_holds
- book_row_plc_00044_carries_the_account_placemint_holds
- book_row_plc_00045_carries_the_account_placemint_holds
- book_row_plc_00046_carries_the_account_placemint_holds
- book_row_plc_00047_carries_the_account_placemint_holds
- book_row_plc_00048_carries_the_account_placemint_holds
- book_row_plc_00049_carries_the_account_placemint_holds
- book_row_plc_00050_carries_the_account_placemint_holds
- book_row_plc_00051_carries_the_account_placemint_holds
- book_row_plc_00052_carries_the_account_placemint_holds
- book_row_plc_00053_carries_the_account_placemint_holds
- book_row_plc_00054_carries_the_account_placemint_holds
- book_row_plc_00055_carries_the_account_placemint_holds
- book_row_plc_00056_carries_the_account_placemint_holds
- book_row_plc_00057_carries_the_account_placemint_holds
- and 360 more