<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Concepts on gh-velocity</title><link>https://gh-velocity.org/concepts/</link><description>Recent content in Concepts on gh-velocity</description><generator>Hugo</generator><language>en</language><atom:link href="https://gh-velocity.org/concepts/index.xml" rel="self" type="application/rss+xml"/><item><title>Definitions</title><link>https://gh-velocity.org/concepts/terminology/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gh-velocity.org/concepts/terminology/</guid><description>&lt;h1 id="definitions"&gt;Definitions&lt;a class="anchor" href="#definitions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;gh-velocity is a command-line tool that measures development velocity and quality from GitHub data. It works at a terminal, in GitHub Actions, or in any automation platform -- it is not specific to CI.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="measurement-axes"&gt;Measurement axes&lt;a class="anchor" href="#measurement-axes"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Four independent axes control what gh-velocity measures and how. &lt;strong&gt;Scope&lt;/strong&gt; and &lt;strong&gt;lifecycle&lt;/strong&gt; filter &lt;em&gt;which&lt;/em&gt; items to measure. &lt;strong&gt;Iteration&lt;/strong&gt; and &lt;strong&gt;effort&lt;/strong&gt; control &lt;em&gt;how&lt;/em&gt; velocity is computed. They combine freely -- changing one does not affect the others.&lt;/p&gt;</description></item><item><title>GitHub's Capabilities &amp; Limits</title><link>https://gh-velocity.org/concepts/github-capabilities/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gh-velocity.org/concepts/github-capabilities/</guid><description>&lt;h1 id="what-github-can-and-cannot-tell-you"&gt;What GitHub Can and Cannot Tell You&lt;a class="anchor" href="#what-github-can-and-cannot-tell-you"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;gh-velocity computes metrics directly from the GitHub API. That means zero setup, but also means the tool is constrained to what the API exposes. This page covers what works, what has rough edges, and what is fundamentally impossible.&lt;/p&gt;
&lt;h2 id="what-works-well"&gt;What works well&lt;a class="anchor" href="#what-works-well"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Issue lifecycle.&lt;/strong&gt; Creation and closure dates are precise and always available. Lead time (created to closed) is the most reliable metric.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PR merge timestamps.&lt;/strong&gt; The search API returns exact merge dates. The &lt;code&gt;pr-link&lt;/code&gt; strategy uses these to find PRs merged within a release window, giving you accurate release composition.&lt;/p&gt;</description></item><item><title>Understanding Statistics</title><link>https://gh-velocity.org/concepts/statistics/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gh-velocity.org/concepts/statistics/</guid><description>&lt;h1 id="understanding-the-statistics"&gt;Understanding the Statistics&lt;a class="anchor" href="#understanding-the-statistics"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;gh-velocity reports several statistical measures for lead time, cycle time, and release lag. This page explains what each means and why it matters, without assuming a statistics background.&lt;/p&gt;
&lt;h2 id="why-median-over-mean"&gt;Why median over mean&lt;a class="anchor" href="#why-median-over-mean"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lead times are almost always skewed: most issues close in days or weeks, but a few ancient issues closed during a release pull the average up. The median (the middle value when sorted) resists this distortion.&lt;/p&gt;</description></item><item><title>Linking Strategies</title><link>https://gh-velocity.org/concepts/linking-strategies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gh-velocity.org/concepts/linking-strategies/</guid><description>&lt;h1 id="linking-strategies"&gt;Linking Strategies&lt;a class="anchor" href="#linking-strategies"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;code&gt;quality release&lt;/code&gt; command determines which issues belong to a release. Different teams use different workflows, and no single method works everywhere, so gh-velocity uses three strategies and merges the results.&lt;/p&gt;
&lt;h2 id="connecting-prs-to-issues"&gt;Connecting PRs to issues&lt;a class="anchor" href="#connecting-prs-to-issues"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub tracks PR-to-issue connections through timeline events. A PR becomes linked to an issue when you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write &lt;code&gt;Fixes #42&lt;/code&gt;, &lt;code&gt;Closes #42&lt;/code&gt;, or &lt;code&gt;Resolves #42&lt;/code&gt; in the PR description&lt;/li&gt;
&lt;li&gt;Use GitHub's sidebar &amp;quot;Development&amp;quot; section to link a PR to an issue&lt;/li&gt;
&lt;li&gt;Mention &lt;code&gt;#42&lt;/code&gt; anywhere in the PR (creates a cross-reference event)&lt;/li&gt;
&lt;li&gt;Use any casing variation: &lt;code&gt;fix #42&lt;/code&gt;, &lt;code&gt;close #42&lt;/code&gt;, &lt;code&gt;resolve #42&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The PR does &lt;strong&gt;not&lt;/strong&gt; need to be merged, closed, or even out of draft. A draft PR that mentions an issue is enough.&lt;/p&gt;</description></item><item><title>Labels as Lifecycle Signal</title><link>https://gh-velocity.org/concepts/labels-vs-board/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gh-velocity.org/concepts/labels-vs-board/</guid><description>&lt;h1 id="labels-are-the-lifecycle-signal"&gt;Labels Are the Lifecycle Signal&lt;a class="anchor" href="#labels-are-the-lifecycle-signal"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Labels are the sole source of truth for lifecycle and cycle-time signals in gh-velocity. Project boards remain useful for velocity reads (iteration tracking, effort fields) but play no role in lifecycle or cycle-time measurement.&lt;/p&gt;
&lt;h2 id="why-labels-won"&gt;Why labels won&lt;a class="anchor" href="#why-labels-won"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Label event timestamps (&lt;code&gt;LABELED_EVENT.createdAt&lt;/code&gt;) are &lt;strong&gt;immutable&lt;/strong&gt;. Once a label is applied, the timestamp never changes -- not when the label is removed, not when it is re-added, not when anything else changes. The first application is permanently recorded.&lt;/p&gt;</description></item></channel></rss>