Methodology · v0 · rendered from the scorer, not written beside it
The scoring rule, printed from the code that runs it.
Six axes and 22 facets. Every weight, midpoint, range and denominator on this page is read out of lib/profile as the page renders, so it cannot say one thing while the scorer does another — it holds no numbers of its own to say.
What that does not buy is any claim the numbers are the right ones. Two of them were chosen rather than measured, and they are the first thing on the page rather than a footnote at the bottom of it.
What is asserted
Two numbers here were chosen, not measured.
Both would have to survive a cross-user corpus to become findings, and that corpus does not exist. Until it does they are stated as what they are, in the words they deserve.
The midpoints were tuned on one corpus
Every scores 50 at value below was calibrated against a single 376-session corpus — one person’s sessions, on one machine. They are provisional. A midpoint fitted to one corpus is a placeholder for a cross-user distribution that does not exist yet, which is also why no axis on your report carries a percentile.
The PD-1 weights are asserted
These weights are an editorial claim about what matters, not a calibrated finding. They are asserted the same way MIDPOINT is asserted, and neither can be validated until a cross-user corpus exists.
The six axes
Each axis, and the facets it sums.
Ordered by PD-1 weight. Open one for every facet's share of its axis, the value that facet is scaled against, and the denominator it divides by.
specification28% of PD-1 · 4 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| plans that survived without a rewrite | 30% | 0.4 → 1 spans 0 → 100 | sessions that entered plan mode |
| structural signals present in your briefs | 30% | 0 → 0.5 spans 0 → 100 | sessions read |
| median opening brief | 20% | scores 50 at 45 | sessions read |
| turns that instruct rather than patch | 20% | 0.4 → 0.85 spans 0 → 100 | turns you typed |
planning22% of PD-1 · 4 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| sessions that planned before building | 35% | 0 → 0.35 spans 0 → 100 | sessions read |
| median plan length | 25% | scores 50 at 6,000 | sessions with a plan artifact |
| structural markers per 1,000 chars of plan | 20% | scores 50 at 5 | sessions with a plan artifact |
| edits made under an approved plan | 20% | 0 → 0.6 spans 0 → 100 | sessions that entered plan mode |
steering18% of PD-1 · 4 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| corrections landing in the front half of a session | 40% | 0.3 → 0.9 spans 0 → 100 | corrections observed |
| words the median correction stays under | 25% | 0 → 30 spans 0 → 100 | corrections observed |
| corrections per turn you type | 20% | scores 50 at 0.15 | turns you typed |
| plan objections per session | 15% | scores 50 at 0.5 | sessions read |
orchestration14% of PD-1 · 3 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| peak tool calls in flight at once | 40% | scores 50 at 3 | tool calls observed |
| sub-agent runs per turn you type | 35% | scores 50 at 0.12 | turns you typed |
| share of tool calls that were delegated | 25% | 0 → 0.06 spans 0 → 100 | tool calls observed |
taste12% of PD-1 · 5 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| added functions staying under 10 lines | 30% | 0.4 → 0.95 spans 0 → 100 | functions added |
| added functions called more than once | 25% | 0.6 → 1 spans 0 → 100 | functions added |
| added lines that repeat nothing already there | 20% | 0.8 → 1 spans 0 → 100 | functions added |
| added lines that survived the session | 15% | 0.7 → 1 spans 0 → 100 | functions added |
| touched files left under 500 lines | 10% | 0.7 → 1 spans 0 → 100 | functions added |
velocity6% of PD-1 · 2 facets▸
| Facet | Share of axis | Scaled against | Divided by |
|---|---|---|---|
| lines changed per turn you type | 60% | scores 50 at 25 | turns you typed |
| files touched per session | 40% | scores 50 at 6 | sessions read |
A facet whose denominator counts zero is skipped. The axis renormalizes over the facets the corpus could actually speak to, which is what stops an absent signal from reading as a perfect score — with no code written at all, taste has nothing to measure rather than nothing to fault. The two scale kinds behave differently at the edges: scores 50 at is a saturating curve that approaches 100 without ever reaching it, while a spanned range is linear and clamped, so a rate at or below the low end scores 0 on that facet and one at or above the high end scores 100. Values print as the scorer holds them — a share is a fraction, a length is a count.
PD-1
How the six become one number.
The weights above sum to 100 and split evenly across the two halves of the thing being measured: how you hand work over, and what you do with the run. Three rules keep the composite from outrunning its evidence.
- one primitive
PD-1 blends the axes through the same function an axis blends its facets with. An axis that refused to print a number carries zero support into that blend, so the composite renormalizes over the axes that did score rather than averaging a zero in.
- no ± band
The axes are deterministic counters over files you already have, so an uncertainty interval would be invented. PD-1 prints how many of the six axes scored instead, which is the real statement about how much of the instrument your corpus reached.
- weakest axis wins
The composite takes the lowest confidence of any axis carrying more than a marginal share of the weight, so a high-confidence velocity can never launder a low-confidence specification. When too little of the weight scored at all, PD-1 itself refuses to print and the report falls back to the archetype.
Confidence
What a score has to clear before it prints.
Absolute cutoffs, first match wins. Coverage is the share of an axis's weight backed by at least one observation; the denominator is the smallest one any contributing facet divided by.
| Grade | Coverage of axis weight | Smallest facet denominator | What the axis prints |
|---|---|---|---|
| high | ≥ 100% | ≥ 30 | The score, with no qualifier. |
| medium | ≥ 80% | ≥ 10 | The score, flagged as medium confidence. |
| low | ≥ 50% | any | The score, flagged as low confidence. |
| insufficient | matches none of the above | — | No score at all. The axis withholds a number and drops out of PD-1 rather than blending a zero into it. |
These cutoffs are guesses too. They are as arbitrary as the midpoints they sit beside, and a corpus-relative bar was rejected only because it would grade identical evidence differently for two people. What they buy is that an axis which cannot clear them prints nothing at all, and a silent zero — the number an unmeasured axis used to report — is the one outcome that is never honest.
Behavior graph
When a node appears on the expanded shape.
Every gate below is imported from the scorer’s published constants. Strength nodes are habits on the favorable side of a signal; failure nodes are co-occurring adverse patterns; drift nodes are signals whose recent window moved relative to an earlier one.
| Constant | Value | What it gates |
|---|---|---|
| GRAPH_MIN_SESSIONS | 10 | Corpus size before a graph replaces the expanded radar. |
| NODE_MIN_SUPPORT | 5 | Sessions grounding a node; below this the node is omitted. |
| STRENGTH_SHARE | 70% | Favorable-side share among sessions that can speak to the signal. |
| STRENGTH_FACET_SCORE | 65 | Owning facet’s corpus blend score floor for strength nodes. |
| CLUSTER_PHI | 0.35 | Phi coefficient floor for co-occurrence edges between adverse signals. |
| CLUSTER_JOINT | 4 | Joint adverse sessions required before a phi edge merges. |
| SINGLETON_PREVALENCE | 45% | Adverse prevalence for a singleton failure node. |
| DRIFT_MIN_DATED | 16 | Dated sessions required before drift windows run. |
| DRIFT_DELTA | 25% | Relative |last−first|/|first| floor for a drift node. |
| NODE_CAP | 12 | Max nodes rendered; omittedNodeCount carries the rest. |
Three node kinds, three tokens. Strength maps to --agree, failure to --diverge, drift to --partial — the same triple the rest of the report already uses for agreement, risk, and partial signals. Below GRAPH_MIN_SESSIONS the expanded view stays the radar; a thin corpus does not get a lonely scatter of dots.
