<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>gh-wm</title>
    <link>https://an-lee.github.io/gh-wm/</link>
    <description>Recent content on gh-wm</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://an-lee.github.io/gh-wm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/architecture-review/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/architecture-review/</guid>
      <description>&lt;h1 id=&#34;architecture-review-and-roadmap&#34;&gt;Architecture review and roadmap&lt;/h1&gt;
&lt;p&gt;This document complements &lt;a href=&#34;https://an-lee.github.io/gh-wm/architecture/&#34;&gt;architecture.md&lt;/a&gt;
 with a &lt;strong&gt;design review&lt;/strong&gt; of gh-wm, a &lt;strong&gt;target module layout&lt;/strong&gt; for extensibility, and a &lt;strong&gt;phased refactor roadmap&lt;/strong&gt; (v2). It is the canonical place for “why we’re changing structure” decisions.&lt;/p&gt;
&lt;h2 id=&#34;goals-recap&#34;&gt;Goals (recap)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gh-aw compatibility&lt;/strong&gt; for task Markdown + YAML frontmatter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No compile step&lt;/strong&gt; for workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thin GitHub coordination&lt;/strong&gt; (issues, labels, Actions, PRs).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe outputs&lt;/strong&gt; as a policy boundary between agent intent and GitHub writes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;strengths&#34;&gt;Strengths&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Clear &lt;strong&gt;five-phase pipeline&lt;/strong&gt; (&lt;code&gt;activation → agent → validation → safe-outputs → conclusion-defer&lt;/code&gt;) with deferred cleanup that survives early failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI / engine / infra split&lt;/strong&gt;: &lt;code&gt;cmd/&lt;/code&gt; stays thin; &lt;code&gt;internal/engine/&lt;/code&gt; orchestrates; GitHub I/O is isolated behind helpers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-run artifacts&lt;/strong&gt; (&lt;code&gt;prompt.md&lt;/code&gt;, &lt;code&gt;output.jsonl&lt;/code&gt;, agent transcript, &lt;code&gt;meta.json&lt;/code&gt;, &lt;code&gt;result.json&lt;/code&gt;, optional &lt;code&gt;run.json&lt;/code&gt;) support debugging and CI introspection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loop prevention&lt;/strong&gt; is layered: workflow (&lt;code&gt;concurrency&lt;/code&gt;, &lt;code&gt;if:&lt;/code&gt; on actor), resolver (bot sender), and content (&lt;code&gt;&amp;lt;!-- wm-agent:&lt;/code&gt; marker on wm-authored comments).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Declarative tasks&lt;/strong&gt; keep community workflows portable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;weaknesses-prioritized&#34;&gt;Weaknesses (prioritized)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Engine selection&lt;/strong&gt; was historically a single switch in &lt;code&gt;runAgent&lt;/code&gt;; extending backends required touching multiple files. &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;internal/engine/engines&lt;/code&gt; package with a small &lt;code&gt;Engine&lt;/code&gt; interface.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safe outputs&lt;/strong&gt; were a large &lt;code&gt;switch&lt;/code&gt;; new kinds touched parse, policy, prompt, and execution. &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;output.Handler&lt;/code&gt; registry (one file per kind).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Frontmatter&lt;/strong&gt; used &lt;code&gt;map[string]any&lt;/code&gt; with ad-hoc accessors; invalid shapes surfaced late. &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;internal/config/spec&lt;/code&gt; typed views + validation at load time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub I/O&lt;/strong&gt; mixed &lt;code&gt;gh api&lt;/code&gt; helpers and direct &lt;code&gt;exec.Command(&amp;quot;gh&amp;quot;, …)&lt;/code&gt; calls. &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;internal/gh&lt;/code&gt; REST client (via &lt;code&gt;github.com/cli/go-gh/v2/pkg/api&lt;/code&gt;) with typed errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global config cache&lt;/strong&gt; (&lt;code&gt;sync.Map&lt;/code&gt; in &lt;code&gt;config.Load&lt;/code&gt;) is convenient for CLI but hurts long-lived processes/tests. &lt;strong&gt;Mitigation:&lt;/strong&gt; documented; optional future &lt;code&gt;Loader&lt;/code&gt; type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phase bookkeeping&lt;/strong&gt; in &lt;code&gt;RunTask&lt;/code&gt; was manual (easy to miss &lt;code&gt;UpdateMeta&lt;/code&gt;). &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;engine/pipeline&lt;/code&gt; helpers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow generator&lt;/strong&gt; duplicated two large YAML templates. &lt;strong&gt;Mitigation:&lt;/strong&gt; single template with an &lt;code&gt;Inline&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability&lt;/strong&gt; mixed &lt;code&gt;log.Printf&lt;/code&gt; and stderr banners. &lt;strong&gt;Mitigation:&lt;/strong&gt; &lt;code&gt;log/slog&lt;/code&gt; with run-id attributes where wired.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;timeout-minutes&lt;/code&gt;&lt;/strong&gt; lived in &lt;code&gt;cmd/run&lt;/code&gt; only; library callers of &lt;code&gt;RunTask&lt;/code&gt; did not get the same timeout. &lt;strong&gt;Mitigation (v2):&lt;/strong&gt; timeout applied inside &lt;code&gt;RunTask&lt;/code&gt; / CLI delegates.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;current-module-graph&#34;&gt;Current module graph&lt;/h2&gt;
&lt;div class=&#34;mermaid&#34;&gt;flowchart LR
  cmd[cmd CLI]
  engine[internal/engine]
  config[internal/config]
  trigger[internal/trigger]
  output[internal/output]
  gen[internal/gen]
  schedule[internal/schedule]
  antiloop[internal/antiloop]
  ghclient[internal/ghclient]
  ghapi[internal/gh]
  git[internal/gitbranch and gitstatus]
  types[internal/types]
  cp[internal/checkpoint]
  tpl[internal/templates]

  cmd --&amp;gt; engine
  cmd --&amp;gt; config
  cmd --&amp;gt; gen
  cmd --&amp;gt; tpl
  cmd --&amp;gt; ghclient

  engine --&amp;gt; config
  engine --&amp;gt; trigger
  engine --&amp;gt; output
  engine --&amp;gt; ghclient
  engine --&amp;gt; ghapi
  engine --&amp;gt; git
  engine --&amp;gt; cp
  engine --&amp;gt; types
  engine --&amp;gt; antiloop
  engine --&amp;gt; schedule

  output --&amp;gt; config
  output --&amp;gt; ghclient
  output --&amp;gt; ghapi
  output --&amp;gt; git
  output --&amp;gt; trigger
  output --&amp;gt; types

  trigger --&amp;gt; config
  trigger --&amp;gt; schedule
  trigger --&amp;gt; types

  gen --&amp;gt; config
  gen --&amp;gt; schedule&lt;/div&gt;
