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
FacetShare of axisScaled againstDivided by
plans that survived without a rewrite30%0.4 → 1 spans 0 → 100sessions that entered plan mode
structural signals present in your briefs30%0 → 0.5 spans 0 → 100sessions read
median opening brief20%scores 50 at 45sessions read
turns that instruct rather than patch20%0.4 → 0.85 spans 0 → 100turns you typed
planning22% of PD-1 · 4 facets
FacetShare of axisScaled againstDivided by
sessions that planned before building35%0 → 0.35 spans 0 → 100sessions read
median plan length25%scores 50 at 6,000sessions with a plan artifact
structural markers per 1,000 chars of plan20%scores 50 at 5sessions with a plan artifact
edits made under an approved plan20%0 → 0.6 spans 0 → 100sessions that entered plan mode
steering18% of PD-1 · 4 facets
FacetShare of axisScaled againstDivided by
corrections landing in the front half of a session40%0.3 → 0.9 spans 0 → 100corrections observed
words the median correction stays under25%0 → 30 spans 0 → 100corrections observed
corrections per turn you type20%scores 50 at 0.15turns you typed
plan objections per session15%scores 50 at 0.5sessions read
orchestration14% of PD-1 · 3 facets
FacetShare of axisScaled againstDivided by
peak tool calls in flight at once40%scores 50 at 3tool calls observed
sub-agent runs per turn you type35%scores 50 at 0.12turns you typed
share of tool calls that were delegated25%0 → 0.06 spans 0 → 100tool calls observed
taste12% of PD-1 · 5 facets
FacetShare of axisScaled againstDivided by
added functions staying under 10 lines30%0.4 → 0.95 spans 0 → 100functions added
added functions called more than once25%0.6 → 1 spans 0 → 100functions added
added lines that repeat nothing already there20%0.8 → 1 spans 0 → 100functions added
added lines that survived the session15%0.7 → 1 spans 0 → 100functions added
touched files left under 500 lines10%0.7 → 1 spans 0 → 100functions added
velocity6% of PD-1 · 2 facets
FacetShare of axisScaled againstDivided by
lines changed per turn you type60%scores 50 at 25turns you typed
files touched per session40%scores 50 at 6sessions 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.

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.

GradeCoverage of axis weightSmallest facet denominatorWhat the axis prints
high≥ 100%≥ 30The score, with no qualifier.
medium≥ 80%≥ 10The score, flagged as medium confidence.
low≥ 50%anyThe score, flagged as low confidence.
insufficientmatches none of the aboveNo 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.

ConstantValueWhat it gates
GRAPH_MIN_SESSIONS10Corpus size before a graph replaces the expanded radar.
NODE_MIN_SUPPORT5Sessions grounding a node; below this the node is omitted.
STRENGTH_SHARE70%Favorable-side share among sessions that can speak to the signal.
STRENGTH_FACET_SCORE65Owning facet’s corpus blend score floor for strength nodes.
CLUSTER_PHI0.35Phi coefficient floor for co-occurrence edges between adverse signals.
CLUSTER_JOINT4Joint adverse sessions required before a phi edge merges.
SINGLETON_PREVALENCE45%Adverse prevalence for a singleton failure node.
DRIFT_MIN_DATED16Dated sessions required before drift windows run.
DRIFT_DELTA25%Relative |last−first|/|first| floor for a drift node.
NODE_CAP12Max 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.