The business caseThe problem this solves
A carrier's agency administration desk is handed a downline change request in prose — one producer or agency to be moved, terminated and re-contracted, split or re-compensated — together with the executed amendment that actually effects it and the subtree as it stands. Before anything is keyed, somebody has to say which ONE printed node the request names, what the amendment actually does to it, where the severed downline lands, and what the structure looks like afterwards. The expensive part is not the node that is named. It is the node that is NOT: 20 of the 64 packets in this corpus sever 35 nodes that neither document mentions, and 133 of the 272 clauses on those packets are decoys naming a different real node of the same subtree in the same words. Opening one change packet, reading the request against the executed amendment to decide which printed node is meant and what the amendment does to it, walking the printed edges for every node that hangs off it, working out where the severed children land and which document says so, ordering the review-first list and raising one structure flag.
Audience
The channel operations desk of a health carrier's agency administration unit, and whoever reviews a hierarchy change before it is keyed. The decision it supports is 'what does this subtree look like afterwards and what does it orphan' — never whether the change may be made, never whether a producer is in good standing, and never what anybody is owed. The rule source is the carrier's own executed producer and agency agreements, operator-supplied; no regulator, bulletin or model act is named, cited or relied on anywhere in this kit. Every number on these pages came from one real run of this code, not from a vendor page.
The inputThe actual agency hierarchy change packets
The corpus is 64 agency hierarchy change packets, 0.22 MB (json 4 · jsonl 1 · md 2 · txt 64). No public corpus of agency hierarchy change packets exists, and one built from real producer files would carry real agencies, real people and real compensation. Every packet here is generated in process from SEED 20265180, so the key is DERIVED by the same rulebook the kit applies and the whole set rebuilds byte-identically. THE CORPUS IS PHI-FREE AND PERSON-FREE BY CONSTRUCTION: there are no names, no dates of birth, no member or claim identifiers and no clinical facts of any kind in it — every actor is a node id. The mixture IS the measurement: 20 packets that orphan something, 4 that resolve to no node at all, 46 carrying a tier implication of which 44 are silent in the request, 28 carrying a cap probe, 6 carrying a date or two-parent conflict, 32 printing a closed historical edge, and 133 decoy clauses that name a different real node of the same subtree in the same words a real clause uses. Two corrections are recorded in data/SOURCES.md: the tier pair clauses were added after the first build measured the tier cell at 64 of 64 free, and the orphan block was enlarged from 11 packets to 20 after the first build put the orphan bar at 53.
The corpus
- The 64 agency hierarchy change packetsgenerated from a fixed seed, so no real record, person or institution appears in it.
- Where each came fromdata/SOURCES.md states where every byte came from AND what the generator costs the measurement. THERE ARE NO PEOPLE AND NO MEMBER DATA IN THIS CORPUS: a producer is a PR- code, an agency an AG- code, a node a NOD- id, and every change-request sentence speaks for a desk; evals/check_labels.py sweeps all 64 packets for a person-shaped name on every run and reports 0. AHS-2026 is invented and asserts no rule of any regulator - the two agreement revisions and their effective-date conventions are operator-supplied example values, and check 8 fails the build on anything that reads as a citation. The floor of record was measured before any call was bought: 23 of 64 whole answers, against a generator-tuned ceiling of 64 and a constant of 2, and the eleven failure predictions were named there before any spend.
Swap this folder for your own material and the kit is pointed at your agency hierarchy change packets. That is the whole change — there is no database to migrate.
AGENCY HIERARCHY CHANGE PACKET AHC-0001
PACKET ASSEMBLED 2026-01-07 STANDARD AHS-2026
SUBTREE SUB-1000 CHANNEL CHN-01
CHANGE REQUEST REQ-30001 FILED 2025-12-22 REQUESTED EFFECTIVE 2026-02-01
EXECUTED AMENDMENT AMD-70001 EXECUTED 2026-01-01
AGREEMENT REVISION IN FORCE AT EXECUTION AGR-2026-R1 OPERATOR-SUPPLIED
[1] HIERARCHY NODES
ID TYPE NAME TIER STATUS SINCE
NOD-80001 WRITING-ENTITY WE-01 - ACTIVE 2021-05-14
NOD-80002 AGENCY AG-10 TIER-3 ACTIVE 2022-01-11
NOD-80003 AGENCY AG-11 TIER-4 ACTIVE 2021-09-12
NOD-80004 SUB-AGENCY SA-20 TIER-3 ACTIVE 2023-02-20
NOD-80005 SUB-AGENCY SA-21 TIER-2 ACTIVE 2022-07-31
NOD-80006 SUB-AGENCY SA-22 TIER-3 ACTIVE 2023-01-09
NOD-80007 PRODUCER PR-4000 TIER-2 ACTIVE 2023-08-12
NOD-80008 PRODUCER PR-4001 TIER-2 ACTIVE 2023-06-15
NOD-80009 PRODUCER PR-4002 TIER-4 ACTIVE 2023-07-11
NOD-80010 PRODUCER PR-4003 TIER-2 ACTIVE 2023-11-02
[2] HIERARCHY EDGES
CHILD PARENT EFFECTIVE FROM EFFECTIVE TO STATUS
NOD-80002 NOD-80001 2022-01-11 OPEN ACTIVE
NOD-80003 NOD-80001 2021-09-12 OPEN ACTIVE
NOD-80004 NOD-80002 2023-02-20 OPEN ACTIVE
NOD-80005 NOD-80003 2022-07-31 OPEN ACTIVE
NOD-80006 NOD-80003 2022-06-23 2023-01-09 CLOSED
NOD-80006 NOD-80002 2023-01-09 OPEN ACTIVE
NOD-80007 NOD-80004 2023-08-12 OPEN ACTIVE
NOD-80008 NOD-80005 2023-06-15 OPEN ACTIVEAbridged — the file continues.
The outcomeWhat a good result looks like
One change packet in, one before-and-after structure out: every node's parents before and after with one of eight states (DATE-CONFLICT, TWO-PARENTS, ORPHANED, REPARENTED-BY-AMENDMENT, REPARENTED-BY-REQUEST, TERMINATED, MOVED, UNCHANGED), the orphan set, the conflict set, the review-first list in order, one structure flag (PLACEMENT-UNRESOLVED, ORPHANS-CREATED, PLACEMENT-CONFLICTED, NONE-ORPHANED) and the tier implication. 61 of 64 packets come back whole once the pure-code station has re-derived them from the call's five read values, against 23 for the floor of record and 2 for a fixed reading, and 37 of 64 as the model wrote them.
And when it cannot
And what it does when it cannot. 64 of 64 replies parsed, 0 stopped at the 1,000-token ceiling, 0 were closed by the streaming runaway stop and 0 calls failed; the largest reply was 937 output tokens (93.7 pct of the ceiling). Three packets the station cannot recover are named in the kit README: AHC-0003, where the reply read four of the five values right and left child_landing empty, so a node came back ORPHANED against a key of NONE-ORPHANED; AHC-0014, where the request names a downline by a banner name that is no node of this subtree and the reply placed one anyway against a key of PLACEMENT-UNRESOLVED; and AHC-0030. The largest single loss was not predicted at all — invented_an_orphan, 7 packets RAW, 10 orphan ids the key does not carry and 0 missed: this arm over-orphans and never under-orphans. A reply that cannot be parsed is counted WRONG and stays in the denominator; it is never dropped and never re-fired.
Where it fitsWhat did work
Every line below is a measured result from this kit's own runs, with the figure that supports it. The headline above is not softened by any of them.
- Every change is an explicit MOVE naming one node id, and nothing hangs beneath it — free code — b000-hierarchy-change-ids, or the printed edges
the conflict set is 64 of 64 to a rule that reads no sentence, and on a hierarchy where nothing is severed the orphan set is a fixed NONE-ORPHANED, right on 44 of 64 packets here. Nothing is bought. - The executed amendment decides, and it says something different from the change request that accompanies it — the scored run, with src/recheck.py behind it
this is the split the money is on. The reading is 56 of 64 against the floor of record's 19 (p = 1.46e-10), and the arm that reads the REQUEST's sentence instead of the amendment's clause loses 10 whole packets — 13 against 23. - What matters is the node the request never mentions — pure code, walking the printed edges, from a reading the call supplies
a severed child is found by walking edges, never by reading a sentence. The RAW column over-orphans on 7 packets — 10 invented ids against 35 in the key, 0 missed — and the station recovers 6 of those 7. - Untrusted text can reach the change-request block — provenance on the request block, before anything else
0 of 36 attacked trials did the refused act, on every framing including the one written as an instruction from the operations lead — but 19 of 36 came back with a graded cell the clean reply had right. A cap that holds is not an answer that holds.
And where nothing here is good enough:
- The request names a downline by a banner name rather than a node id — neither — this is the case AHS-2026 refuses to place, and the kit's honest answer is PLACEMENT-UNRESOLVED
4 packets resolve to no printed node. The arm placed one anyway on 2 of them (placed_an_unresolvable_packet, one of only two named predictions that landed), and the station places whatever reading it is handed.
At a glanceHow the whole thing runs
Run once, for real, on 2026-09-21. Every figure on these pages was captured from that run — nothing is written from intent.
14 steps, grouped by the question that sends you to them rather than by build order. Each tile carries the one figure that step is about, and opens the page behind it.
Should you use this?What you bring, where it stops, and when not to use it
Before you commit an afternoon to this, these are the answers that decide it. Each one is rendered from the record it lives in — and links the page that holds it in full.
| What do I have to bring? | Replace data/corpus/*.txt with your own change packets in the same shape — printed subtree with every edge's effective and closed dates, the executed agreement revision, the amendment clauses, the change request as filed — and data/subtrees.json with your own register, then edit data/policy.json so the change kinds, node states, review order, structure flags, landing rule and the two agreement revisions are YOURS. ⚠︎ WHAT STOPS BEING TRUE THE MOMENT YOU DO. Corpus lens → |
| When is this the wrong choice? | Avoid: Buying a call per change to restate an edge table a producer system already holds. That is the case against the best-fitting scenario (“Every change is an explicit MOVE naming one node id, and nothing hangs beneath it”). 5 scenarios scored in all, each with its own. Eval lens → |
| Where does it stop working? | A packet whose change request names a downline by a BANNER NAME that resolves to no printed node, with no amendment clause naming one either. AHS-2026 refuses to place it and the key is PLACEMENT-UNRESOLVED; the arm placed one anyway on 2 of the 4 such packets, and the station places whatever it is handed. 6 recorded failure modes, each from a run rather than a guess. Corpus lens → |
| What was never verified? | NO SECOND SCORED RUN. One was fired, so the run-to-run spread on this corpus is unknown and no confidence interval is claimed anywhere on this page. 7 items this kit says it could not check. Eval lens → |
| Can I run this on a model I control? | Yes — any OpenAI-compatible endpoint, including one on your own hardware. The shipped adapter takes its host from BASE_URL and its model from MODEL, so nothing in src/ changes. The published figures come from 1 model on the fast tier, one provider, one key. Prompt lens → |
| And if it fits — what do I stand up? | 7 artifacts with a stated home and a stated egress, and 3 decisions each with what you provision past its ceiling — plus what was not measured. That is the next page, not this one. step 14 — Run it in your environment → |
Not asked of this kit — 2 questions: clone (a fresh clone of this kit runs with nothing fetched); judge (nothing here is graded by a model).
Last verified 2026-09-21 — r001-hierarchy-change. Every figure on these pages was captured from that run.
Run itHow this reaches your data
Every result on this page was produced by pure code over checked-in files, with no API key — which is why you can read the numbers before anyone spends anything.
Run this on your own data
- The pipeline, its eval harness and the runs behind every numberdeployed inside your environment, on your own model endpoints, against your own documents.
- The corpus above is the shape, not the limitit is a folder swap, and there is no database to migrate.
Checked before this shipped — A clean checkout with no key configured renders the whole board, runs the six free arms live in the browser and replays every committed arm. pip install -r requirements.txt installs nothing — the kit is standard library only. The only thing a key buys is the ASK THE MODEL button and a new scored run; without one the button is disabled and POST /api/model returns 400 without a call, which was driven and observed on the no-key board at port 9618.