&lt;h2 id=&#34;target-architecture&#34;&gt;Target architecture&lt;/h2&gt;
&lt;div class=&#34;mermaid&#34;&gt;flowchart LR
  cmd[cmd]
  pipeline[engine pipeline helpers]
  engines[engine/engines]
  cfg[config spec plus raw]
  trig[trigger plus schedule]
  outputs[output registry]
  gh[internal/gh REST]
  antiloop[internal/antiloop]
  obs[slog plus metrics]
  gen[gen workflow]

  cmd --&amp;gt; pipeline
  pipeline --&amp;gt; engines
  pipeline --&amp;gt; cfg
  pipeline --&amp;gt; trig
  pipeline --&amp;gt; outputs
  pipeline --&amp;gt; antiloop
  pipeline --&amp;gt; obs
  engines --&amp;gt; gh
  outputs --&amp;gt; gh
  pipeline --&amp;gt; gh
  gen --&amp;gt; cfg
  trig --&amp;gt; cfg&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Boundaries:&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/architecture/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/architecture/</guid>
      <description>&lt;h1 id=&#34;architecture&#34;&gt;Architecture&lt;/h1&gt;
&lt;h2 id=&#34;goals-design-intent&#34;&gt;Goals (design intent)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;gh-aw format compatibility&lt;/strong&gt;: Task files use Markdown + YAML frontmatter like &lt;a href=&#34;https://github.github.io/gh-aw/&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;Agentic Workflows (gh-aw)&lt;/a&gt;
; you can drop community workflows into &lt;code&gt;.wm/tasks/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No compile step&lt;/strong&gt;: No &lt;code&gt;.lock.yml&lt;/code&gt;, no &lt;code&gt;gh aw compile&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go + &lt;code&gt;go-gh&lt;/code&gt;&lt;/strong&gt;: GitHub auth follows &lt;code&gt;gh auth login&lt;/code&gt; (see &lt;a href=&#34;https://github.com/an-lee/gh-wm/tree/main/internal/ghclient&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;internal/ghclient&lt;/code&gt;&lt;/a&gt;
 for API usage from commands like &lt;code&gt;assign&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thin coordination on GitHub&lt;/strong&gt;: Issues, labels, Actions, PRs—no extra control plane.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;high-level-pipeline&#34;&gt;High-level pipeline&lt;/h2&gt;
&lt;p&gt;Each task follows &lt;strong&gt;trigger → resolve → run&lt;/strong&gt; (&lt;code&gt;RunTask&lt;/code&gt;). The run is a &lt;strong&gt;five-phase pipeline&lt;/strong&gt; in-process (no gh-aw-style compile): &lt;strong&gt;activation&lt;/strong&gt; (event/task validation, feature branch for PR mode, &lt;strong&gt;per-run artifact dir&lt;/strong&gt; under &lt;code&gt;.wm/runs/&lt;/code&gt; or &lt;code&gt;WM_RUN_DIR&lt;/code&gt;), &lt;strong&gt;agent&lt;/strong&gt; (&lt;code&gt;runAgent&lt;/code&gt; subprocess — &lt;strong&gt;&lt;code&gt;WM_SAFE_OUTPUT_FILE&lt;/code&gt;&lt;/strong&gt; set to per-run &lt;strong&gt;&lt;code&gt;output.jsonl&lt;/code&gt;&lt;/strong&gt; when a run dir exists), &lt;strong&gt;validation&lt;/strong&gt; (successful exit and output size bound; context deadline surfaced as timeout), &lt;strong&gt;safe-outputs&lt;/strong&gt; (&lt;a href=&#34;https://github.com/an-lee/gh-wm/tree/main/internal/output&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;internal/output&lt;/code&gt;&lt;/a&gt;
 — reads &lt;strong&gt;&lt;code&gt;output.jsonl&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;gh wm emit&lt;/code&gt;) when &lt;code&gt;safe-outputs:&lt;/code&gt; is non-empty; &lt;strong&gt;&lt;code&gt;max:&lt;/code&gt;&lt;/strong&gt; / label allowlists enforced; empty output warns and succeeds), and &lt;strong&gt;conclusion&lt;/strong&gt; (&lt;code&gt;defer&lt;/code&gt;: checkpoint comment, branch rollback on failure, &lt;strong&gt;&lt;code&gt;result.json&lt;/code&gt;&lt;/strong&gt;). &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/engine/runner.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;RunTask&lt;/code&gt;&lt;/a&gt;
 returns a &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/types/types.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;types.RunResult&lt;/code&gt;&lt;/a&gt;
 with &lt;code&gt;Phase&lt;/code&gt;, &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;Errors&lt;/code&gt;, &lt;code&gt;RunDir&lt;/code&gt;, and &lt;code&gt;AgentResult&lt;/code&gt;; &lt;code&gt;wm run&lt;/code&gt; logs &lt;code&gt;phase=&lt;/code&gt; and &lt;code&gt;artifacts=&lt;/code&gt; on stderr when a run directory is created.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/cli-reference/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/cli-reference/</guid>
      <description>&lt;h1 id=&#34;cli-reference&#34;&gt;CLI reference&lt;/h1&gt;
