<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Guides on DevFlow</title><link>https://devflow.cloud/docs/guides/</link><description>Recent content in Guides on DevFlow</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://devflow.cloud/docs/guides/index.xml" rel="self" type="application/rss+xml"/><item><title>GitHub integration</title><link>https://devflow.cloud/docs/guides/github/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/github/</guid><description>&lt;p&gt;Opt-in. Disabled by default. Every operation is a no-op when the integration is&#10;off, &lt;code&gt;gh&lt;/code&gt; is missing, or auth has expired — GitHub failures never block your&#10;workflow.&lt;/p&gt;&#10;&lt;h2 id="enable"&gt;Enable&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;repo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;owner/name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;milestone_prefix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;labels&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;objective&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;devflow:objective&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;in_progress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;devflow:in-progress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;gaps&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;devflow:gaps&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Prerequisites: the &lt;code&gt;gh&lt;/code&gt; CLI installed and authenticated. If the auth flow needs a&#10;TTY, hand it off with &lt;code&gt;/devflow:handoff&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools gh status &lt;span class="c1"&gt;# is the integration reachable?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-syncs-and-when"&gt;What syncs, and when&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Trigger&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Action&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Manual equivalent&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;End of &lt;code&gt;/devflow:new-project&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;One milestone per roadmap version, one issue per objective; numbers persisted to &lt;code&gt;.planning/.gh-mapping.json&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;df-tools gh sync-objectives&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Verifier finds gaps&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Posts the &lt;code&gt;gaps:&lt;/code&gt; block from &lt;code&gt;VERIFICATION.md&lt;/code&gt; as an issue comment&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;df-tools gh comment &amp;lt;obj&amp;gt; @file:path&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Verification passes&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Closes the issue with a link to the verification report&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;df-tools gh close-issue &amp;lt;obj&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Tag push &lt;code&gt;vX.Y.Z&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Release notes generated from &lt;code&gt;SUMMARY.md&lt;/code&gt; files since the previous tag&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;df-tools gh sync-release vX.Y.Z&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Manual&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Any of the above&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/devflow:gh-sync [objectives|release &amp;lt;tag&amp;gt;|status]&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Additional CLI surface:&lt;/p&gt;</description></item><item><title>Parallel workstreams</title><link>https://devflow.cloud/docs/guides/workstreams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/workstreams/</guid><description>&lt;p&gt;Wave parallelism runs independent &lt;em&gt;jobs&lt;/em&gt; inside one objective. Workstreams run&#10;independent &lt;em&gt;objectives&lt;/em&gt; — each in its own git worktree and branch.&lt;/p&gt;&#10;&lt;div class="callout warn"&gt;&lt;p class="callout-title"&gt;User-typed only&lt;/p&gt;&#10; &lt;code&gt;/devflow:workstreams&lt;/code&gt; carries &lt;code&gt;disable-model-invocation: true&lt;/code&gt;. Claude cannot fire&#10;it. Creating and merging concurrent worktrees is not something to trigger by&#10;accident.&#10;&lt;/div&gt;&#10;&#10;&lt;h2 id="the-cycle"&gt;The cycle&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:workstreams setup # analyse independence, provision worktrees&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:workstreams status # what&amp;#39;s running where&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:workstreams run # execute across streams&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:workstreams merge # merge completed streams back&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="setup-analyses-independence-first"&gt;Setup analyses independence first&lt;/h2&gt;&#10;&lt;p&gt;Not every pair of objectives can run concurrently. &lt;code&gt;setup&lt;/code&gt; runs a dependency&#10;analysis and excludes objectives that touch the same modules, because the merge&#10;would conflict and you would spend more time resolving than you saved.&lt;/p&gt;</description></item><item><title>The handoff watcher</title><link>https://devflow.cloud/docs/guides/handoff/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/handoff/</guid><description>&lt;p&gt;Some commands cannot run in an agent&amp;rsquo;s non-interactive Bash. Without a mechanism,&#10;Claude has to stop and ask you to paste &lt;code&gt;! cmd&lt;/code&gt;, which breaks both its flow and&#10;your concentration.&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;devflow-watch&lt;/code&gt; is a small local daemon that closes that loop.&lt;/p&gt;&#10;&lt;h2 id="quick-start"&gt;Quick start&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;devflow-watch start &lt;span class="c1"&gt;# start the daemon for the current project&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;devflow-watch status &lt;span class="c1"&gt;# verify&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;devflow-watch stop&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is the whole setup. From then on, when Claude tries to run something on the&#10;allowlist, the &lt;code&gt;gate-interactive&lt;/code&gt; hook queues it instead of failing, the daemon&#10;executes it in your interactive shell, and the &lt;code&gt;route-results&lt;/code&gt; hook injects the&#10;result into Claude&amp;rsquo;s next turn.&lt;/p&gt;</description></item><item><title>UI evaluation</title><link>https://devflow.cloud/docs/guides/ui-eval/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/ui-eval/</guid><description>&lt;p&gt;Screenshots that a human glances at are not evidence. The UI eval pipeline captures&#10;each declared UI state, scores it through an offline visual-eval engine, and writes&#10;machine-readable evidence the &lt;code&gt;verifier&lt;/code&gt; consumes and gates on.&lt;/p&gt;&#10;&lt;h2 id="running-it"&gt;Running it&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:ui-eval 6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/devflow:ui-eval path/to/manifest.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-pipeline"&gt;The pipeline&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;declare surfaces → capture each state → score offline → evidence → verifier gates&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; (manifest) (Maestro / Playwright) (visual-eval) (JSON) (pass / fail)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;ui-evaluator&lt;/code&gt; agent drives it. Backend selection is automatic: Flutter&#10;surfaces go through Maestro, web through Playwright.&lt;/p&gt;</description></item><item><title>Telemetry and auditing</title><link>https://devflow.cloud/docs/guides/telemetry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/telemetry/</guid><description>&lt;p&gt;Everything here is local. It reads your own session transcripts on your own machine&#10;and writes to your own filesystem. Nothing is transmitted.&lt;/p&gt;&#10;&lt;h2 id="context-composition"&gt;Context composition&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools context --limit &lt;span class="m"&gt;150&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools context --root /path/to/projects --raw&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recomputes where the context window actually goes, from your own transcripts: tool&#10;results versus tool-call inputs versus assistant text versus images, plus per-tool&#10;call counts and averages.&lt;/p&gt;&#10;&lt;div class="callout"&gt;&lt;p class="callout-title"&gt;Images are priced per block&lt;/p&gt;&#10; &lt;code&gt;df-tools context&lt;/code&gt; prices images at roughly 1,500 tokens per block rather than by&#10;base64 length. Counting base64 characters overstates image cost by about 25× —&#10;that was the one real error in the original context audit.&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;See &lt;a href="https://devflow.cloud/docs/concepts/context-discipline/"&gt;context discipline&lt;/a&gt; for what to do with&#10;the numbers.&lt;/p&gt;</description></item><item><title>Changelog and releases</title><link>https://devflow.cloud/docs/guides/releases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://devflow.cloud/docs/guides/releases/</guid><description>&lt;h2 id="generating-an-entry"&gt;Generating an entry&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools changelog update --version v2.6.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools changelog update --version v2.6.0 --dry-run&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools changelog update --version 1.27.4 --from 6aafba1 --to dcfba83&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;df-tools changelog check 2.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Commits since the last tag are grouped by conventional-commit type:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Prefix&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Section&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Added&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Fixed&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;perf&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Performance&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Changed&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Documentation&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;test&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;grouped accordingly&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;unrecognised&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Other&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;code&gt;--from&lt;/code&gt; / &lt;code&gt;--to&lt;/code&gt; let you backfill an older release with an explicit commit range.&lt;/p&gt;&#10;&lt;h2 id="the-tag-gate"&gt;The tag gate&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;changelog-on-tag&lt;/code&gt; is a &lt;code&gt;PreToolUse(Bash)&lt;/code&gt; hook that fires when an annotated&#10;version tag is about to be created. It enforces two invariants:&lt;/p&gt;</description></item></channel></rss>