The question
A retail bank’s direct-marketing team sells term deposits by phone. About 11% of past contacts subscribed, so most calls are wasted. The team wants to call the most promising clients first. The project folder held three things: the data, its data dictionary, and a short README.
What the agent did
1
Read the brief and checked the environment
It read
README.md and the data dictionary, confirmed the project’s
.venv had scikit-learn, pandas and DuckDB, looked up the dataset’s source
page and created the project in AIUS Examples.2
Profiled the data before modelling
It found 41,188 rows, no missing values, 12 duplicate rows and 11.27% of
contacts subscribing. It flagged 
duration (the length of the last call) as
leakage: it is only known after the call it is meant to predict. It also
treated pdays = 999 as “never contacted before”, not as a number of days.
3
Noticed that time matters
The rows are in the order the calls were made, and subscription rose from
2.8% of contacts in the first tenth to 45.9% in the last. A random
train/test split would mix past and future and overstate performance, so the
agent used forward validation: four folds of 6,590 contacts, each
trained only on earlier rows, then one untouched final period of 8,238
contacts.
4
Kept only what is known before a call
The model uses the client profile and previous-campaign history. It leaves
out the call’s duration, the current campaign’s contact count, the channel
and calendar fields, which are not known when the call list is drawn up.
Economic indicators were tested separately as a sensitivity check.
5
Compared against baselines and checked its own numbers
It compared logistic regression with gradient boosting and a random
ordering, then wrote a separate verifier. The verifier recalculated all 15
ROC-AUC and top-decile results independently and reproduced the full run
from scratch with identical results.
6
Asked before publishing
It proposed attaching the two scripts and three result files, and keeping
the raw data, row-level predictions and model file on the computer. After
approval it ran the report review (no warnings), published the
report, read it back and gave the link.
The result
Forward CV is the mean ROC-AUC, ± its standard deviation, over the four forward folds. Final period is the ROC-AUC on the untouched last 8,238 contacts. Top 10% reach is the share of that period’s subscribers found among its top-scored 10% of contacts.
Calling the top-scored 10% of the final period’s contacts would have reached
2.25 times as many subscribers as calling at random. Previous-campaign history
was by far the strongest signal, followed by job. The agent’s recommendation was
a monitored pilot, not a rollout: early folds were close to random, and the
population changed a lot over time.
Published scores for this dataset vary a lot with the validation design and
the features allowed. This analysis kept to data known before a call and
validated forward in time, so its scores are lower and more cautious; the
report explains why.
The published report
The report leads with the decision and its uncertainty, then shows the data’s limits, the model comparison, the drivers and the method. Its numbers carry footnotes to the attached files they came from.
The top of the report: the conclusion, the summary and the five attached files

The Data sources card states what the data cannot support

The model comparison: forward validation and the untouched final period

Cumulative subscriber reach in the final period
Try it yourself
Download the dataset from the UCI page above, put it indata/ with a short
README, create a .venv as in Installation, and give
the agent the same prompt with your own organisation’s name. Expect different
wording; the agent works through the same checks.