&lt;p&gt;The extension is invoked as &lt;strong&gt;&lt;code&gt;gh wm &amp;lt;subcommand&amp;gt;&lt;/code&gt;&lt;/strong&gt; when installed via &lt;code&gt;gh extension install&lt;/code&gt;. Building from source produces a binary named &lt;strong&gt;&lt;code&gt;gh-wm&lt;/code&gt;&lt;/strong&gt; (same commands as the root Cobra app in &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/cmd/root.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;cmd/root.go&lt;/code&gt;&lt;/a&gt;
).&lt;/p&gt;
&lt;h2 id=&#34;global&#34;&gt;Global&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Root use string&lt;/strong&gt;: &lt;code&gt;gh-wm&lt;/code&gt; (binary name).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Short description&lt;/strong&gt;: GitHub Workflow Manager — run gh-aw-style task markdown in CI.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;version&#34;&gt;&lt;code&gt;version&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Purpose:&lt;/strong&gt; Print the installed &lt;code&gt;gh-wm&lt;/code&gt; version (and optional Git commit line for release builds).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gh wm version&lt;/code&gt; — prints &lt;code&gt;gh-wm &amp;lt;version&amp;gt;&lt;/code&gt; on one line; if the binary was built with a commit SHA (release workflow), prints &lt;code&gt;commit: &amp;lt;short-sha&amp;gt;&lt;/code&gt; on a second line.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh wm --version&lt;/code&gt; / &lt;code&gt;gh wm -v&lt;/code&gt; — same version string via the root Cobra flag.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Local and CI builds without linker flags report &lt;strong&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/strong&gt;. Release assets built from a git tag embed the tag (without the leading &lt;code&gt;v&lt;/code&gt;) and a short commit hash. See &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/cmd/version.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;cmd/version.go&lt;/code&gt;&lt;/a&gt;
 and &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/.github/workflows/release.yml&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;.github/workflows/release.yml&lt;/code&gt;&lt;/a&gt;
