Retrieved article excerpt
Open article · Retrieved 2026-09-18T18:22:47.717655+00:00
# One change, checked against everything already decided
A walkthrough of provLedger: a task goes to the coding agent, the check runs before anything is edited, and the reason it fires is already on the record.
EN
中文
●~/churn-model — claude
terminal
01The task
~/churn-model on main
>
● Planning · 4 steps · churn-t118
Read pkg/training/split\_dataset.py · 62 lines
Read pkg/training/train\_churn.py · 148 lines
provledger · declaring 3 targets, checking each against its own history
provledger · computing what reads them — 5 consumers, 3 steps deep
#### ⚠ 2 findings before anything is edited
1This experiment has been run before
*80/20 was tried on 2026-08-14 and rejected · split\_dataset*
2weekly\_report reads this split, three steps downstream
*computed from the graph, not from the diff*
↳ nothing is blocked · recorded, and put in front of you
Answer them, or say go ahead — either way it is on the record.
>
🏠 Home
🎯 Outcomes
📋 Task · read only
CHURN-MODEL
## Retrain the churn model on an 80/20 split
churn-t118
published 14:22
4 steps
3 things touched
### Findings
2 blocking
⚠
This experiment has been run before
80/20 was tried on 2026-08-14 and rejected: the holdout leaked week-52 promotions, so the lift was the promotion and not the model.
pkg.training.split\_dataset
3 hits
open the record →
⚠
weekly\_report depends on this split
Computed downstream: split\_dataset → train\_churn → weekly\_report → the churn figure in the Monday deck.
3 steps · 5 consumers
open the graph →
1 unanswered
### Decisions relied on
- reason:96Stratify on churn, not on tenure — the tenure buckets are not balanced after 2026-06.
- reason:104Seed is fixed at 20260614 so a rerun is comparable.
- reason:118Holdout must not contain a promotion week.
1read the current split and its history
2answer the findings before editing
3change the split and retrain
4compare against the recorded expectation
🏠 Home
🎯 Outcomes
🧬 Node ledger · read only
CHURN-MODEL
## pkg.training.split\_dataset
derived
upstream 2 · downstream 5
14 records · 6 analysis runs
### Change history
2026-09-17
Proposed: move the split to 80/20 and retrain.
churn-t118open
stated
2026-08-14
Rejected: 80/20 leaked week-52 promotions into the holdout. Keep 70/30 until the promotion calendar is a column.
churn-t094rejected alternativesource level verbal
2 hits
stated
“We tried eighty-twenty in August and the holdout had week fifty-two in it — the lift was the promotion, not the model. Leave it at seventy-thirty until the promotion calendar is its own column.”
tier
: stated — the user's own words, with the span
source level
: verbal · the words themselves
recorded in
: churn-t094, 2026-08-14 11:07
surfaced
: 3 times · adopted by 1 plan
provledger why pkg.training.split\_dataset
2026-06-02
Stratify on churn, not on tenure — the tenure buckets stopped being balanced.
churn-t061reason
5 hitsstated
2026-05-19
Signature changed: returns (train, test, meta) instead of (train, test).
run 71measured from the source
derived
2026-04-03
No reason on record for the original 70/30 choice.
run 44gap, kept as a gap
unstated
### Constraints in force
Do not move to 80/20 until the promotion calendar is a column of its own. — from churn-t094
Seed stays 20260614 so two runs can be compared. — from churn-t104
🏠 Home
🎯 Outcomes
🕸 Project state graph · read only
CHURN-MODEL
## run 87 · 2026-09-17 · 612 nodes · 188 with records
Data flow — what is read, what processes it, what comes out. Only what has a story is drawn.
FocusStory
Data flowFull
read
processed
produced
data/orders.parquet
18 columns
data/customers.parquet
11 columns
feeds/promotions
external
pkg.training.split\_dataset
14 records · 2 constraints
pkg.training.train\_churn
9 records
pkg.features.promo\_flag
declared
pkg.rollup.weekly\_report
Monday deck
metric: churn\_rate
tracked since 2026-03
### What this change would reach
**3 steps downstream**
5 consumers
1 metric on the end of it
Computed from the graph on this run and compared with the run before it — not reported by the agent.
❚❚ Pause
↺ Restart0:00 / 1:12
Interface wording is the product's own; the ledger shown here is a worked example, not a live database. The dashboard is read-only and opens the database read-only, so it can never block or change what it is showing — the check records and surfaces, it never vetoes. Try it with `claude plugin marketplace add yizhao95/prov_ledger`.
[↗ github.com/yizhao95/prov\_ledger](https://github.com/yizhao95/prov_ledger)