.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/development/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/development/</guid>
      <description>&lt;h1 id=&#34;development-guide&#34;&gt;Development guide&lt;/h1&gt;
&lt;p&gt;How to build, test, and extend &lt;strong&gt;gh-wm&lt;/strong&gt;. Pair this with &lt;a href=&#34;https://an-lee.github.io/gh-wm/architecture/&#34;&gt;architecture.md&lt;/a&gt;
 (especially &lt;a href=&#34;architecture.md#runtask-pipeline-detailed-reference&#34;&gt;RunTask pipeline (detailed reference)&lt;/a&gt;
 for reads, writes, and persistence per phase).&lt;/p&gt;
&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go&lt;/strong&gt; (see &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/go.mod&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;go.mod&lt;/code&gt;&lt;/a&gt;
 for version).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;gh&lt;/code&gt;&lt;/strong&gt; CLI for local commands that shell out (&lt;code&gt;assign&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;, outputs).&lt;/li&gt;
&lt;li&gt;Optional: &lt;strong&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/strong&gt; CLI for default &lt;code&gt;run&lt;/code&gt; behavior, or set &lt;strong&gt;&lt;code&gt;WM_AGENT_CMD&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;build-and-run&#34;&gt;Build and run&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# From repo root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;go build -o gh-wm .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./gh-wm resolve --payload /path/to/event.json --event-name issues --json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./gh-wm run --task implement --payload /path/to/event.json --event-name issues
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;run&lt;/code&gt;&lt;/strong&gt; expects a &lt;strong&gt;clean git working tree&lt;/strong&gt; at &lt;code&gt;--repo-root&lt;/code&gt; (use &lt;code&gt;--allow-dirty&lt;/code&gt; to skip). A short banner prints to stderr (task, branch, engine), then agent output streams to stderr; a summary line prints when the run finishes.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/faq/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/faq/</guid>
      <description>&lt;h1 id=&#34;faq&#34;&gt;FAQ&lt;/h1&gt;
&lt;p&gt;Short answers about &lt;strong&gt;how gh-wm works&lt;/strong&gt; and &lt;strong&gt;why it is designed this way&lt;/strong&gt;. For full detail, see the linked docs.&lt;/p&gt;
&lt;h2 id=&#34;what-is-this-and-why-use-it&#34;&gt;What is this and why use it?&lt;/h2&gt;
&lt;h3 id=&#34;what-is-gh-wm-in-one-sentence&#34;&gt;What is gh-wm in one sentence?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;gh-wm&lt;/strong&gt; is a Go &lt;a href=&#34;https://docs.github.com/en/github-cli/github-cli/creating-github-cli-extensions&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;gh&lt;/code&gt; CLI extension&lt;/a&gt;
 that reads Markdown tasks under &lt;code&gt;.wm/tasks/&lt;/code&gt;, matches them to a GitHub event, runs an agent subprocess with the task body as the prompt, then optionally validates and applies &lt;strong&gt;safe outputs&lt;/strong&gt; (comments, labels, PRs, etc.) according to each task’s policy. The pipeline is &lt;strong&gt;event → resolve → run&lt;/strong&gt;; see &lt;a href=&#34;https://an-lee.github.io/gh-wm/architecture/&#34;&gt;Architecture&lt;/a&gt;
 and the &lt;a href=&#34;https://an-lee.github.io/gh-wm/_index/&#34;&gt;index&lt;/a&gt;
 mental model.&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/task-format/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/task-format/</guid>
      <description>&lt;h1 id=&#34;task-file-format&#34;&gt;Task file format&lt;/h1&gt;
&lt;p&gt;Tasks live under &lt;strong&gt;&lt;code&gt;.wm/tasks/&lt;/code&gt;&lt;/strong&gt; as &lt;code&gt;*.md&lt;/code&gt; files. The &lt;strong&gt;filename without &lt;code&gt;.md&lt;/code&gt;&lt;/strong&gt; is the &lt;strong&gt;task name&lt;/strong&gt; (e.g. &lt;code&gt;implement.md&lt;/code&gt; → &lt;code&gt;implement&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id=&#34;layout&#34;&gt;Layout&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.wm/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  config.yml           # Global defaults
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  tasks/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    implement.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    code-review.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    …
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;frontmatter--body&#34;&gt;Frontmatter + body&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YAML frontmatter&lt;/strong&gt; is required: first line &lt;code&gt;---&lt;/code&gt;, closing &lt;code&gt;---&lt;/code&gt;, then the &lt;strong&gt;markdown body&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;body&lt;/strong&gt; is the &lt;strong&gt;agent prompt&lt;/strong&gt; (plus optional files appended per &lt;code&gt;.wm/config.yml&lt;/code&gt;—see below).&lt;/li&gt;
&lt;li&gt;Files named &lt;code&gt;*.md.disabled&lt;/code&gt; are skipped (&lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/config/frontmatter.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;LoadTasksDir&lt;/code&gt;&lt;/a&gt;
).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;minimal-example&#34;&gt;Minimal example&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description: Short summary for humans and status output.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;on:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  issues:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    types: [labeled]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;engine: claude
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Do the work
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Instructions for the agent…
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;wmconfigyml-global&#34;&gt;&lt;code&gt;.wm/config.yml&lt;/code&gt; (global)&lt;/h2&gt;
&lt;p&gt;Loaded by &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/config/config.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;config.Load&lt;/code&gt;&lt;/a&gt;
. Struct: &lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/config/types.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;GlobalConfig&lt;/code&gt;&lt;/a&gt;
. &lt;strong&gt;Machine-readable schema:&lt;/strong&gt; &lt;a href=&#34;global-schema.json&#34;&gt;global-schema.json&lt;/a&gt;
 (subset; extra keys allowed).&lt;/p&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://an-lee.github.io/gh-wm/v2/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://an-lee.github.io/gh-wm/v2/</guid>
      <description>&lt;h1 id=&#34;v2-breaking-changes-planned--in-progress&#34;&gt;v2 breaking changes (planned / in progress)&lt;/h1&gt;
&lt;p&gt;This page consolidates &lt;strong&gt;user-visible&lt;/strong&gt; cleanups targeted for a &lt;strong&gt;v2&lt;/strong&gt; release. Some items below are &lt;strong&gt;done&lt;/strong&gt; in current main; others remain planned.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Area&lt;/th&gt;
          &lt;th&gt;Change&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;engine: copilot&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Removed&lt;/strong&gt; — use &lt;strong&gt;&lt;code&gt;WM_AGENT_CMD&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/strong&gt; / &lt;strong&gt;&lt;code&gt;codex&lt;/code&gt;&lt;/strong&gt;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Legacy &lt;code&gt;WM_OUTPUT_FILE&lt;/code&gt; / single-file &lt;code&gt;output.json&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Removed&lt;/strong&gt; — safe outputs are &lt;strong&gt;NDJSON only&lt;/strong&gt; via &lt;strong&gt;&lt;code&gt;gh wm emit&lt;/code&gt;&lt;/strong&gt; → &lt;strong&gt;&lt;code&gt;WM_SAFE_OUTPUT_FILE&lt;/code&gt;&lt;/strong&gt;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;safe-outputs:&lt;/code&gt; keys&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Prefer &lt;strong&gt;dash&lt;/strong&gt; form (&lt;code&gt;add-labels&lt;/code&gt;, &lt;code&gt;create-pull-request&lt;/code&gt;) to match gh-aw. Underscore keys in YAML may warn; v2 may canonicalize item types separately (see &lt;a href=&#34;https://an-lee.github.io/gh-wm/task-format/&#34;&gt;task-format&lt;/a&gt;
).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;tools:&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;v2 may require a structured shape (&lt;code&gt;allowed&lt;/code&gt; / &lt;code&gt;denied&lt;/code&gt;) and translate per engine (&lt;code&gt;--allowed-tools&lt;/code&gt;, etc.).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;&lt;code&gt;timeout-minutes&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Enforced inside &lt;strong&gt;&lt;a href=&#34;https://github.com/an-lee/gh-wm/blob/main/internal/engine/runner.go&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;engine.RunTask&lt;/code&gt;&lt;/a&gt;
&lt;/strong&gt; so library callers and CLI share the same deadline (parent &lt;code&gt;context&lt;/code&gt; deadlines still cap the run when stricter).&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Artifacts&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Each run writes &lt;strong&gt;&lt;code&gt;run.json&lt;/code&gt;&lt;/strong&gt; (merged &lt;strong&gt;&lt;code&gt;meta.json&lt;/code&gt;&lt;/strong&gt; + outcome fields) alongside &lt;strong&gt;&lt;code&gt;meta.json&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;result.json&lt;/code&gt;&lt;/strong&gt;.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;GitHub API&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Default &lt;strong&gt;&lt;code&gt;internal/ghclient&lt;/code&gt;&lt;/strong&gt; uses the &lt;strong&gt;&lt;code&gt;gh&lt;/code&gt; CLI&lt;/strong&gt; subprocess (&lt;code&gt;gh api&lt;/code&gt;). Set &lt;strong&gt;&lt;code&gt;GH_WM_REST=1&lt;/code&gt;&lt;/strong&gt; to use &lt;strong&gt;&lt;code&gt;go-gh&lt;/code&gt;&lt;/strong&gt; REST from &lt;a href=&#34;https://github.com/an-lee/gh-wm/tree/main/internal/gh&#34; rel=&#34;noopener noreferrer&#34; target=&#34;_blank&#34;&gt;&lt;code&gt;internal/gh&lt;/code&gt;&lt;/a&gt;
.&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;See also &lt;a href=&#34;https://an-lee.github.io/gh-wm/architecture-review/&#34;&gt;Architecture review&lt;/a&gt;
 for the full refactor roadmap.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
