create-pmos 0.31.0 → 0.31.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,25 +6,17 @@ timestamp: 2026-07-27
6
6
 
7
7
  # create-pmos
8
8
 
9
- **A product manager's operating system you can adopt in five minutes — no coding expertise
10
- required.** One command puts a disciplined, eval-driven PM workflow inside your own repo:
11
- initiative → PRD → eval rubric → agreed contract → build → three gates. **Any capable coding
12
- agent** does the building — Claude Code, Codex/ChatGPT, Cursor, Gemini, Copilot; PMOS is
13
- provider- and model-agnostic. You do the judging. Everything stays in your folder — no database,
14
- no account, no network calls, no telemetry.
9
+ **A product manager's operating system you can adopt in five minutes — no coding expertise required.** One command puts a disciplined, eval-driven PM workflow inside your own repo: initiative → PRD → eval rubric → agreed contract → build → three gates. **Any capable coding agent** does the building — Claude Code, Codex/ChatGPT, Cursor, Gemini, Copilot; PMOS is provider- and model-agnostic. You do the judging. Everything stays in your folder — no database, no account, no network calls, no telemetry.
15
10
 
16
11
  ## Whose task is what
17
12
 
18
13
  This kit is built on a simple separation of tasks:
19
14
 
20
- - **Your task** is direction and judgment: choose the goals, say what "good" means *before* the
21
- work starts, and accept or return what comes back. That's it — and no one else can do it.
15
+ - **Your task** is direction and judgment: choose the goals, say what "good" means *before* the work starts, and accept or return what comes back. That's it — and no one else can do it.
22
16
  - **The agent's task** is the building: code, documents, analysis, following the written protocol.
23
- - **The kit's task** is keeping both of you honest: gates that can't be sweet-talked, records that
24
- don't rely on memory, and metrics that show the red first.
17
+ - **The kit's task** is keeping both of you honest: gates that can't be sweet-talked, records that don't rely on memory, and metrics that show the red first.
25
18
 
26
- You never need to write code. You need the courage to say what you want, and the final word on
27
- whether you got it — which you already have.
19
+ You never need to write code. You need the courage to say what you want, and the final word on whether you got it — which you already have.
28
20
 
29
21
  ## Getting started (5 minutes)
30
22
 
@@ -54,44 +46,28 @@ Next steps in /home/you/my-product:
54
46
  3. Commit the pmos/ folder. Then follow pmos/AGENTS.md for every run.
55
47
  ```
56
48
 
57
- Do those three lines and setup is over. A fresh kit with zero history is not behind — it is
58
- exactly where every product starts.
49
+ Do those three lines and setup is over. A fresh kit with zero history is not behind — it is exactly where every product starts.
59
50
 
60
- > **Prefer a GUI to a folder of files?** One more command gives you the **Terminal Workspace** — a
61
- > local app that runs your agent sessions as real terminals with the library and gates beside them.
62
- > See [The Terminal Workspace](#the-terminal-workspace-gui-optional) below. It's optional; the
63
- > file-mode workflow above needs nothing but your editor and your agent.
51
+ > **Prefer a GUI to a folder of files?** One more command gives you the **Terminal Workspace** — a local app that runs your agent sessions as real terminals with the library and gates beside them. See [The Terminal Workspace](#the-terminal-workspace-gui-optional) below. It's optional; the file-mode workflow above needs nothing but your editor and your agent.
64
52
 
65
53
  ### Behind a corporate proxy? (403 on install)
66
54
 
67
- On many work laptops, npm goes through a company registry mirror — and a brand-new public package
68
- gets **403 Forbidden** until it's been vetted (a sandboxed AI session's network proxy can do the
69
- same). That's your environment being careful, not something broken — and there are three clean
70
- ways through:
55
+ On many work laptops, npm goes through a company registry mirror — and a brand-new public package gets **403 Forbidden** until it's been vetted (a sandboxed AI session's network proxy can do the same). That's your environment being careful, not something broken — and there are three clean ways through:
71
56
 
72
- 1. **Try a plain terminal first** — if the 403 came from inside an AI-session sandbox, the normal
73
- terminal may just work.
74
- 2. **Ask IT to allowlist `create-pmos`** — a routine request, and an easy one: public npm, MIT,
75
- zero dependencies, no install scripts, no network code.
76
- 3. **The registry-free install** — the package is just a file, so skip the registry entirely.
77
- From any allowed network, download
78
- `https://registry.npmjs.org/create-pmos/-/create-pmos-<version>.tgz`, move it to the work
79
- machine, then:
57
+ 1. **Try a plain terminal first** — if the 403 came from inside an AI-session sandbox, the normal terminal may just work.
58
+ 2. **Ask IT to allowlist `create-pmos`** — a routine request, and an easy one: public npm, MIT, zero dependencies, no install scripts, no network code.
59
+ 3. **The registry-free install** — the package is just a file, so skip the registry entirely. From any allowed network, download `https://registry.npmjs.org/create-pmos/-/create-pmos-<version>.tgz`, move it to the work machine, then:
80
60
 
81
61
  ```bash
82
62
  tar xzf create-pmos-*.tgz
83
63
  node package/bin/create-pmos.js my-product
84
64
  ```
85
65
 
86
- Same result, byte-identical kit, no proxy involved. (Which is fitting — keeping your work
87
- inside your own boundary is the whole point of this kit.)
66
+ Same result, byte-identical kit, no proxy involved. (Which is fitting — keeping your work inside your own boundary is the whole point of this kit.)
88
67
 
89
68
  ## The Terminal Workspace (GUI) — optional
90
69
 
91
- The kit above is files-and-your-agent. If you'd rather **see** the whole loop — your agent sessions
92
- running as real terminals, the library and the gates in the same window — activate the **Terminal
93
- Workspace**: a local companion app that lives entirely on your machine (localhost only, never a
94
- public endpoint).
70
+ The kit above is files-and-your-agent. If you'd rather **see** the whole loop — your agent sessions running as real terminals, the library and the gates in the same window — activate the **Terminal Workspace**: a local companion app that lives entirely on your machine (localhost only, never a public endpoint).
95
71
 
96
72
  ### Activate it — one command
97
73
 
@@ -101,11 +77,8 @@ npx create-pmos@latest workspace
101
77
 
102
78
  That single command does everything:
103
79
 
104
- 1. **Installs the app + puts `pmos` on your PATH.** The workspace hosts real terminal sessions, so
105
- it has one native dependency (`node-pty`) — this is the one step in the whole kit that builds
106
- something. It takes ~20 seconds, once.
107
- 2. **Launches the GUI** — it starts a small localhost server and opens your browser on the current
108
- repo as a workspace.
80
+ 1. **Installs the app + puts `pmos` on your PATH.** The workspace hosts real terminal sessions, so it has one native dependency (`node-pty`) — this is the one step in the whole kit that builds something. It takes ~20 seconds, once.
81
+ 2. **Launches the GUI** — it starts a small localhost server and opens your browser on the current repo as a workspace.
109
82
 
110
83
  From then on, the daily driver is just one word, from any repo folder:
111
84
 
@@ -117,35 +90,20 @@ pmos stop # shut the server down (scrollback is kept; sessions re-att
117
90
  pmos doctor # diagnose the environment (node build tools, PTY spawn test)
118
91
  ```
119
92
 
120
- Close the terminal and your sessions keep running — the server is persistent; `pmos stop` is the
121
- only thing that ends it.
93
+ Close the terminal and your sessions keep running — the server is persistent; `pmos stop` is the only thing that ends it.
122
94
 
123
95
  ### If `pmos` doesn't land on your PATH
124
96
 
125
- Some machines lock down npm's global folder. If the activation prints a warning instead of putting
126
- `pmos` on your PATH, it still opens the GUI — and it tells you the one line to run for the bare
127
- `pmos` command next time (usually `sudo npm install -g …`, or
128
- [point npm's global prefix somewhere you own](https://docs.npmjs.com/resolving-eacces-permissions-errors)
129
- so no `sudo` is ever needed).
97
+ Some machines lock down npm's global folder. If the activation prints a warning instead of putting `pmos` on your PATH, it still opens the GUI — and it tells you the one line to run for the bare `pmos` command next time (usually `sudo npm install -g …`, or [point npm's global prefix somewhere you own](https://docs.npmjs.com/resolving-eacces-permissions-errors) so no `sudo` is ever needed).
130
98
 
131
99
  ### What to expect
132
100
 
133
- - **Requirements:** Node 18+. macOS, Linux, and Windows. Activation (`create-pmos workspace`) builds
134
- `node-pty` once with a C toolchain — most dev machines already have one; `pmos doctor` names the
135
- exact fix if not.
136
- - **It's local and private.** The server binds `127.0.0.1` and is never exposed to the network. Your
137
- agent CLI (Claude Code, Codex, a plain shell) runs **untouched** — its own login, slash commands,
138
- and keybindings all work; the workspace is the terminal, not a wrapper.
139
- - **The gates are the same gates.** `approve` / `return` / `accept` in the GUI write the exact
140
- file-mode records (`state/acceptances.jsonl`) this kit already uses — only ever on your click.
141
- Nothing is recorded automatically.
142
- - **Works with or without the kit.** Best in a repo you've run `create-pmos` in (it reads and writes
143
- `pmos/state/`), but it opens any repo — a plain project just records into the server's own state.
144
-
145
- > **Why this is a separate opt-in.** Vendoring the file-mode kit stays dependency-free and
146
- > proxy-safe — no native builds, no install scripts, nothing fetched. The workspace is the one
147
- > place a native module is unavoidable, so it only ever installs when you explicitly ask for the
148
- > GUI. The app itself ships inside this package; `workspace` builds it, it doesn't download it.
101
+ - **Requirements:** Node 18+. macOS, Linux, and Windows. Activation (`create-pmos workspace`) builds `node-pty` once with a C toolchain — most dev machines already have one; `pmos doctor` names the exact fix if not.
102
+ - **It's local and private.** The server binds `127.0.0.1` and is never exposed to the network. Your agent CLI (Claude Code, Codex, a plain shell) runs **untouched** — its own login, slash commands, and keybindings all work; the workspace is the terminal, not a wrapper.
103
+ - **The gates are the same gates.** `approve` / `return` / `accept` in the GUI write the exact file-mode records (`state/acceptances.jsonl`) this kit already uses — only ever on your click. Nothing is recorded automatically.
104
+ - **Works with or without the kit.** Best in a repo you've run `create-pmos` in (it reads and writes `pmos/state/`), but it opens any repo — a plain project just records into the server's own state.
105
+
106
+ > **Why this is a separate opt-in.** Vendoring the file-mode kit stays dependency-free and proxy-safe — no native builds, no install scripts, nothing fetched. The workspace is the one place a native module is unavoidable, so it only ever installs when you explicitly ask for the GUI. The app itself ships inside this package; `workspace` builds it, it doesn't download it.
149
107
 
150
108
  <details><summary>Running it from a PMOS checkout instead (no npx)</summary>
151
109
 
@@ -160,77 +118,50 @@ pmos # from any folder
160
118
 
161
119
  ## Your first conversation
162
120
 
163
- Open the folder with your coding agent and talk to it like a colleague — clear about the goal,
164
- open about what you don't know. Copy-paste starters:
121
+ Open the folder with your coding agent and talk to it like a colleague — clear about the goal, open about what you don't know. Copy-paste starters:
165
122
 
166
123
  **You have an existing product** (let the agent learn it first):
167
124
 
168
- > Read pmos/AGENTS.md. Then follow pmos/skills/ingest-repo.skill: scan this repository read-only
169
- > and draft what you learn under pmos/okf/product/ for my review. Don't change any product code.
125
+ > Read pmos/AGENTS.md. Then follow pmos/skills/ingest-repo.skill: scan this repository read-only and draft what you learn under pmos/okf/product/ for my review. Don't change any product code.
170
126
 
171
127
  **You have only an idea:**
172
128
 
173
- > Read pmos/AGENTS.md. This is a new product: [two sentences on what it is and who it serves].
174
- > Help me seed pmos/planning/okrs/ with one objective and 2–3 key results, then propose one small
175
- > first initiative — optimized for a fast first win, not for completeness.
129
+ > Read pmos/AGENTS.md. This is a new product: [two sentences on what it is and who it serves]. Help me seed pmos/planning/okrs/ with one objective and 2–3 key results, then propose one small first initiative — optimized for a fast first win, not for completeness.
176
130
 
177
131
  **You know exactly what you want built:**
178
132
 
179
- > Read pmos/AGENTS.md. I want: [describe the outcome]. Create the initiative file, then draft the
180
- > PRD and the eval rubric for my approval before you build anything.
133
+ > Read pmos/AGENTS.md. I want: [describe the outcome]. Create the initiative file, then draft the PRD and the eval rubric for my approval before you build anything.
181
134
 
182
135
  ## The rhythm (every piece of work)
183
136
 
184
- 1. **Name the work.** An initiative file is created in `pmos/state/initiatives/` — anchored to one
185
- of your goals (or, for honest maintenance with no goal, a declared health budget), so nothing
186
- exists "just because."
187
- 2. **Define "good" first.** The agent drafts the spec artifact that fits the work's lane — a PRD +
188
- scoring rubric for a feature (the default), a spike brief for research (`discovery`), a stated
189
- intent for maintenance (`chore`), a content brief for copy (`content`). For a feature you
190
- approve the contract (`PM_approved: true`) before any building — and spike/content briefs get
191
- your sign-off before work starts too; a chore needs only its stated
192
- intent, and an `incident` is the one sanctioned inversion — fix first, record within 48 hours.
193
- Deciding the standard in advance is your task — it is also what makes the agent's verdicts
194
- mean something later.
195
- 3. **The agent builds** on its own branch and opens the work for review. A gate checks that every
196
- change is anchored. If someone (including the agent) skips the protocol, you'll see:
137
+ 1. **Name the work.** An initiative file is created in `pmos/state/initiatives/` — anchored to one of your goals (or, for honest maintenance with no goal, a declared health budget), so nothing exists "just because."
138
+ 2. **Define "good" first.** The agent drafts the spec artifact that fits the work's lane — a PRD + scoring rubric for a feature (the default), a spike brief for research (`discovery`), a stated intent for maintenance (`chore`), a content brief for copy (`content`). For a feature you approve the contract (`PM_approved: true`) before any building — and spike/content briefs get your sign-off before work starts too; a chore needs only its stated intent, and an `incident` is the one sanctioned inversion — fix first, record within 48 hours. Deciding the standard in advance is your task — it is also what makes the agent's verdicts mean something later.
139
+ 3. **The agent builds** on its own branch and opens the work for review. A gate checks that every change is anchored. If someone (including the agent) skips the protocol, you'll see:
197
140
 
198
141
  ```
199
142
  ❌ initiative gate FAILED — Not anchored. Name the branch 'initiative/<id>' or add
200
143
  'Initiative: <id>' to the PR body ... See pmos/AGENTS.md.
201
144
  ```
202
145
 
203
- The gate isn't scolding anyone — it's protecting your standard when you're not looking.
204
- (No GitHub? Run it yourself before merging:
205
- `HEAD_REF=$(git branch --show-current) bash pmos/scripts/gate-initiative.sh`)
146
+ The gate isn't scolding anyone — it's protecting your standard when you're not looking. (No GitHub? Run it yourself before merging: `HEAD_REF=$(git branch --show-current) bash pmos/scripts/gate-initiative.sh`)
147
+
206
148
  4. **An evaluator scores the work** against your rubric — adversarial by design, and advisory:
207
149
 
208
- > Read pmos/AGENTS.md, then follow pmos/skills/evaluator.skill: score the work on branch
209
- > initiative/[id] against its rubric. Be skeptical — try to refute it. Append your verdict to
210
- > pmos/state/evals.jsonl.
150
+ > Read pmos/AGENTS.md, then follow pmos/skills/evaluator.skill: score the work on branch initiative/[id] against its rubric. Be skeptical — try to refute it. Append your verdict to pmos/state/evals.jsonl.
211
151
 
212
- Each dimension of that verdict has to cite a verbatim quote or a file+line from the work
213
- itself. A dimension the evaluator can't evidence is marked `unverified` and scored low — it
214
- never gets a high score on trust.
152
+ Each dimension of that verdict has to cite a verbatim quote or a file+line from the work itself. A dimension the evaluator can't evidence is marked `unverified` and scored low — it never gets a high score on trust.
215
153
 
216
- 5. **You understand it before you judge it.** The same evaluator writes you a plain-language
217
- explainer of what the run actually did — including what it got wrong — ending in a short quiz
218
- you can self-check against. Read that instead of the raw transcript:
154
+ 5. **You understand it before you judge it.** The same evaluator writes you a plain-language explainer of what the run actually did — including what it got wrong — ending in a short quiz you can self-check against. Read that instead of the raw transcript:
219
155
 
220
- > Follow pmos/skills/explain-run.skill: write the explainer + quiz for run [id] to
221
- > pmos/planning/evals/explainers/.
156
+ > Follow pmos/skills/explain-run.skill: write the explainer + quiz for run [id] to pmos/planning/evals/explainers/.
222
157
 
223
- Worth the two minutes on anything that touches a gate. Accepting work you couldn't explain to
224
- someone else is the one watermelon no gate can catch for you.
158
+ Worth the two minutes on anything that touches a gate. Accepting work you couldn't explain to someone else is the one watermelon no gate can catch for you.
225
159
 
226
- 6. **You accept — or return it.** Your merge is the final gate. Returning imperfect work is not
227
- conflict; it's the job. Record your call:
160
+ 6. **You accept — or return it.** Your merge is the final gate. Returning imperfect work is not conflict; it's the job. Record your call:
228
161
 
229
- > I accept this run. Append the acceptance to pmos/state/acceptances.jsonl with pm_label
230
- > "pass" and corrections: [how many things you had to fix].
162
+ > I accept this run. Append the acceptance to pmos/state/acceptances.jsonl with pm_label "pass" and corrections: [how many things you had to fix].
231
163
 
232
- Or record it yourself, no agent needed — the helper validates and appends in one command
233
- (`pmos/AGENTS-HUMAN.md` is the whole protocol on one page for humans):
164
+ Or record it yourself, no agent needed — the helper validates and appends in one command (`pmos/AGENTS-HUMAN.md` is the whole protocol on one page for humans):
234
165
 
235
166
  ```bash
236
167
  pmos/scripts/pmos-log.sh accept <run_id> <initiative_id> pass "one wording fix"
@@ -253,15 +184,9 @@ B2 throughput: 3 accepted run(s)
253
184
  B4 calibration (n=3): raw agreement 100%, TPR 100%, TNR n/a — no PM fails seen (leniency blind spot), ...
254
185
  ```
255
186
 
256
- Reds print first, on purpose — facing facts without flinching is how the numbers stay honest. On
257
- day one it says `UNMEASURABLE — no accepted runs yet`. That's not failure; that's a truthful
258
- starting line. And if the evaluator starts passing everything while you keep fixing things, a
259
- tripwire fires and tells you the judge has gone soft. A weekly prompt, if you'd rather talk than
260
- read:
187
+ Reds print first, on purpose — facing facts without flinching is how the numbers stay honest. On day one it says `UNMEASURABLE — no accepted runs yet`. That's not failure; that's a truthful starting line. And if the evaluator starts passing everything while you keep fixing things, a tripwire fires and tells you the judge has gone soft. A weekly prompt, if you'd rather talk than read:
261
188
 
262
- > Read pmos/state/discoveries.md and run pmos/scripts/metrics.py. Tell me: what's red, what
263
- > friction appeared more than once, and what one improvement you'd propose. Don't change anything
264
- > yet.
189
+ > Read pmos/state/discoveries.md and run pmos/scripts/metrics.py. Tell me: what's red, what friction appeared more than once, and what one improvement you'd propose. Don't change anything yet.
265
190
 
266
191
  ## How it guardrails the SDLC
267
192
 
@@ -276,52 +201,28 @@ Each stage of the loop has a mechanism behind it — not a promise, a mechanism:
276
201
  | Metrics flatter you | **Reds print first**, and a tripwire fires if the evaluator passes everything while you keep fixing things — a green that hides red gets caught |
277
202
  | Tool updates overwrite your data | **Kernel updates never touch your records** — `state/`, `planning/`, `okf/product/` are structurally off-limits to `--update` |
278
203
 
279
- Notice none of these guardrails restrict *you* — they restrict the process, so your judgment is
280
- exercised at the two moments it matters: defining "good" and accepting the result.
204
+ Notice none of these guardrails restrict *you* — they restrict the process, so your judgment is exercised at the two moments it matters: defining "good" and accepting the result.
281
205
 
282
206
  ## Staying on the path (drift protection)
283
207
 
284
- Drift never announces itself — it's always "just this once, it's small." The kit assumes that and
285
- defends structurally rather than relying on discipline:
286
-
287
- - **The protocol is re-taught, not remembered.** The `CLAUDE.md` line makes every fresh agent
288
- session read `pmos/AGENTS.md` before working — so a new session, a new model, or a new teammate
289
- starts on-protocol by default instead of drifting from a stale memory.
290
- - **The gate makes skipping visible.** On GitHub it's a failing check nobody can miss; locally
291
- it's the one command before a merge. The `no-initiative` escape hatch is for anchor-free
292
- trivia only (a typo, a broken link) — real maintenance takes the `chore` lane with a stated
293
- intent, and if you find yourself reaching for the hatch weekly, that's a signal, not a shortcut.
294
- - **The weekly ten minutes is the ritual.** Put `metrics.py` + the discoveries scan on your
295
- calendar. A friction that shows up twice with no decision gets promoted to a rule — that's how
296
- the process improves instead of eroding.
208
+ Drift never announces itself — it's always "just this once, it's small." The kit assumes that and defends structurally rather than relying on discipline:
209
+
210
+ - **The protocol is re-taught, not remembered.** The `CLAUDE.md` line makes every fresh agent session read `pmos/AGENTS.md` before working — so a new session, a new model, or a new teammate starts on-protocol by default instead of drifting from a stale memory.
211
+ - **The gate makes skipping visible.** On GitHub it's a failing check nobody can miss; locally it's the one command before a merge. The `no-initiative` escape hatch is for anchor-free trivia only (a typo, a broken link) — real maintenance takes the `chore` lane with a stated intent, and if you find yourself reaching for the hatch weekly, that's a signal, not a shortcut.
212
+ - **The weekly ten minutes is the ritual.** Put `metrics.py` + the discoveries scan on your calendar. A friction that shows up twice with no decision gets promoted to a rule — that's how the process improves instead of eroding.
297
213
  - **Ask the agent to audit itself.** Any time you feel drift:
298
214
 
299
- > List every merge in the last two weeks. For each: which initiative anchors it, did the rubric
300
- > exist before the build, and is there an acceptance record? Report gaps without fixing them.
215
+ > List every merge in the last two weeks. For each: which initiative anchors it, did the rubric exist before the build, and is there an acceptance record? Report gaps without fixing them.
301
216
 
302
- - **A lapse is data, not a verdict.** If you skipped the ritual for a month, the files show
303
- exactly where the record stops — restart from there. The kit never shames a gap; it just makes
304
- the gap visible enough that you can choose to close it.
217
+ - **A lapse is data, not a verdict.** If you skipped the ritual for a month, the files show exactly where the record stops — restart from there. The kit never shames a gap; it just makes the gap visible enough that you can choose to close it.
305
218
 
306
219
  ## See your workflow — build your own dashboard
307
220
 
308
- The entire state is plain, open files (`state/*.jsonl`, `state/initiatives/*.md`) — which means
309
- **any AI platform can turn it into a dashboard on demand.** No product to buy, no service to
310
- connect. In Claude (or Claude Code) in your product folder, paste:
221
+ The entire state is plain, open files (`state/*.jsonl`, `state/initiatives/*.md`) — which means **any AI platform can turn it into a dashboard on demand.** No product to buy, no service to connect. In Claude (or Claude Code) in your product folder, paste:
311
222
 
312
- > Read pmos/state/initiatives/*.md, pmos/state/runs.jsonl, evals.jsonl, acceptances.jsonl, and
313
- > pmos/state/discoveries.md. Generate a single, self-contained HTML file at pmos/dashboard.html —
314
- > no external scripts or network calls — showing: (1) a board with initiatives as cards in columns
315
- > by stage (intake / spec / build / eval / accepted); (2) the north star (corrections per accepted
316
- > run) and eval pass rate as stat tiles; (3) a recent-runs timeline with verdicts; (4) open
317
- > frictions. Reds and gaps first, then greens.
223
+ > Read pmos/state/initiatives/*.md, pmos/state/runs.jsonl, evals.jsonl, acceptances.jsonl, and pmos/state/discoveries.md. Generate a single, self-contained HTML file at pmos/dashboard.html — no external scripts or network calls — showing: (1) a board with initiatives as cards in columns by stage (intake / spec / build / eval / accepted); (2) the north star (corrections per accepted run) and eval pass rate as stat tiles; (3) a recent-runs timeline with verdicts; (4) open frictions. Reds and gaps first, then greens.
318
224
 
319
- Open `pmos/dashboard.html` in a browser. Regenerate it whenever you want a fresh view (or ask for
320
- it weekly as part of the ritual) — it's disposable by design. On other platforms the same works:
321
- upload or paste the state files to ChatGPT/Gemini and ask for the same artifact. Two rules keep
322
- this safe: the dashboard is a **read-only view, never the system of record** (the files stay the
323
- truth), and if your product is confidential, generate it with a tool that runs where the files
324
- live rather than uploading them elsewhere.
225
+ Open `pmos/dashboard.html` in a browser. Regenerate it whenever you want a fresh view (or ask for it weekly as part of the ritual) — it's disposable by design. On other platforms the same works: upload or paste the state files to ChatGPT/Gemini and ask for the same artifact. Two rules keep this safe: the dashboard is a **read-only view, never the system of record** (the files stay the truth), and if your product is confidential, generate it with a tool that runs where the files live rather than uploading them elsewhere.
325
226
 
326
227
  ## Keeping the kit fresh
327
228
 
@@ -329,1072 +230,501 @@ live rather than uploading them elsewhere.
329
230
  npx create-pmos@latest --update
330
231
  ```
331
232
 
332
- Refreshes the skills, concepts, and scripts only. Your records — `state/`, `planning/`,
333
- `okf/product/` — are yours, and an update never touches them. `pmos/KIT-VERSION` always says
334
- exactly what you're running.
233
+ Refreshes the skills, concepts, and scripts only. Your records — `state/`, `planning/`, `okf/product/` — are yours, and an update never touches them. `pmos/KIT-VERSION` always says exactly what you're running.
234
+
235
+ ## What's new in 0.31.1
236
+
237
+ **Your specs stop arriving in Jira as ragged half-lines. One command repairs the ones already written, and the workspace does it in one click.** Run `npx create-pmos@latest --update` for the command, or `npx create-pmos@latest workspace` for the button.
238
+
239
+ - **Why a wrapped document breaks when you publish it.** A newline inside a paragraph is invisible in markdown — CommonMark joins the lines, GitHub joins them, the workspace joins them — and it is a **line break** in Jira wiki markup, in a Google Doc, and in the markdown→ADF converters an agent uses to publish. If your specs are hard-wrapped at 80 or 100 columns, that is what your tracker receives. Nothing on the far side can undo it, because an accidental wrap and a deliberate break are the same byte in the source.
240
+ - **`node pmos/scripts/md-newlines.js --fix <path>`** joins paragraphs, list items and quoted paragraphs back into one line each, and gives a list, table, fence or heading under prose the blank line it needs. It refuses frontmatter, fenced and indented code, table rows, headings, deliberate two-space hard breaks and setext underlines — and it is idempotent, so running it twice changes nothing the second time. Check first with no flag, or read the change with `--diff`.
241
+ - **The workspace has a `normalize` button** in the document tab. It fills the buffer, not the file: the pane goes dirty, `diff` shows you exactly which lines were joined, and `save` is the same write path as always. A document that is already clean says so instead of going dirty for nothing.
242
+ - **The rule is now in `pmos/AGENTS.md`**, so agents authoring in your repo write one paragraph per line from the start.
243
+ - **Not in this release, said plainly:** nothing repairs your existing files behind your back. The command only touches paths you name, and there is no repo-wide gate — a check that failed on a corpus written before the rule existed would be a check you would have to turn off.
335
244
 
336
245
  ## What's new in 0.31.0
337
246
 
338
- **Recording an acceptance can now carry the one field the calibration metric was missing — and the
339
- Review Gate's own writers stopped writing where they were told not to.**
340
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
341
-
342
- - **The Acceptance gate carries `pm_label`.** Accepting work answers "is this going in?" (D12).
343
- Whether the *evaluator* was right about it (D40) is a different question, and there was nowhere to
344
- put the answer — so every acceptance recorded through the workspace was unlabeled, and Cohen's κ
345
- had nothing to compute against. `POST /api/gate` now accepts `pm_label: pass | fail` when you state
346
- it, refuses anything else rather than silently dropping it, and still never *derives* one from the
347
- fact that you accepted. A label nobody typed is not a label.
348
- - **`accepted: true` with `pm_label: fail` is deliberately legal.** You can accept work whose gate
349
- correctly failed — that is not a contradiction, and forbidding it would erase a whole cell of the
350
- matrix the metric needs.
351
- - **The response tells you whether the label landed**, so a surface can show the gap instead of you
352
- having to know it exists.
247
+ **Recording an acceptance can now carry the one field the calibration metric was missing — and the Review Gate's own writers stopped writing where they were told not to.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
248
+
249
+ - **The Acceptance gate carries `pm_label`.** Accepting work answers "is this going in?" (D12). Whether the *evaluator* was right about it (D40) is a different question, and there was nowhere to put the answer — so every acceptance recorded through the workspace was unlabeled, and Cohen's κ had nothing to compute against. `POST /api/gate` now accepts `pm_label: pass | fail` when you state it, refuses anything else rather than silently dropping it, and still never *derives* one from the fact that you accepted. A label nobody typed is not a label.
250
+ - **`accepted: true` with `pm_label: fail` is deliberately legal.** You can accept work whose gate correctly failed — that is not a contradiction, and forbidding it would erase a whole cell of the matrix the metric needs.
251
+ - **The response tells you whether the label landed**, so a surface can show the gap instead of you having to know it exists.
353
252
 
354
253
  ## What's new in 0.30.1
355
254
 
356
- **Open a markdown file in the workspace and you get the document, not its source. And scrolling
357
- down stays scrolled down.**
358
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
359
-
360
- - **The document pane renders markdown properly.** Bold was asterisks, inline code was backticks, a
361
- table was one paragraph per row with the pipes still in it, and a numbered procedure was a single
362
- run-on paragraph. An indented sub-bullet was worse than unstyled — it escaped the list it belonged
363
- inside and reappeared underneath it. `view` now renders headings 1–6, soft-wrapped paragraphs,
364
- ordered / nested / task lists, GFM tables with per-column alignment, fenced code, blockquotes and
365
- rules, plus bold, italic, inline code, strikethrough, links and images. Rubrics and skills — the
366
- documents this workflow is written in — are readable in the pane for the first time.
367
- - **A `.md` link opens that document.** Click a link to another file in your repo and it opens as a
368
- tab, resolved against the document you are reading (or the repo root for a `/planning/…` path). A
369
- link to something the pane cannot open stays as plain text rather than becoming a dead link.
370
- - **Nothing is fetched because you opened a file.** A repo-relative image is streamed by your own
371
- local workspace; a remote or `data:` image stays as its alt text and is never requested. The
372
- renderer builds DOM nodes and never assigns HTML, so a `<script>` in a markdown file is characters
373
- on the screen, not a script.
374
- - **Scrolling a document survives a repaint.** The pane rebuilt its scrolling element on every
375
- redraw, so anything that changed state anywhere — including the four-second session poll, which
376
- fires whenever an agent beside you is working — took a half-read document back to line 1. The
377
- scroll element is now kept, per tab and per mode, the same way the edit box keeps your caret.
378
- Holds for `view`, `raw` and `diff`.
379
- - **Not in this release, said plainly:** this is a workspace-app fix. The file-mode kit — skills,
380
- scripts, state layout — is unchanged, so `--update` has nothing new to give you. Syntax
381
- highlighting inside code fences, footnotes and rendered inline HTML are deliberately not included.
255
+ **Open a markdown file in the workspace and you get the document, not its source. And scrolling down stays scrolled down.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
256
+
257
+ - **The document pane renders markdown properly.** Bold was asterisks, inline code was backticks, a table was one paragraph per row with the pipes still in it, and a numbered procedure was a single run-on paragraph. An indented sub-bullet was worse than unstyled — it escaped the list it belonged inside and reappeared underneath it. `view` now renders headings 1–6, soft-wrapped paragraphs, ordered / nested / task lists, GFM tables with per-column alignment, fenced code, blockquotes and rules, plus bold, italic, inline code, strikethrough, links and images. Rubrics and skills — the documents this workflow is written in — are readable in the pane for the first time.
258
+ - **A `.md` link opens that document.** Click a link to another file in your repo and it opens as a tab, resolved against the document you are reading (or the repo root for a `/planning/…` path). A link to something the pane cannot open stays as plain text rather than becoming a dead link.
259
+ - **Nothing is fetched because you opened a file.** A repo-relative image is streamed by your own local workspace; a remote or `data:` image stays as its alt text and is never requested. The renderer builds DOM nodes and never assigns HTML, so a `<script>` in a markdown file is characters on the screen, not a script.
260
+ - **Scrolling a document survives a repaint.** The pane rebuilt its scrolling element on every redraw, so anything that changed state anywhere — including the four-second session poll, which fires whenever an agent beside you is working — took a half-read document back to line 1. The scroll element is now kept, per tab and per mode, the same way the edit box keeps your caret. Holds for `view`, `raw` and `diff`.
261
+ - **Not in this release, said plainly:** this is a workspace-app fix. The file-mode kit — skills, scripts, state layout — is unchanged, so `--update` has nothing new to give you. Syntax highlighting inside code fences, footnotes and rendered inline HTML are deliberately not included.
382
262
 
383
263
  ## What's new in 0.30.0
384
264
 
385
- **Your user stories are on the board, and a story can name the Jira issue, Confluence page or
386
- Google Doc it corresponds to — in the file itself. The scratchpad drags up and down.**
387
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
388
-
389
- - **User stories show up on an initiative's artifacts list, in the right place.** The index has
390
- recognised `*-user-stories.md` for a while and nothing downstream used it: stories sorted *below*
391
- the PRD and the rubric they decompose, and the role label was twelve characters in a box built for
392
- eight, so it ran under the file path beside it. Stories now sort directly after the PRD, and the
393
- chip fits. A file in a `planning/stories/` folder counts as a story too, with no suffix needed in
394
- its name.
395
- - **A story can carry its own destination.** Put `jira: ABC-123`, `confluence: SPACE / page` or
396
- `google_doc: <url>` in a story's frontmatter and the workspace draws the ⇄ pill on its row — no
397
- clicking, no re-typing on a second machine, and the tie is in git where an agent reading the file
398
- can see it. It works for any planning document, not only stories.
399
- - **It says what it knows, which is nothing.** That pill reads *declared in the file · nothing has
400
- been checked*. PMOS holds no credential, makes no request, and cannot mark a reference resolved —
401
- only a session carrying your own MCP can do that. A link you record in the panel still wins over
402
- the one in the file, and `unlink` now survives a reload instead of the file quietly putting the
403
- pill back.
404
- - **The scratchpad resizes.** Drag the handle along its top edge — up for taller, down for shorter.
405
- It cannot be dragged shut, it cannot take more than 70% of the panel (the pane above is often a
406
- live terminal), the size sticks across reloads, and `↑`/`↓` work when the handle is focused with
407
- `Home` to reset. Resizing never touches what you have staged in the pad.
408
- - **Not in this release, said plainly:** the `Story` frontmatter type, the gate rule that enforces
409
- it and the `--fix` repair are PMOS-self only and are **not** in this payload. The registry they
410
- enforce is PMOS's own vocabulary, and running it inside your repository would fail files written
411
- to your conventions. The workspace half above works whatever `type:` your story files declare.
412
- Nothing here reads status back from a tracker — there is no "3 of 7 done", and the surface does
413
- not imply there is.
265
+ **Your user stories are on the board, and a story can name the Jira issue, Confluence page or Google Doc it corresponds to — in the file itself. The scratchpad drags up and down.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
266
+
267
+ - **User stories show up on an initiative's artifacts list, in the right place.** The index has recognised `*-user-stories.md` for a while and nothing downstream used it: stories sorted *below* the PRD and the rubric they decompose, and the role label was twelve characters in a box built for eight, so it ran under the file path beside it. Stories now sort directly after the PRD, and the chip fits. A file in a `planning/stories/` folder counts as a story too, with no suffix needed in its name.
268
+ - **A story can carry its own destination.** Put `jira: ABC-123`, `confluence: SPACE / page` or `google_doc: <url>` in a story's frontmatter and the workspace draws the ⇄ pill on its row — no clicking, no re-typing on a second machine, and the tie is in git where an agent reading the file can see it. It works for any planning document, not only stories.
269
+ - **It says what it knows, which is nothing.** That pill reads *declared in the file · nothing has been checked*. PMOS holds no credential, makes no request, and cannot mark a reference resolved — only a session carrying your own MCP can do that. A link you record in the panel still wins over the one in the file, and `unlink` now survives a reload instead of the file quietly putting the pill back.
270
+ - **The scratchpad resizes.** Drag the handle along its top edge — up for taller, down for shorter. It cannot be dragged shut, it cannot take more than 70% of the panel (the pane above is often a live terminal), the size sticks across reloads, and `↑`/`↓` work when the handle is focused with `Home` to reset. Resizing never touches what you have staged in the pad.
271
+ - **Not in this release, said plainly:** the `Story` frontmatter type, the gate rule that enforces it and the `--fix` repair are PMOS-self only and are **not** in this payload. The registry they enforce is PMOS's own vocabulary, and running it inside your repository would fail files written to your conventions. The workspace half above works whatever `type:` your story files declare. Nothing here reads status back from a tracker — there is no "3 of 7 done", and the surface does not imply there is.
414
272
 
415
273
  ## What's new in 0.29.1
416
274
 
417
- **0.29.0 could not reach an existing install. This is that release, delivered.**
418
- Run `npx create-pmos@latest workspace`.
275
+ **0.29.0 could not reach an existing install. This is that release, delivered.** Run `npx create-pmos@latest workspace`.
419
276
 
420
- - **If you are on 0.28.0, 0.29.0 never upgraded you.** The launcher decides whether to reinstall by
421
- comparing the bundled workspace-app version against the installed one, and 0.29.0 shipped with the
422
- app version left at `0.28.0` — so the comparison came out equal and the upgrade was silently
423
- skipped. Everything listed below was in the 0.29.0 tarball and unreachable from an existing
424
- install. 0.29.1 bumps both versions together, which is what actually delivers it.
425
- - **The check that catches this already existed and did not run.** An assertion pins the two versions
426
- in lockstep; CI only ran it when `workspace/**` changed, and a release PR touches
427
- `npm-pkg/package.json`. The path filter now includes it, so the guard runs on the diff that breaks
428
- it. This is the second time a version bump has shipped without reaching adopters (0.9.1 was the
429
- first), and the first time the repo could have known.
277
+ - **If you are on 0.28.0, 0.29.0 never upgraded you.** The launcher decides whether to reinstall by comparing the bundled workspace-app version against the installed one, and 0.29.0 shipped with the app version left at `0.28.0` — so the comparison came out equal and the upgrade was silently skipped. Everything listed below was in the 0.29.0 tarball and unreachable from an existing install. 0.29.1 bumps both versions together, which is what actually delivers it.
278
+ - **The check that catches this already existed and did not run.** An assertion pins the two versions in lockstep; CI only ran it when `workspace/**` changed, and a release PR touches `npm-pkg/package.json`. The path filter now includes it, so the guard runs on the diff that breaks it. This is the second time a version bump has shipped without reaching adopters (0.9.1 was the first), and the first time the repo could have known.
430
279
 
431
280
  **What 0.29.0 carried, now actually delivered:**
432
281
 
433
- - **A skipped Review Gate no longer shows as a green tick.** `workflow-state.js` rendered a
434
- `SKIPPED` verdict — a row that says *judging did not happen* — with the same ✓ it uses for a real
435
- pass, and a `FAIL` likewise. A skip is now `pending` and a fail is `blocked`. If your board looked
436
- greener than your ledger, this is why.
437
- - **A chore that carries a rubric now shows its Review Gate.** The rung decided from the
438
- initiative's **lane**, so any lane that *may* skip a rubric could never surface a verdict it
439
- actually had — the ladder printed *"chore lane carries no rubric"* while a verdict sat unread. It
440
- reads the rubric now, in every lane. This is how a real initiative reached `accept` with its gate
441
- never run.
442
- - **`evaluator.skill`'s final step is runnable.** It told you to persist the verdict through
443
- `save_eval` — a hosted-backend tool that **does not exist in file mode**, which is the mode the kit
444
- runs in. The last instruction of the Review Gate could not be followed. It now names the writer for
445
- your context: `pmos/scripts/pmos-log.sh eval …`.
446
- - **`pmos-log.sh` can record a skipped gate.** Its verdict enum was `PASS|PASS-WITH-FINDINGS|FAIL`,
447
- while `AGENTS.md` tells you *"a gate that was skipped is recorded as skipped — never leave a missing
448
- eval to be read as a pass."* Following that instruction hit an error, and the only compliant option
449
- was to edit the ledger by hand. Now: `pmos-log.sh eval <run> <initiative> SKIPPED "<reason>"`,
450
- which requires the reason and records `score: null`.
451
- - **The kit build now refuses to ship a skill that names a tool you do not have.** That class had
452
- already shipped twice in the same sentence of the same skill. The check runs at build time and
453
- fails the build; its one bound (per-reference, not per-line) is documented in `build-kit.sh`.
454
-
455
- *Not in this release, stated so you do not go looking:* the same upstream round hardened two modules
456
- that the kit does not run — `drive-guard.js` ships inside the workspace bundle but nothing requires
457
- it, and `record-eval.js` is not in the payload at all. Those fixes are real, and they are not
458
- something your kit was relying on.
282
+ - **A skipped Review Gate no longer shows as a green tick.** `workflow-state.js` rendered a `SKIPPED` verdict — a row that says *judging did not happen* — with the same ✓ it uses for a real pass, and a `FAIL` likewise. A skip is now `pending` and a fail is `blocked`. If your board looked greener than your ledger, this is why.
283
+ - **A chore that carries a rubric now shows its Review Gate.** The rung decided from the initiative's **lane**, so any lane that *may* skip a rubric could never surface a verdict it actually had — the ladder printed *"chore lane carries no rubric"* while a verdict sat unread. It reads the rubric now, in every lane. This is how a real initiative reached `accept` with its gate never run.
284
+ - **`evaluator.skill`'s final step is runnable.** It told you to persist the verdict through `save_eval` — a hosted-backend tool that **does not exist in file mode**, which is the mode the kit runs in. The last instruction of the Review Gate could not be followed. It now names the writer for your context: `pmos/scripts/pmos-log.sh eval …`.
285
+ - **`pmos-log.sh` can record a skipped gate.** Its verdict enum was `PASS|PASS-WITH-FINDINGS|FAIL`, while `AGENTS.md` tells you *"a gate that was skipped is recorded as skipped — never leave a missing eval to be read as a pass."* Following that instruction hit an error, and the only compliant option was to edit the ledger by hand. Now: `pmos-log.sh eval <run> <initiative> SKIPPED "<reason>"`, which requires the reason and records `score: null`.
286
+ - **The kit build now refuses to ship a skill that names a tool you do not have.** That class had already shipped twice in the same sentence of the same skill. The check runs at build time and fails the build; its one bound (per-reference, not per-line) is documented in `build-kit.sh`.
287
+
288
+ *Not in this release, stated so you do not go looking:* the same upstream round hardened two modules that the kit does not run — `drive-guard.js` ships inside the workspace bundle but nothing requires it, and `record-eval.js` is not in the payload at all. Those fixes are real, and they are not something your kit was relying on.
459
289
 
460
290
  ## What's new in 0.28.0
461
291
 
462
- **`search everything…` now searches every file in the folder, and any file it finds opens in a tab.**
463
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
464
-
465
- - **The box searched three lists, and the folder was not one of them.** It matched initiative slugs,
466
- paths *declared on* an initiative record, and session names — so a file PMOS had never been told
467
- about could not be found by typing its exact name. Worse, the miss read *"nothing matches — a
468
- successful read of nothing"*, which is the phrase for *we looked and there was nothing there*,
469
- printed after a search that never opened the folder.
470
- - **Type any part of a name or a path.** Every file under the workspace root now matches, at any
471
- depth, whether or not any record mentions it — `README.md`, a script, a CSV you dropped in
472
- yesterday. `node_modules/`, `dist/`, `.git/` and the other junk directories are skipped, exactly as
473
- the folder lens already skips them, so search and the file tree agree about what is in there.
474
- - **Type a phrase that is *inside* a file.** Text files are searched by content too, and the result
475
- names the file **and the line**, so you can see the match before you open anything.
476
- - **Click a result and it opens in a document tab** — the same reader you already use, with `view` ·
477
- `raw` · `edit` · `diff`. A file the reader cannot show (an image, a binary) is still listed, greyed,
478
- and says so, instead of opening a tab onto a failure.
479
- - **It works in every mode.** The search box was rendered in all seven and did something in exactly
480
- one — including doing nothing in the library lens, the one screen that lists files.
481
- - **It tells you what it did not look at.** The walk is bounded so a huge folder can never hang the
482
- box, and any bound that actually bit is stated in the heading. `11 of 1424 searched` is a
483
- different sentence from `BOUNDED — files beyond the walk limit were not looked at`, and you get
484
- whichever one is true. Nothing leaves your machine, as ever.
292
+ **`search everything…` now searches every file in the folder, and any file it finds opens in a tab.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
293
+
294
+ - **The box searched three lists, and the folder was not one of them.** It matched initiative slugs, paths *declared on* an initiative record, and session names — so a file PMOS had never been told about could not be found by typing its exact name. Worse, the miss read *"nothing matches — a successful read of nothing"*, which is the phrase for *we looked and there was nothing there*, printed after a search that never opened the folder.
295
+ - **Type any part of a name or a path.** Every file under the workspace root now matches, at any depth, whether or not any record mentions it — `README.md`, a script, a CSV you dropped in yesterday. `node_modules/`, `dist/`, `.git/` and the other junk directories are skipped, exactly as the folder lens already skips them, so search and the file tree agree about what is in there.
296
+ - **Type a phrase that is *inside* a file.** Text files are searched by content too, and the result names the file **and the line**, so you can see the match before you open anything.
297
+ - **Click a result and it opens in a document tab** — the same reader you already use, with `view` · `raw` · `edit` · `diff`. A file the reader cannot show (an image, a binary) is still listed, greyed, and says so, instead of opening a tab onto a failure.
298
+ - **It works in every mode.** The search box was rendered in all seven and did something in exactly one — including doing nothing in the library lens, the one screen that lists files.
299
+ - **It tells you what it did not look at.** The walk is bounded so a huge folder can never hang the box, and any bound that actually bit is stated in the heading. `11 of 1424 searched` is a different sentence from `BOUNDED — files beyond the walk limit were not looked at`, and you get whichever one is true. Nothing leaves your machine, as ever.
485
300
 
486
301
  ## What's new in 0.26.0
487
302
 
488
- **Your sessions now know which initiative they belong to — whatever branch you are on — and each
489
- initiative shows the agents running on it.** Run `npx create-pmos@latest workspace`; the version bump
490
- means an existing install auto-upgrades.
491
-
492
- - **`NOW · working on` stopped missing sessions.** It could only recognise a session by the *branch*
493
- its folder was on — `initiative/<id>` — which is true of almost no real checkout. Work on `main`,
494
- or on a branch your agent harness named, and the board could not see the agent you had running.
495
- A session now **records** which initiative it is for when you start it from one, so it is
496
- attributed whatever branch you are on, and that survives restarting the workspace.
497
- - **Nothing is guessed, and nothing is hidden.** Where no initiative was recorded, the
498
- `initiative/<id>` branch still answers — and the row tells you when the attribution is only a
499
- branch reading rather than something PMOS was told. A session it genuinely cannot place is listed
500
- under **not on an initiative** instead of vanishing: an agent that is running should never be
501
- invisible on the screen whose job is to tell you what is running.
502
- - **Bind a session that is already running.** `+ bind` records what a session is for — including
503
- every session that was running before this shipped, and any you started outside PMOS. It is stored
504
- as **your declaration**, kept distinct from what PMOS was told first-hand, and re-binding tells you
505
- what it replaced. Binding never touches the process: same session, same folder, still running.
506
- - **The initiative panel lists its live sessions.** Select an initiative and you see the agents on
507
- it, each with the same word the sidebar uses — `needs you` · `working` · `quiet 12m` ·
508
- `maybe blocked` — and its profile.
509
- - **Click one to get to it.** If its tab is already open, you go to that tab. If not, a tab opens
510
- **attached** to the running session, scrollback and all. It never starts a second agent — the row
511
- says which of the two will happen before you click.
303
+ **Your sessions now know which initiative they belong to — whatever branch you are on — and each initiative shows the agents running on it.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
304
+
305
+ - **`NOW · working on` stopped missing sessions.** It could only recognise a session by the *branch* its folder was on — `initiative/<id>` — which is true of almost no real checkout. Work on `main`, or on a branch your agent harness named, and the board could not see the agent you had running. A session now **records** which initiative it is for when you start it from one, so it is attributed whatever branch you are on, and that survives restarting the workspace.
306
+ - **Nothing is guessed, and nothing is hidden.** Where no initiative was recorded, the `initiative/<id>` branch still answers — and the row tells you when the attribution is only a branch reading rather than something PMOS was told. A session it genuinely cannot place is listed under **not on an initiative** instead of vanishing: an agent that is running should never be invisible on the screen whose job is to tell you what is running.
307
+ - **Bind a session that is already running.** `+ bind` records what a session is for — including every session that was running before this shipped, and any you started outside PMOS. It is stored as **your declaration**, kept distinct from what PMOS was told first-hand, and re-binding tells you what it replaced. Binding never touches the process: same session, same folder, still running.
308
+ - **The initiative panel lists its live sessions.** Select an initiative and you see the agents on it, each with the same word the sidebar uses — `needs you` · `working` · `quiet 12m` · `maybe blocked` — and its profile.
309
+ - **Click one to get to it.** If its tab is already open, you go to that tab. If not, a tab opens **attached** to the running session, scrollback and all. It never starts a second agent — the row says which of the two will happen before you click.
512
310
 
513
311
  ## What's new in 0.24.0
514
312
 
515
- **The initiative board says which work is yours, and which of it has an agent running.** Run
516
- `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
517
-
518
- - **A `NOW · working on` group is pinned at the top of the board.** With a few dozen initiatives
519
- filed by objective, the list is in the right *filing* order and the wrong *attention* order — the
520
- one you have an agent running on sits wherever its KR happens to fall. This group collects what
521
- you are actually on, ordered so whatever is **waiting on you** is the first row on the screen.
522
- - **Three signals, ranked and told apart.** An initiative is in the group because a session is live
523
- on its `initiative/<id>` branch, or a working tree is checked out on that branch with nothing
524
- running in it, or you have a tab open on it in this window. They are never merged into one vague
525
- "active" badge — each row's tooltip says which one put it there, and the two weaker ones say
526
- plainly that nothing is running.
527
- - **A live session shows on its own row.** The `#` beside an initiative becomes that session's own
528
- glyph — `◆ needs you`, `● working`, `◇ maybe blocked`, `◼ quiet` — in the same vocabulary the
529
- session sidebar uses. Hovering names **every** session on that initiative with its state, rather
530
- than counting them: the status bar already says how many and never which. Several sessions fold to
531
- the one that most wants you, and `maybe blocked` outranks `working`.
532
- - **The glyphs differ in shape, not just colour**, so the board still reads in greyscale and for a
533
- colour-blind reader.
534
- - **Nothing is re-homed and nothing is invented.** An initiative still appears under its own
535
- objective and KR — the group is a shortcut, not a second filing system — and it disappears
536
- entirely when there is nothing to say. A session PMOS cannot place on an initiative is not placed
537
- on one.
538
- - **Searching for a session name now finds it.** It only ever matched initiatives you had already
539
- opened in that window, and returned nothing for the rest without saying it had not looked.
313
+ **The initiative board says which work is yours, and which of it has an agent running.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
314
+
315
+ - **A `NOW · working on` group is pinned at the top of the board.** With a few dozen initiatives filed by objective, the list is in the right *filing* order and the wrong *attention* order — the one you have an agent running on sits wherever its KR happens to fall. This group collects what you are actually on, ordered so whatever is **waiting on you** is the first row on the screen.
316
+ - **Three signals, ranked and told apart.** An initiative is in the group because a session is live on its `initiative/<id>` branch, or a working tree is checked out on that branch with nothing running in it, or you have a tab open on it in this window. They are never merged into one vague "active" badge — each row's tooltip says which one put it there, and the two weaker ones say plainly that nothing is running.
317
+ - **A live session shows on its own row.** The `#` beside an initiative becomes that session's own glyph — `◆ needs you`, `● working`, `◇ maybe blocked`, `◼ quiet` — in the same vocabulary the session sidebar uses. Hovering names **every** session on that initiative with its state, rather than counting them: the status bar already says how many and never which. Several sessions fold to the one that most wants you, and `maybe blocked` outranks `working`.
318
+ - **The glyphs differ in shape, not just colour**, so the board still reads in greyscale and for a colour-blind reader.
319
+ - **Nothing is re-homed and nothing is invented.** An initiative still appears under its own objective and KR — the group is a shortcut, not a second filing system — and it disappears entirely when there is nothing to say. A session PMOS cannot place on an initiative is not placed on one.
320
+ - **Searching for a session name now finds it.** It only ever matched initiatives you had already opened in that window, and returned nothing for the rest without saying it had not looked.
540
321
 
541
322
  ## What's new in 0.21.0
542
323
 
543
- **The workspace terminal's lines are no longer double-spaced.** Run
544
- `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
545
-
546
- - **A terminal row is 20px instead of 26px.** Agent output in the terminal panel was rendering with
547
- 13.5px of empty space around a 12.5px character — and because agent CLIs print blank lines
548
- between blocks, and those were 26px too, the whole transcript read as nearly double-spaced. It
549
- now matches the spacing the workspace was designed with.
550
- - **Your agent gets more terminal.** This was never only cosmetic: the workspace divides the
551
- panel's height by the row height to decide how many lines to tell the shell it has. The same
552
- panel that reported 21 lines now reports 28, so full-screen agent interfaces have a third more
553
- room to draw into.
554
- - *(If you are curious: the number `1.65` appeared twice in one file and meant two different things.
555
- As a CSS rule it multiplies the font size — 12.5 × 1.65 = 20.6px, which is the design. Handed to
556
- the terminal engine, the same number multiplies the font's own already-leaded box, which is 16px
557
- — giving 26px. A comment in the file asserted the two agreed, which is how it survived.)*
324
+ **The workspace terminal's lines are no longer double-spaced.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
325
+
326
+ - **A terminal row is 20px instead of 26px.** Agent output in the terminal panel was rendering with 13.5px of empty space around a 12.5px character — and because agent CLIs print blank lines between blocks, and those were 26px too, the whole transcript read as nearly double-spaced. It now matches the spacing the workspace was designed with.
327
+ - **Your agent gets more terminal.** This was never only cosmetic: the workspace divides the panel's height by the row height to decide how many lines to tell the shell it has. The same panel that reported 21 lines now reports 28, so full-screen agent interfaces have a third more room to draw into.
328
+ - *(If you are curious: the number `1.65` appeared twice in one file and meant two different things. As a CSS rule it multiplies the font size — 12.5 × 1.65 = 20.6px, which is the design. Handed to the terminal engine, the same number multiplies the font's own already-leaded box, which is 16px — giving 26px. A comment in the file asserted the two agreed, which is how it survived.)*
558
329
 
559
330
  ## What's new in 0.20.1
560
331
 
561
- **An HTML document opens rendered, not as its own source.** Opening an `.html` file in the
562
- workspace's document viewer showed you the markup instead of the page.
332
+ **An HTML document opens rendered, not as its own source.** Opening an `.html` file in the workspace's document viewer showed you the markup instead of the page.
563
333
 
564
334
  ## What's new in 0.20.0
565
335
 
566
- **External links name a real record instead of inventing one.** The Jira/Confluence/Docs link
567
- controls used to fabricate every identifier they recorded. A `+` button now opens a form and
568
- records nothing until you supply the reference or a session resolves it — and `resolved` cannot be
569
- asserted, only evidenced: a row claiming it without naming the profile that resolved it is refused.
570
- PMOS still holds no credential and makes no outbound request; the lookup runs in an agent session
571
- carrying your own MCP.
336
+ **External links name a real record instead of inventing one.** The Jira/Confluence/Docs link controls used to fabricate every identifier they recorded. A `+` button now opens a form and records nothing until you supply the reference or a session resolves it — and `resolved` cannot be asserted, only evidenced: a row claiming it without naming the profile that resolved it is refused. PMOS still holds no credential and makes no outbound request; the lookup runs in an agent session carrying your own MCP.
572
337
 
573
338
  ## What's new in 0.19.0
574
339
 
575
- **A long document scrolls its own panel, and starting a session asks what is already running.** Run
576
- `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
577
-
578
- - **Opening a long document no longer scrolls the whole window.** Scrolling a document in the right
579
- panel moved the entire interface — the top bar slid away, the status bar rose from below — while
580
- the panel's own scrollbar never engaged. Every panel now scrolls inside itself and the app frame
581
- never moves. (If you are curious: the shell's middle row was written `1fr`, which is
582
- `minmax(auto, 1fr)`, so a tall document enlarged the row rather than overflowing it. Every style
583
- involved read as correct, which is why it survived review.)
584
- - **`+ session` now asks before it starts one, when the checkout is already busy.** It used to
585
- start the session and *then* tell you how many others were in there — a count arriving after the
586
- decision, naming something you cannot act on. Now you get a chooser first, listing every session
587
- in that checkout.
588
- - **It says what each one is.** Its name, its agent, the same word the sidebar uses (`working` ·
589
- `quiet 12m` · `needs you` · `maybe blocked`), the agent's own last words, and who holds the writer
590
- claim.
591
- - **…and what ending it would cost, without over-claiming.** Only `needs you` reads as settled —
592
- its turn finished and it is waiting on you. `working` says output is arriving right now. `quiet`
593
- and `maybe blocked` say, in as many words, that the workspace *cannot tell* a finished turn from a
594
- permission prompt from a stuck tool. A confident "safe to end" that discarded a running turn would
595
- be worse than no reading at all.
596
- - **You can take the running session instead of making another.** `open it` attaches a tab to it and
597
- starts nothing. `end it` is there too — the first click arms it and names what it will end, the
598
- second does it. `+ start another session here anyway` is always one click: being told is never
599
- being blocked, and no session is ever refused because another is there.
600
- - **The same detail is written into the new session's scrollback**, so scrolling back tomorrow
601
- answers the same question the chooser did.
340
+ **A long document scrolls its own panel, and starting a session asks what is already running.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
341
+
342
+ - **Opening a long document no longer scrolls the whole window.** Scrolling a document in the right panel moved the entire interface — the top bar slid away, the status bar rose from below — while the panel's own scrollbar never engaged. Every panel now scrolls inside itself and the app frame never moves. (If you are curious: the shell's middle row was written `1fr`, which is `minmax(auto, 1fr)`, so a tall document enlarged the row rather than overflowing it. Every style involved read as correct, which is why it survived review.)
343
+ - **`+ session` now asks before it starts one, when the checkout is already busy.** It used to start the session and *then* tell you how many others were in there — a count arriving after the decision, naming something you cannot act on. Now you get a chooser first, listing every session in that checkout.
344
+ - **It says what each one is.** Its name, its agent, the same word the sidebar uses (`working` · `quiet 12m` · `needs you` · `maybe blocked`), the agent's own last words, and who holds the writer claim.
345
+ - **…and what ending it would cost, without over-claiming.** Only `needs you` reads as settled — its turn finished and it is waiting on you. `working` says output is arriving right now. `quiet` and `maybe blocked` say, in as many words, that the workspace *cannot tell* a finished turn from a permission prompt from a stuck tool. A confident "safe to end" that discarded a running turn would be worse than no reading at all.
346
+ - **You can take the running session instead of making another.** `open it` attaches a tab to it and starts nothing. `end it` is there too — the first click arms it and names what it will end, the second does it. `+ start another session here anyway` is always one click: being told is never being blocked, and no session is ever refused because another is there.
347
+ - **The same detail is written into the new session's scrollback**, so scrolling back tomorrow answers the same question the chooser did.
602
348
 
603
349
  ## What's new in 0.18.1
604
350
 
605
- **Three fixes to the workspace terminal, all of them about what the window knew about a session.**
606
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
607
-
608
- - **Your terminal now uses its whole width.** Nothing ever told the shell how wide the browser
609
- was. A session starts at 80 columns; the server stated its own size on attach rather than
610
- adopting yours, and the browser only spoke up when a resize *changed* its grid — which happened
611
- once, while the connection was still opening and there was no session to tell. So the process on
612
- the other end kept wrapping at 80 columns inside a window three times that wide, and a
613
- full-screen agent CLI painted into a box that was not there.
614
- - **The window stops rebuilding itself while you type.** It repainted every panel every four
615
- seconds whether or not anything had changed — on a project with a hundred-odd initiatives that is
616
- a real stall, on a timer, next to a terminal you are typing into. It now repaints when something
617
- it shows actually moves. Separately, the server rewrote every session's scrollback file to disk
618
- every five seconds, synchronously, whether or not a byte had changed; it now writes only what
619
- moved.
620
- - **The scratchpad belongs to a session again.** It had become one shared buffer for the whole
621
- page, so every terminal — in every repository — showed and overwrote the same text, and none of
622
- it outlived the tab. Each session has its own pad again, saved on your machine, and it comes back
623
- with the session.
624
- - **Reopening the workspace brings your sessions back.** Open tabs are remembered and re-attach to
625
- the exact session they were on, named on the tab so you can tell which one it is. Previously they
626
- were forgotten on reload and had to be re-found by hand — and the re-finding matched on a session
627
- *name*, which is not unique between repositories, so a tab in one project could silently attach
628
- to a shell running in another. `+ session` also always starts a new session now, instead of
629
- sometimes adopting one that was already running.
351
+ **Three fixes to the workspace terminal, all of them about what the window knew about a session.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
352
+
353
+ - **Your terminal now uses its whole width.** Nothing ever told the shell how wide the browser was. A session starts at 80 columns; the server stated its own size on attach rather than adopting yours, and the browser only spoke up when a resize *changed* its grid — which happened once, while the connection was still opening and there was no session to tell. So the process on the other end kept wrapping at 80 columns inside a window three times that wide, and a full-screen agent CLI painted into a box that was not there.
354
+ - **The window stops rebuilding itself while you type.** It repainted every panel every four seconds whether or not anything had changed — on a project with a hundred-odd initiatives that is a real stall, on a timer, next to a terminal you are typing into. It now repaints when something it shows actually moves. Separately, the server rewrote every session's scrollback file to disk every five seconds, synchronously, whether or not a byte had changed; it now writes only what moved.
355
+ - **The scratchpad belongs to a session again.** It had become one shared buffer for the whole page, so every terminal — in every repository — showed and overwrote the same text, and none of it outlived the tab. Each session has its own pad again, saved on your machine, and it comes back with the session.
356
+ - **Reopening the workspace brings your sessions back.** Open tabs are remembered and re-attach to the exact session they were on, named on the tab so you can tell which one it is. Previously they were forgotten on reload and had to be re-found by hand — and the re-finding matched on a session *name*, which is not unique between repositories, so a tab in one project could silently attach to a shell running in another. `+ session` also always starts a new session now, instead of sometimes adopting one that was already running.
630
357
  ## What's new in 0.18.0
631
358
 
632
- **Several sessions in one folder now say so.** Run `npx create-pmos@latest workspace`; the version
633
- bump means an existing install auto-upgrades.
634
-
635
- - **Starting a session where others are already running tells you what you are sharing.** Sessions
636
- in one checkout share one branch, one index and one set of files — that was true before and
637
- nothing said it. The new session's pane now names the sessions already there and points at the
638
- alternative (a new branch in its own folder). It appears on the ordinary "+ session" path too,
639
- where no git operation runs at all: the server had already worked out that other sessions would
640
- be disturbed, and was throwing the answer away unless you happened to pick a branch.
641
- - **It counts the right thing.** A repository registered at two paths — the project root and a
642
- subdirectory of it, the ordinary shape when you add a product repo by path — is **one** checkout,
643
- and its sessions are now told about each other; before, each was told it was alone. Two
644
- *worktrees* of one repository are **two** checkouts and are deliberately not warned about, because
645
- those are the sessions that isolation already made safe. A folder with no git says nothing, since
646
- there is no index to collide over.
647
- - **One session is the declared writer; the rest read.** The first live session in a checkout holds
648
- the claim, and you can hand it to another (`POST /api/tree/claim`); `GET /api/tree/peers` reports
649
- who holds it and who else is there. It moves only when you move it — never on a timer or an exit —
650
- and when its holder exits the checkout reads *vacant* rather than promoting somebody at random.
651
- - **Be clear about what that is: a declaration, not a lock.** The workspace hosts your agent's
652
- terminal; it does not sit between the agent and the files, so nothing here prevents a write, a
653
- checkout or a commit, and no session is ever refused because another one is there. It makes a
654
- shared checkout visible. The discipline stays yours.
655
- - **A folder you are working in can no longer be reclaimed out from under you.** Removing a
656
- worktree already refused when sessions were running in it — but it counted only sessions in the
657
- workspace registered at that exact folder, so a session running in a subdirectory of it was
658
- invisible. It is counted now, and named in the refusal.
359
+ **Several sessions in one folder now say so.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
360
+
361
+ - **Starting a session where others are already running tells you what you are sharing.** Sessions in one checkout share one branch, one index and one set of files — that was true before and nothing said it. The new session's pane now names the sessions already there and points at the alternative (a new branch in its own folder). It appears on the ordinary "+ session" path too, where no git operation runs at all: the server had already worked out that other sessions would be disturbed, and was throwing the answer away unless you happened to pick a branch.
362
+ - **It counts the right thing.** A repository registered at two paths — the project root and a subdirectory of it, the ordinary shape when you add a product repo by path — is **one** checkout, and its sessions are now told about each other; before, each was told it was alone. Two *worktrees* of one repository are **two** checkouts and are deliberately not warned about, because those are the sessions that isolation already made safe. A folder with no git says nothing, since there is no index to collide over.
363
+ - **One session is the declared writer; the rest read.** The first live session in a checkout holds the claim, and you can hand it to another (`POST /api/tree/claim`); `GET /api/tree/peers` reports who holds it and who else is there. It moves only when you move it — never on a timer or an exit — and when its holder exits the checkout reads *vacant* rather than promoting somebody at random.
364
+ - **Be clear about what that is: a declaration, not a lock.** The workspace hosts your agent's terminal; it does not sit between the agent and the files, so nothing here prevents a write, a checkout or a commit, and no session is ever refused because another one is there. It makes a shared checkout visible. The discipline stays yours.
365
+ - **A folder you are working in can no longer be reclaimed out from under you.** Removing a worktree already refused when sessions were running in it — but it counted only sessions in the workspace registered at that exact folder, so a session running in a subdirectory of it was invisible. It is counted now, and named in the refusal.
659
366
 
660
367
  ## What's new in 0.17.0
661
368
 
662
- **Your board stops calling shipped work unstarted.** Run `npx create-pmos@latest workspace`; the
663
- version bump means an existing install auto-upgrades.
664
-
665
- - **An initiative's status is now read from what happened, not from what someone typed.** The
666
- workspace took each initiative's state from a `status:` line written by hand into a PRD and
667
- matched it against a list of words. In the repo this was built in, that one field held 23
668
- different values, 33 initiatives had none at all, and several were cut off mid-sentence by a
669
- stray comma. The plainest value of the lot — `build complete, PR #138` — matched the word
670
- "build" first and displayed as *in progress*. Status is now derived from your acceptance
671
- records, your logged runs, your open items, and your repository's own merge history, and each
672
- row states which of those it was read from. Nothing you type can move it.
673
- - **`delivered` and `accepted` are no longer the same thing.** Work that merged and work you
674
- actually signed off are now separate states. That gap is usually the interesting number: in the
675
- repo this was built in, 62 of 63 delivered initiatives had no acceptance recorded — invisible
676
- while both wore one label.
677
- - **The board reads your whole project history, not just the branch you are standing on.** It
678
- shared a commit range with the CI gate, and that range is *empty* when your branch is level with
679
- `main` — so every initiative reported "no implementation commits" and fell back to its earliest
680
- stage. Work finished weeks ago looked identical to work never begun. The gate still reads only
681
- the pull request, which is correct for judging whether a spec came before its build.
682
- - **A history it cannot read is now said out loud.** In a shallow clone (some CI checkouts) the
683
- delivery history genuinely is not there. The board reports that, with the reason, instead of
684
- quietly showing everything as unstarted — which would look exactly like a project where nothing
685
- has happened.
686
-
687
- Unchanged where it matters: **no database, no network at runtime, no telemetry.** The server still
688
- binds `127.0.0.1` only. The file-mode kit itself is unchanged and still dependency-free.
369
+ **Your board stops calling shipped work unstarted.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
370
+
371
+ - **An initiative's status is now read from what happened, not from what someone typed.** The workspace took each initiative's state from a `status:` line written by hand into a PRD and matched it against a list of words. In the repo this was built in, that one field held 23 different values, 33 initiatives had none at all, and several were cut off mid-sentence by a stray comma. The plainest value of the lot — `build complete, PR #138` — matched the word "build" first and displayed as *in progress*. Status is now derived from your acceptance records, your logged runs, your open items, and your repository's own merge history, and each row states which of those it was read from. Nothing you type can move it.
372
+ - **`delivered` and `accepted` are no longer the same thing.** Work that merged and work you actually signed off are now separate states. That gap is usually the interesting number: in the repo this was built in, 62 of 63 delivered initiatives had no acceptance recorded — invisible while both wore one label.
373
+ - **The board reads your whole project history, not just the branch you are standing on.** It shared a commit range with the CI gate, and that range is *empty* when your branch is level with `main` — so every initiative reported "no implementation commits" and fell back to its earliest stage. Work finished weeks ago looked identical to work never begun. The gate still reads only the pull request, which is correct for judging whether a spec came before its build.
374
+ - **A history it cannot read is now said out loud.** In a shallow clone (some CI checkouts) the delivery history genuinely is not there. The board reports that, with the reason, instead of quietly showing everything as unstarted — which would look exactly like a project where nothing has happened.
375
+
376
+ Unchanged where it matters: **no database, no network at runtime, no telemetry.** The server still binds `127.0.0.1` only. The file-mode kit itself is unchanged and still dependency-free.
689
377
 
690
378
  ## What's new in 0.16.1
691
379
 
692
- **Two fixes on the Terminal Workspace's entry path — how a repository reaches a running workspace.**
693
- Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
694
-
695
- - **`pmos` finds the workspace you already have open, on whatever port it is on.** The launcher used
696
- to assume one port (7433, or whatever `PMOS_WS_PORT` said in that shell). So if another program
697
- held 7433 and you moved the workspace to a different port, the next `pmos` — in a fresh terminal,
698
- in a second repo — looked at 7433, found nothing, and started a *second* server. Your repo was
699
- registered, with a workspace you were not looking at, and nothing anywhere reported an error. The
700
- server now records the port it is serving and every `pmos` command discovers it, so a second repo
701
- joins the workspace on screen. `PMOS_WS_PORT` still pins a port when you want one.
702
- - **A taken port is no longer a dead end.** If something else holds 7433, `pmos` starts on the next
703
- free port and says so, instead of failing with `port 7433 is already in use`. `pmos stop` now stops
704
- every workspace server it can find — which is how you collapse two back into one — and `pmos
705
- doctor` reports which servers are running and, when none is, who holds the port. A failed start
706
- also prints only that attempt's log, so one conflict is reported once rather than three times.
707
- - **The folder chooser is back in "add a product".** Picking a local folder had regressed to a
708
- bare text field in the four-panel surface, so adding a repository meant typing its absolute path.
709
- The `choose…` button opens your machine's own folder dialog again, with an in-app folder browser
710
- standing in on machines that have none. Typing a path still works, and registration is unchanged:
711
- a local folder is registered where it is, and nothing is imported from it.
712
-
713
- Unchanged where it matters: **no database, no network at runtime, no telemetry.** The server still
714
- binds `127.0.0.1` only. The file-mode kit itself is unchanged and still dependency-free — everything
715
- above is in the optional Terminal Workspace GUI.
380
+ **Two fixes on the Terminal Workspace's entry path — how a repository reaches a running workspace.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
381
+
382
+ - **`pmos` finds the workspace you already have open, on whatever port it is on.** The launcher used to assume one port (7433, or whatever `PMOS_WS_PORT` said in that shell). So if another program held 7433 and you moved the workspace to a different port, the next `pmos` — in a fresh terminal, in a second repo — looked at 7433, found nothing, and started a *second* server. Your repo was registered, with a workspace you were not looking at, and nothing anywhere reported an error. The server now records the port it is serving and every `pmos` command discovers it, so a second repo joins the workspace on screen. `PMOS_WS_PORT` still pins a port when you want one.
383
+ - **A taken port is no longer a dead end.** If something else holds 7433, `pmos` starts on the next free port and says so, instead of failing with `port 7433 is already in use`. `pmos stop` now stops every workspace server it can find — which is how you collapse two back into one — and `pmos doctor` reports which servers are running and, when none is, who holds the port. A failed start also prints only that attempt's log, so one conflict is reported once rather than three times.
384
+ - **The folder chooser is back in "add a product".** Picking a local folder had regressed to a bare text field in the four-panel surface, so adding a repository meant typing its absolute path. The `choose…` button opens your machine's own folder dialog again, with an in-app folder browser standing in on machines that have none. Typing a path still works, and registration is unchanged: a local folder is registered where it is, and nothing is imported from it.
385
+
386
+ Unchanged where it matters: **no database, no network at runtime, no telemetry.** The server still binds `127.0.0.1` only. The file-mode kit itself is unchanged and still dependency-free — everything above is in the optional Terminal Workspace GUI.
716
387
 
717
388
  ## What's new in 0.16.0
718
389
 
719
- **The Terminal Workspace is now a four-panel surface.** The three-column layout is retired and
720
- replaced by one built to a PM-authored design: repositories, initiatives, initiative detail, and a
721
- tab strip. Run `npx create-pmos@latest workspace`; the version bump means an existing install
722
- auto-upgrades.
723
-
724
- - **Panel 1 — repositories.** Every repo you've added, with its kind (`⎇` github / `▤` local) and
725
- its initiative count, plus a settings & tools drawer holding the secondary modes — `agents`,
726
- `memory`, `knowledge` for the current repository, and `focus`, `skills`, `connections`,
727
- `scheduled` across all of them.
728
- - **Panel 2 — initiatives, as a channel list.** Collapsible objective/KR groups over `#slug` rows,
729
- one search box that forces the groups open and reports matches elsewhere, and an add form.
730
- Initiatives with no anchor are filed and shown as rejected (D59) rather than quietly hidden.
731
- - **Panel 3 — initiative detail.** The record's pills and derived footer, **task phases** whose
732
- status is derived from the workflow ladder rather than declared, a **links** section for
733
- references that are not repo files, and the artifact list. A record that fails to parse renders
734
- red with the parse error — never a blank panel.
735
- - **Panel 4 — tabs, scoped per repository.** Three kinds side by side: **term** (a real PTY running
736
- your agent CLI untouched), **doc** (view/raw/edit/diff with save, revert and a dirty flag), and
737
- **task** (the task spec view). New session, close, and split.
738
- - **A phone surface.** The same four panels collapse into a mobile navigation model, so triage from
739
- a phone is a first-class path and not a scaled-down desktop.
740
- - **Artifact links are declarations, not integrations.** Linking an artifact to an external
741
- destination appends `{artifact_path, kind, target}` to `pmos/state/artifact-links.jsonl`. The sync
742
- panel is rendered, but with no connector configured its summary line says exactly that — *no
743
- connector configured — nothing was read, and nothing will be written* — and the approval buttons
744
- are disabled. It will not show you a difference it never read.
745
- - **`?fixture=proto`** renders the whole surface from a bundled fixture with no repository at all,
746
- which is also how the design comparison is run. It is never the default path.
747
-
748
- Unchanged where it matters: **no database, no network at runtime, no telemetry.** The front end
749
- loads only same-origin assets — fonts and the terminal emulator are served from the install, never
750
- from a CDN — the server binds `127.0.0.1`, and the only outbound paths remain the ones you invoke
751
- yourself (`git clone` on repo ingest, `pmos upgrade`, and the one-time `npm install` that builds
752
- node-pty). No new runtime dependency was added. The file-mode kit itself is unchanged and still
753
- dependency-free.
390
+ **The Terminal Workspace is now a four-panel surface.** The three-column layout is retired and replaced by one built to a PM-authored design: repositories, initiatives, initiative detail, and a tab strip. Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
391
+
392
+ - **Panel 1 — repositories.** Every repo you've added, with its kind (`⎇` github / `▤` local) and its initiative count, plus a settings & tools drawer holding the secondary modes — `agents`, `memory`, `knowledge` for the current repository, and `focus`, `skills`, `connections`, `scheduled` across all of them.
393
+ - **Panel 2 — initiatives, as a channel list.** Collapsible objective/KR groups over `#slug` rows, one search box that forces the groups open and reports matches elsewhere, and an add form. Initiatives with no anchor are filed and shown as rejected (D59) rather than quietly hidden.
394
+ - **Panel 3 — initiative detail.** The record's pills and derived footer, **task phases** whose status is derived from the workflow ladder rather than declared, a **links** section for references that are not repo files, and the artifact list. A record that fails to parse renders red with the parse error — never a blank panel.
395
+ - **Panel 4 — tabs, scoped per repository.** Three kinds side by side: **term** (a real PTY running your agent CLI untouched), **doc** (view/raw/edit/diff with save, revert and a dirty flag), and **task** (the task spec view). New session, close, and split.
396
+ - **A phone surface.** The same four panels collapse into a mobile navigation model, so triage from a phone is a first-class path and not a scaled-down desktop.
397
+ - **Artifact links are declarations, not integrations.** Linking an artifact to an external destination appends `{artifact_path, kind, target}` to `pmos/state/artifact-links.jsonl`. The sync panel is rendered, but with no connector configured its summary line says exactly that — *no connector configured — nothing was read, and nothing will be written* — and the approval buttons are disabled. It will not show you a difference it never read.
398
+ - **`?fixture=proto`** renders the whole surface from a bundled fixture with no repository at all, which is also how the design comparison is run. It is never the default path.
399
+
400
+ Unchanged where it matters: **no database, no network at runtime, no telemetry.** The front end loads only same-origin assets — fonts and the terminal emulator are served from the install, never from a CDN — the server binds `127.0.0.1`, and the only outbound paths remain the ones you invoke yourself (`git clone` on repo ingest, `pmos upgrade`, and the one-time `npm install` that builds node-pty). No new runtime dependency was added. The file-mode kit itself is unchanged and still dependency-free.
754
401
 
755
402
  ## What's new in 0.15.0
756
403
 
757
- **A major Terminal Workspace rebuild** (#242) — the PM spine, a Claude Design refresh, and a proper
758
- viewer column, plus five new capabilities. Run `npx create-pmos@latest workspace`; the version bump
759
- means an existing install auto-upgrades.
404
+ **A major Terminal Workspace rebuild** (#242) — the PM spine, a Claude Design refresh, and a proper viewer column, plus five new capabilities. Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
760
405
 
761
- - **A Focus queue** — the workspace surfaces what actually needs you, as a queue to work down rather
762
- than a grid to scan.
763
- - **A phone surface** — the workspace now has a real mobile navigation model, so you can triage from
764
- a phone, not only a desktop.
765
- - **Claude profiles** — per-session profile descriptors, so different agent setups are legible at a
766
- glance.
406
+ - **A Focus queue** — the workspace surfaces what actually needs you, as a queue to work down rather than a grid to scan.
407
+ - **A phone surface** — the workspace now has a real mobile navigation model, so you can triage from a phone, not only a desktop.
408
+ - **Claude profiles** — per-session profile descriptors, so different agent setups are legible at a glance.
767
409
  - **Multi-product repo-scan** — the ingest pipeline can scan across more than one product repo.
768
- - **A Jira handoff model** — a links model for handing an initiative off to an external tracker from
769
- the workspace (opt-in; the file-mode kit still needs no network).
410
+ - **A Jira handoff model** — a links model for handing an initiative off to an external tracker from the workspace (opt-in; the file-mode kit still needs no network).
770
411
 
771
- The file-mode kit itself is unchanged and still dependency-free — all of the above lives in the
772
- optional Terminal Workspace GUI.
412
+ The file-mode kit itself is unchanged and still dependency-free — all of the above lives in the optional Terminal Workspace GUI.
773
413
 
774
414
  ## What's new in 0.14.0
775
415
 
776
- **The foundation of an autonomous workflow driver lands in the workspace.** Two new libraries
777
- (`workspace/lib/drive-plan.js` + `drive-guard.js`) give the workflow loop a head and a conscience:
416
+ **The foundation of an autonomous workflow driver lands in the workspace.** Two new libraries (`workspace/lib/drive-plan.js` + `drive-guard.js`) give the workflow loop a head and a conscience:
778
417
 
779
- - **A planner that knows when to stop.** The workflow ladder never returns "nothing left to do" —
780
- it always names a next honest action, so a naive `while (next)` loop never exits. The planner
781
- decides `dispatch` vs `stop` on three explicit triggers: **human-gate** (the next step is a PM
782
- decision — a contract or an acceptance), **no-progress** (the same next action twice running means
783
- the last dispatch moved nothing — a stop, not a retry), and **budget** (a hard ceiling so an
784
- unforeseen case still terminates).
785
- - **A guard that can't sign the PM's name.** A gate in PMOS is "a file with the right words in it,"
786
- which an autonomous writer could satisfy. The guard is the driver's *only* write path and refuses
787
- to write acceptances, a `PM_approved` flag (at any nesting depth, or smuggled as raw text), or a
788
- disposition token — so the loop can advance work but can never self-approve past a human gate.
418
+ - **A planner that knows when to stop.** The workflow ladder never returns "nothing left to do" — it always names a next honest action, so a naive `while (next)` loop never exits. The planner decides `dispatch` vs `stop` on three explicit triggers: **human-gate** (the next step is a PM decision — a contract or an acceptance), **no-progress** (the same next action twice running means the last dispatch moved nothing — a stop, not a retry), and **budget** (a hard ceiling so an unforeseen case still terminates).
419
+ - **A guard that can't sign the PM's name.** A gate in PMOS is "a file with the right words in it," which an autonomous writer could satisfy. The guard is the driver's *only* write path and refuses to write acceptances, a `PM_approved` flag (at any nesting depth, or smuggled as raw text), or a disposition token — so the loop can advance work but can never self-approve past a human gate.
789
420
 
790
- This is the planner + guard (14 tests cover them); the return path, an independent verify pass, and
791
- a live board run are the next increments under the same contract. Run `npx create-pmos@latest
792
- workspace` to pick it up — the workspace version bump means an existing install auto-upgrades.
421
+ This is the planner + guard (14 tests cover them); the return path, an independent verify pass, and a live board run are the next increments under the same contract. Run `npx create-pmos@latest workspace` to pick it up — the workspace version bump means an existing install auto-upgrades.
793
422
 
794
423
  ## What's new in 0.13.0
795
424
 
796
- **Six more skills now travel with the kit** — the allowlist had been shipping dangling references to
797
- skills that lived only in the hosted repo. This closes them and adds genuinely useful file-mode
798
- capabilities. `npx create-pmos@latest --update` brings them all in.
799
-
800
- - **`prototype-grill`** — the independent critic the `prototype` skill's step 6 already pointed at.
801
- Now it's actually here: a fresh-context second party that grills your lookable specimens (dialogue,
802
- never a score) and writes `prototype/<id>/grilling.md`. The dead link is gone.
803
- - **`design-brief` + `design-reconcile`** — the two PMOS skills of the design loop. `design-brief`
804
- writes the presentation-only design brief; `design-reconcile` classifies a returned design against
805
- your capability ledger before any code. The design surface itself stays external and
806
- provider-agnostic (e.g. claude.ai/design) — these are the file-mode bookends around it.
807
- - **`correction-signal-derive`** — derive the north-star signal (what a run got corrected on) from
808
- your own git/PR/CI after a merge.
809
- - **`harness-refine`** — read your accumulated friction + eval evidence and draft harness-improvement
810
- proposals as a normal PR. The kit refining itself, on your terms.
811
- - **`skill-creator`** — author and sharpen your own `.skill` files, grounded only in your repo (no
812
- network).
813
-
814
- Nothing hosted came along: skills that stand up a backend, provision tenants, or sync an external
815
- tracker are deliberately still excluded, and the assembly's containment check enforces it. The
816
- Terminal Workspace app is unchanged, so a current `pmos` install won't reinstall.
425
+ **Six more skills now travel with the kit** — the allowlist had been shipping dangling references to skills that lived only in the hosted repo. This closes them and adds genuinely useful file-mode capabilities. `npx create-pmos@latest --update` brings them all in.
426
+
427
+ - **`prototype-grill`** — the independent critic the `prototype` skill's step 6 already pointed at. Now it's actually here: a fresh-context second party that grills your lookable specimens (dialogue, never a score) and writes `prototype/<id>/grilling.md`. The dead link is gone.
428
+ - **`design-brief` + `design-reconcile`** — the two PMOS skills of the design loop. `design-brief` writes the presentation-only design brief; `design-reconcile` classifies a returned design against your capability ledger before any code. The design surface itself stays external and provider-agnostic (e.g. claude.ai/design) — these are the file-mode bookends around it.
429
+ - **`correction-signal-derive`** — derive the north-star signal (what a run got corrected on) from your own git/PR/CI after a merge.
430
+ - **`harness-refine`** — read your accumulated friction + eval evidence and draft harness-improvement proposals as a normal PR. The kit refining itself, on your terms.
431
+ - **`skill-creator`** — author and sharpen your own `.skill` files, grounded only in your repo (no network).
432
+
433
+ Nothing hosted came along: skills that stand up a backend, provision tenants, or sync an external tracker are deliberately still excluded, and the assembly's containment check enforces it. The Terminal Workspace app is unchanged, so a current `pmos` install won't reinstall.
817
434
 
818
435
  ## What's new in 0.12.1
819
436
 
820
- A small kernel refresh: the **`prototype` skill's grilling step** (leg A of the D60 prototype loop)
821
- now dispatches an **independent griller** as a distinct, fresh-context critic — the specimens are
822
- sharpened by a genuine second party, not the same agent reviewing its own work. Update an existing
823
- kit with `npx create-pmos@latest --update`. (The Terminal Workspace app is unchanged in this
824
- release, so an already-current `pmos` install won't reinstall.)
437
+ A small kernel refresh: the **`prototype` skill's grilling step** (leg A of the D60 prototype loop) now dispatches an **independent griller** as a distinct, fresh-context critic — the specimens are sharpened by a genuine second party, not the same agent reviewing its own work. Update an existing kit with `npx create-pmos@latest --update`. (The Terminal Workspace app is unchanged in this release, so an already-current `pmos` install won't reinstall.)
825
438
 
826
439
  ## What's new in 0.12.0
827
440
 
828
- **The sidebar says what is actually true.** 0.11.x told you things were *unreadable* when they were
829
- simply *not there* — and used the same red for both.
441
+ **The sidebar says what is actually true.** 0.11.x told you things were *unreadable* when they were simply *not there* — and used the same red for both.
830
442
 
831
- If you pointed the workspace at an ordinary folder or a repository that isn't a PMOS repo, almost
832
- everything read as an error. None of it was.
443
+ If you pointed the workspace at an ordinary folder or a repository that isn't a PMOS repo, almost everything read as an error. None of it was.
833
444
 
834
- - **A folder that isn't a git repository** now says so, quietly. It used to say `branch unreadable`,
835
- which is an alarm about a completely ordinary directory.
836
- - **A repository with no initiative records** reads **no initiatives yet** — a fact about the
837
- repository, calmly stated. Pointing the workspace at any repo you like is a supported thing to do.
838
- - **A shell session** no longer reports its non-existent transcript as a failed identification. A
839
- shell is a prompt, not an agent narrating itself.
840
- - **A row keeps its name.** Previously a plain folder rendered as a row titled `branch unreadable` —
841
- a row with no name at all, unfindable in a tree of them.
445
+ - **A folder that isn't a git repository** now says so, quietly. It used to say `branch unreadable`, which is an alarm about a completely ordinary directory.
446
+ - **A repository with no initiative records** reads **no initiatives yet** — a fact about the repository, calmly stated. Pointing the workspace at any repo you like is a supported thing to do.
447
+ - **A shell session** no longer reports its non-existent transcript as a failed identification. A shell is a prompt, not an agent narrating itself.
448
+ - **A row keeps its name.** Previously a plain folder rendered as a row titled `branch unreadable` — a row with no name at all, unfindable in a tree of them.
842
449
 
843
- Red still means red: a corrupt state queue, a genuine git failure, or an engine that is installed but
844
- throws all still draw the alarm. The point is that they no longer share it with the normal case.
450
+ Red still means red: a corrupt state queue, a genuine git failure, or an engine that is installed but throws all still draw the alarm. The point is that they no longer share it with the normal case.
845
451
 
846
452
  Three controls also stopped being ambiguous:
847
453
 
848
- - **`+ new session — run an agent here`** now names the repository and branch it will start in.
849
- "Here" meant the selected tree all along; with every repository on screen at once, nothing said
850
- which that was.
454
+ - **`+ new session — run an agent here`** now names the repository and branch it will start in. "Here" meant the selected tree all along; with every repository on screen at once, nothing said which that was.
851
455
  - **`+ session here`** starts a session. It used to select the tree and stop.
852
- - **A row with no sessions no longer expands** just because something needs your attention — that
853
- count is already shown on the row, and opening an empty container to "reveal" it taught you to
854
- distrust the tree.
456
+ - **A row with no sessions no longer expands** just because something needs your attention — that count is already shown on the row, and opening an empty container to "reveal" it taught you to distrust the tree.
855
457
 
856
458
  And the pane is called **repos & sessions** rather than `work`.
857
459
 
858
- > **One disclosure.** The Review Gate for this work was not scored before release. Its rubric makes
859
- > the honesty checks *runnable* precisely so they cannot be satisfied by reading the code, and they
860
- > were not run by an independent evaluator. Everything above was verified by the automated suites
861
- > (412 checks) and by hand; none of it was independently reviewed.
460
+ > **One disclosure.** The Review Gate for this work was not scored before release. Its rubric makes the honesty checks *runnable* precisely so they cannot be satisfied by reading the code, and they were not run by an independent evaluator. Everything above was verified by the automated suites (412 checks) and by hand; none of it was independently reviewed.
862
461
 
863
462
  ## What's new in 0.11.1
864
463
 
865
- **Fixes: the ladder never actually worked.** If you installed 0.11.0 and every row in the new
866
- sidebar read `ladder unreadable` in red — that was us, not your repository.
464
+ **Fixes: the ladder never actually worked.** If you installed 0.11.0 and every row in the new sidebar read `ladder unreadable` in red — that was us, not your repository.
867
465
 
868
- The engine that derives an initiative's stage, next step and blockers was **not included in any
869
- published package**. It lives at `scripts/workflow-state.js` in the PMOS repo, and the workspace
870
- looked for it two directories above itself — a path that exists in a development checkout and in no
871
- install. The surface 0.11.0 was released for could not run for anyone who installed it.
466
+ The engine that derives an initiative's stage, next step and blockers was **not included in any published package**. It lives at `scripts/workflow-state.js` in the PMOS repo, and the workspace looked for it two directories above itself — a path that exists in a development checkout and in no install. The surface 0.11.0 was released for could not run for anyone who installed it.
872
467
 
873
- 0.11.1 bundles the engine with the app, and adds the check that would have caught this: publishing
874
- now **derives a ladder from the packed tarball** and fails if it cannot, rather than only confirming
875
- that files are present.
468
+ 0.11.1 bundles the engine with the app, and adds the check that would have caught this: publishing now **derives a ladder from the packed tarball** and fails if it cannot, rather than only confirming that files are present.
876
469
 
877
- So rows now show what 0.11.0 described: lane, derived stage, and the next step or the blocker —
878
- each one naming the branch it was derived from.
470
+ So rows now show what 0.11.0 described: lane, derived stage, and the next step or the blocker — each one naming the branch it was derived from.
879
471
 
880
- A repository with no `planning/initiatives/` records is no longer an error; it simply has no
881
- initiatives, and reads calmly. Some of the wording around that is still terser than it should be
882
- (a folder that is not a git repository currently reports an unreadable branch rather than saying it
883
- is not a repository) — that is being fixed separately and is a label, not a failure.
472
+ A repository with no `planning/initiatives/` records is no longer an error; it simply has no initiatives, and reads calmly. Some of the wording around that is still terser than it should be (a folder that is not a git repository currently reports an unreadable branch rather than saying it is not a repository) — that is being fixed separately and is a label, not a failure.
884
473
 
885
474
  ## What's new in 0.11.0
886
475
 
887
- **The workspace navigates by initiative instead of by folder.** If you upgrade and the left column
888
- looks unfamiliar, this is why.
889
-
890
- - **One tree instead of two panes.** The sidebar was a list of working trees named after
891
- directories, plus a separate list of running agents. It is now a single tree: your repository,
892
- the working trees under it, and each tree's sessions beneath that. A branch called
893
- `initiative/<id>` is labelled with the initiative, not the folder — and the folder name stays on
894
- the row, because switching a branch moves every session in that tree and a row that renamed
895
- itself would look like a row that vanished.
896
-
897
- - **Each row says where the work is and what is next** — its lane, its derived stage, and either
898
- the next step or what is blocking it. Nothing here is a status anyone types; it is derived from
899
- your records and git, by the same engine the gate runs.
900
-
901
- - **Every stage names the branch it was derived from.** This one matters more than it sounds.
902
- Stage is computed over `merge-base(main, HEAD)..HEAD` — *this branch's* commits — so an
903
- initiative you shipped months ago legitimately reads "spec" on a branch that did not build it.
904
- The surface now says which branch produced the answer instead of implying it is absolute.
905
-
906
- - **The rail follows your selection.** The four lenses (initiatives · folders · scheduled ·
907
- history) are replaced by one detail: pick a repository and you get its folder map, schedules and
908
- history; pick an initiative and you get its dossier — where it is, what it still owes, and every
909
- artifact it owns, grouped by what the *lane* asks for. A chore is not shown as a feature missing
910
- a PRD. Opening a dossier is a read: it never switches your working tree.
911
-
912
- - **The workflow panel no longer freezes the app.** Deriving the board shells `git` once per
913
- initiative — around 30 seconds on a large repo — and it used to run on the request path, locking
914
- the server and every terminal session with it. It now runs in a separate process and every answer
915
- is stamped with when it was derived. On a big repository the first read says "deriving" rather
916
- than showing nothing.
917
-
918
- - **Prototypes, user stories and copywriting are visible to the library.** Specimens in
919
- `prototype/<id>/` were outside the scanned tree, so a D60 prototype never appeared on the
920
- initiative that produced it. They do now, and `-user-stories`, `-copy-brief` and `-copy` are
921
- recognised artifact roles.
922
-
923
- Honest note on what this release did *not* get: the 30-second derivation is **cached, not fixed** —
924
- the underlying per-file git lookups are still unbatched. And the Review Gate for this work was never
925
- scored; it was accepted on green CI and PM judgement, without an independent adversarial pass.
476
+ **The workspace navigates by initiative instead of by folder.** If you upgrade and the left column looks unfamiliar, this is why.
477
+
478
+ - **One tree instead of two panes.** The sidebar was a list of working trees named after directories, plus a separate list of running agents. It is now a single tree: your repository, the working trees under it, and each tree's sessions beneath that. A branch called `initiative/<id>` is labelled with the initiative, not the folder — and the folder name stays on the row, because switching a branch moves every session in that tree and a row that renamed itself would look like a row that vanished.
479
+
480
+ - **Each row says where the work is and what is next** — its lane, its derived stage, and either the next step or what is blocking it. Nothing here is a status anyone types; it is derived from your records and git, by the same engine the gate runs.
481
+
482
+ - **Every stage names the branch it was derived from.** This one matters more than it sounds. Stage is computed over `merge-base(main, HEAD)..HEAD` — *this branch's* commits — so an initiative you shipped months ago legitimately reads "spec" on a branch that did not build it. The surface now says which branch produced the answer instead of implying it is absolute.
483
+
484
+ - **The rail follows your selection.** The four lenses (initiatives · folders · scheduled · history) are replaced by one detail: pick a repository and you get its folder map, schedules and history; pick an initiative and you get its dossier — where it is, what it still owes, and every artifact it owns, grouped by what the *lane* asks for. A chore is not shown as a feature missing a PRD. Opening a dossier is a read: it never switches your working tree.
485
+
486
+ - **The workflow panel no longer freezes the app.** Deriving the board shells `git` once per initiative — around 30 seconds on a large repo — and it used to run on the request path, locking the server and every terminal session with it. It now runs in a separate process and every answer is stamped with when it was derived. On a big repository the first read says "deriving" rather than showing nothing.
487
+
488
+ - **Prototypes, user stories and copywriting are visible to the library.** Specimens in `prototype/<id>/` were outside the scanned tree, so a D60 prototype never appeared on the initiative that produced it. They do now, and `-user-stories`, `-copy-brief` and `-copy` are recognised artifact roles.
489
+
490
+ Honest note on what this release did *not* get: the 30-second derivation is **cached, not fixed** — the underlying per-file git lookups are still unbatched. And the Review Gate for this work was never scored; it was accepted on green CI and PM judgement, without an independent adversarial pass.
926
491
 
927
492
  ## What's new in 0.10.1
928
493
 
929
494
  **Two fixes found by installing 0.10.0 and using it, rather than by reading the code.**
930
495
 
931
- - **Upgrades will keep reaching you.** The launcher decides whether to reinstall the workspace by
932
- comparing the app version it bundles against the one you have. 0.10.0 shipped the *kit* at 0.10.0
933
- but the bundled app still labelled **0.9.1** — so the next release would have compared equal,
934
- decided you were current, and **silently skipped the upgrade**. Which is precisely the failure
935
- 0.9.1 existed to fix. The two versions are now checked against each other by the test suite, so it
936
- cannot drift again unnoticed.
937
- - **Alignment no longer offers to edit its own notes.** The change-context digest quotes every change
938
- you make, so it matched the "quotes text this change altered" rule on the very first save in any
939
- repository — and topped the list of documents to realign. A generated file proposing to realign
940
- itself. Machine-written state is now excluded from alignment entirely.
496
+ - **Upgrades will keep reaching you.** The launcher decides whether to reinstall the workspace by comparing the app version it bundles against the one you have. 0.10.0 shipped the *kit* at 0.10.0 but the bundled app still labelled **0.9.1** — so the next release would have compared equal, decided you were current, and **silently skipped the upgrade**. Which is precisely the failure 0.9.1 existed to fix. The two versions are now checked against each other by the test suite, so it cannot drift again unnoticed.
497
+ - **Alignment no longer offers to edit its own notes.** The change-context digest quotes every change you make, so it matched the "quotes text this change altered" rule on the very first save in any repository — and topped the list of documents to realign. A generated file proposing to realign itself. Machine-written state is now excluded from alignment entirely.
941
498
 
942
- If you installed 0.10.0, run `npx create-pmos@latest workspace` once. Nothing was damaged by either
943
- bug; the first would have cost you a future upgrade, and the second a confusing first suggestion.
499
+ If you installed 0.10.0, run `npx create-pmos@latest workspace` once. Nothing was damaged by either bug; the first would have cost you a future upgrade, and the second a confusing first suggestion.
944
500
 
945
501
  ## What's new in 0.10.0
946
502
 
947
503
  **Editing a document now does something for the rest of them.**
948
504
 
949
- 0.8.0 gave you an editor: change a markdown document in the workspace, see the diff as you type, and
950
- have the change logged. This release adds the two halves that make that log worth keeping.
505
+ 0.8.0 gave you an editor: change a markdown document in the workspace, see the diff as you type, and have the change logged. This release adds the two halves that make that log worth keeping.
951
506
 
952
507
  ### After you save, you are offered what your change puts out of step
953
508
 
954
- Not a scan of your repository — a list built from **your change**. A document only appears if it has a
955
- concrete tie to what you edited:
509
+ Not a scan of your repository — a list built from **your change**. A document only appears if it has a concrete tie to what you edited:
956
510
 
957
511
  - it links to the document you changed, or names it in frontmatter (`prd_path`, `rubric_path`, …)
958
512
  - it shares that document's `initiative_id`
959
- - it **quotes text your change altered** — the strongest signal, because it is now asserting something
960
- the source no longer says
513
+ - it **quotes text your change altered** — the strongest signal, because it is now asserting something the source no longer says
961
514
 
962
- Each candidate says which of those it is, so you can judge the suggestion before spending anything on
963
- it. **"Seems related" is deliberately not a rule.** It would widen this to your whole repository and
964
- put you back in front of a queue of an agent's opinions.
515
+ Each candidate says which of those it is, so you can judge the suggestion before spending anything on it. **"Seems related" is deliberately not a rule.** It would widen this to your whole repository and put you back in front of a queue of an agent's opinions.
965
516
 
966
- You tick which documents an agent may read. It drafts the edit that brings each back in line, and each
967
- draft comes back as a diff to apply or skip. Applying uses the same guard as every other write here:
968
- the text being replaced must appear exactly once, or the write is refused rather than guessed at.
517
+ You tick which documents an agent may read. It drafts the edit that brings each back in line, and each draft comes back as a diff to apply or skip. Applying uses the same guard as every other write here: the text being replaced must appear exactly once, or the write is refused rather than guessed at.
969
518
 
970
- **It never blocks.** The save completed before any of this. Dismiss the offer and nothing is queued,
971
- nothing badges, nothing waits for you.
519
+ **It never blocks.** The save completed before any of this. Dismiss the offer and nothing is queued, nothing badges, nothing waits for you.
972
520
 
973
521
  ### Your change log is now something an agent reads
974
522
 
975
- Every save regenerates `change-context.md` in your repository's own state directory: the documents you
976
- change most, the recent changes, and — the part that matters — **your own stated reasons**, in your
977
- words. An agent reading it before working in your repo knows what you keep rewriting and why, so it
978
- can stop producing the thing that provoked the rewrite.
523
+ Every save regenerates `change-context.md` in your repository's own state directory: the documents you change most, the recent changes, and — the part that matters — **your own stated reasons**, in your words. An agent reading it before working in your repo knows what you keep rewriting and why, so it can stop producing the thing that provoked the rewrite.
979
524
 
980
525
  That is why the editor asks for a reason at all. A reason nobody reads is just friction at save time.
981
526
 
982
- Edits made by applying an alignment record **what they were aligned with**, so the log reads as a
983
- chain rather than as unexplained changes appearing in files you did not open.
527
+ Edits made by applying an alignment record **what they were aligned with**, so the log reads as a chain rather than as unexplained changes appearing in files you did not open.
984
528
 
985
529
  ### Also carried: the 0.9.1 upgrade fix
986
530
 
987
- **0.9.1 was never published.** Its fix — `create-pmos workspace` self-upgrading instead of quietly
988
- launching your old installed app — is in this release. If the workspace has looked unchanged across
989
- recent versions, that is why; run `npx create-pmos@latest workspace` once and it will self-heal onto
990
- the current app. Hard-refresh the browser afterwards to drop the cached stylesheet.
531
+ **0.9.1 was never published.** Its fix — `create-pmos workspace` self-upgrading instead of quietly launching your old installed app — is in this release. If the workspace has looked unchanged across recent versions, that is why; run `npx create-pmos@latest workspace` once and it will self-heal onto the current app. Hard-refresh the browser afterwards to drop the cached stylesheet.
991
532
 
992
533
  ## What's new in 0.9.1
993
534
 
994
- **A fix so workspace upgrades actually reach you.** If you activated the Terminal Workspace in an
995
- earlier version, `npx create-pmos@latest workspace` was quietly launching your *old* installed app —
996
- so 0.9.0's restyle and whose-turn view never showed up. That was the bug, not a missing feature.
535
+ **A fix so workspace upgrades actually reach you.** If you activated the Terminal Workspace in an earlier version, `npx create-pmos@latest workspace` was quietly launching your *old* installed app — so 0.9.0's restyle and whose-turn view never showed up. That was the bug, not a missing feature.
997
536
 
998
- - **`create-pmos workspace` now self-upgrades.** It compares the bundled app's version against what
999
- you have installed and **reinstalls when the bundle is newer** (then restarts the persistent server
1000
- so the new code actually serves). A same-version install still fast-launches — no needless
1001
- ~20-second native rebuild.
537
+ - **`create-pmos workspace` now self-upgrades.** It compares the bundled app's version against what you have installed and **reinstalls when the bundle is newer** (then restarts the persistent server so the new code actually serves). A same-version install still fast-launches — no needless ~20-second native rebuild.
1002
538
  - **`create-pmos workspace --reinstall`** — force it any time.
1003
539
  - **`pmos upgrade`** — the same, straight from the installed command.
1004
- - If the UI still looks unchanged right after an upgrade, **hard-refresh the browser**
1005
- (Cmd/Ctrl+Shift+R) to drop the cached stylesheet.
540
+ - If the UI still looks unchanged right after an upgrade, **hard-refresh the browser** (Cmd/Ctrl+Shift+R) to drop the cached stylesheet.
1006
541
 
1007
- So if 0.9.0 looked like "not much changed," this is why: the code shipped, but your old install kept
1008
- running. Run `npx create-pmos@latest workspace` once and it will self-heal onto the current app.
542
+ So if 0.9.0 looked like "not much changed," this is why: the code shipped, but your old install kept running. Run `npx create-pmos@latest workspace` once and it will self-heal onto the current app.
1009
543
 
1010
544
  ## What's new in 0.9.0
1011
545
 
1012
- **The Terminal Workspace now tells you whose turn it is.** The optional GUI got this release's real
1013
- work: it reads each session's transcript and shows, per session, whether the agent is still working
1014
- or **waiting on you** — so a wall of terminals becomes a queue you can triage at a glance instead of
1015
- a grid you have to click through.
1016
-
1017
- - **Whose-turn, read from the actual transcript.** Each session row and tab carries its state —
1018
- agent-working vs waiting-on-you — derived from the real conversation, not a guess. The sessions
1019
- that need a decision surface; the ones still running recede.
1020
- - **A real design system, not a dev-tool skin.** The workspace was reskinned on a proper palette
1021
- with its own typography, and the fonts ship *inside* the package — nothing is fetched at runtime,
1022
- so it looks the same offline and behind a proxy.
1023
- - **Your git branch is in the frame.** Each session shows the branch it is on and lets you switch,
1024
- so `initiative/<id>` work and its worktree are visible where you are working, not a `git status`
1025
- away.
1026
- - **The router now makes you write the answers down.** `pmos-router` gained a step: the intake
1027
- answers (does this need its own instance? has this been rejected before?) get recorded on the
1028
- initiative, so a routing decision is enforceable later instead of evaporating the moment it's made.
1029
-
1030
- All of this rides in `npx create-pmos@latest workspace`. The file-mode kit itself is unchanged and
1031
- still dependency-free; `npx create-pmos@latest --update` brings the router change into an existing
1032
- kit and never touches your `state/`, `planning/`, or `okf/product/` records.
546
+ **The Terminal Workspace now tells you whose turn it is.** The optional GUI got this release's real work: it reads each session's transcript and shows, per session, whether the agent is still working or **waiting on you** — so a wall of terminals becomes a queue you can triage at a glance instead of a grid you have to click through.
547
+
548
+ - **Whose-turn, read from the actual transcript.** Each session row and tab carries its state — agent-working vs waiting-on-you — derived from the real conversation, not a guess. The sessions that need a decision surface; the ones still running recede.
549
+ - **A real design system, not a dev-tool skin.** The workspace was reskinned on a proper palette with its own typography, and the fonts ship *inside* the package — nothing is fetched at runtime, so it looks the same offline and behind a proxy.
550
+ - **Your git branch is in the frame.** Each session shows the branch it is on and lets you switch, so `initiative/<id>` work and its worktree are visible where you are working, not a `git status` away.
551
+ - **The router now makes you write the answers down.** `pmos-router` gained a step: the intake answers (does this need its own instance? has this been rejected before?) get recorded on the initiative, so a routing decision is enforceable later instead of evaporating the moment it's made.
552
+
553
+ All of this rides in `npx create-pmos@latest workspace`. The file-mode kit itself is unchanged and still dependency-free; `npx create-pmos@latest --update` brings the router change into an existing kit and never touches your `state/`, `planning/`, or `okf/product/` records.
1033
554
 
1034
555
  ## What's new in 0.8.0
1035
556
 
1036
557
  **The document review is gone. There is a document editor instead.**
1037
558
 
1038
- Minor, not patch: a feature that shipped in 0.7.0–0.7.3 has been **removed**, and what replaces it is
1039
- a different thing with a different point. If you were using the review surface, it is not there any
1040
- more — read on.
559
+ Minor, not patch: a feature that shipped in 0.7.0–0.7.3 has been **removed**, and what replaces it is a different thing with a different point. If you were using the review surface, it is not there any more — read on.
1041
560
 
1042
561
  ### Why it went
1043
562
 
1044
- It answered a question nobody asked. An agent read your planning documents and told you what it
1045
- thought was wrong with them, before you had touched anything. What was actually wanted was the
1046
- opposite direction: **you** edit a document, and the tooling reacts to *your* change.
563
+ It answered a question nobody asked. An agent read your planning documents and told you what it thought was wrong with them, before you had touched anything. What was actually wanted was the opposite direction: **you** edit a document, and the tooling reacts to *your* change.
1047
564
 
1048
- **It also never fully worked.** The browser's Edit → Apply path depended on a script the server was
1049
- never configured to serve, so it 404'd silently in every version that shipped it. The tests that
1050
- covered it went straight to the endpoint and never exercised the path a person takes. If you tried to
1051
- edit a proposal and apply it and nothing happened, that was why, and it was our bug.
565
+ **It also never fully worked.** The browser's Edit → Apply path depended on a script the server was never configured to serve, so it 404'd silently in every version that shipped it. The tests that covered it went straight to the endpoint and never exercised the path a person takes. If you tried to edit a proposal and apply it and nothing happened, that was why, and it was our bug.
1052
566
 
1053
567
  ### What replaces it
1054
568
 
1055
- - **Edit any markdown document in the reader.** `edit` in the document header; `save`, `cancel` and
1056
- `history` while you are in it. ⌘S saves.
1057
- - **The diff is beside you as you type** — the replaced lines struck through, the new ones marked,
1058
- with a running `+n −n` and the line the change starts at. Nothing to summon; it appears when the
1059
- document differs from what you opened.
1060
- - **A save that refuses rather than clobbers.** If the file changed on disk since you opened it, the
1061
- save fails and says so, and **your text stays in the editor** so you can copy it out. It will not
1062
- merge over whoever changed it.
1063
- - **Every save is logged, per repository.** What changed, where, and — if you write one — why. It
1064
- lands in your repo's own state directory, never in the installed app. `history` in the document
1065
- header shows that document's own log.
1066
-
1067
- The log records the changed region and your reason, **not a parallel history of your repository**.
1068
- `git log` remains the record of what your files contain; this records what you changed and why, which
1069
- git has no place to put.
569
+ - **Edit any markdown document in the reader.** `edit` in the document header; `save`, `cancel` and `history` while you are in it. ⌘S saves.
570
+ - **The diff is beside you as you type** — the replaced lines struck through, the new ones marked, with a running `+n −n` and the line the change starts at. Nothing to summon; it appears when the document differs from what you opened.
571
+ - **A save that refuses rather than clobbers.** If the file changed on disk since you opened it, the save fails and says so, and **your text stays in the editor** so you can copy it out. It will not merge over whoever changed it.
572
+ - **Every save is logged, per repository.** What changed, where, and — if you write one — why. It lands in your repo's own state directory, never in the installed app. `history` in the document header shows that document's own log.
573
+
574
+ The log records the changed region and your reason, **not a parallel history of your repository**. `git log` remains the record of what your files contain; this records what you changed and why, which git has no place to put.
1070
575
 
1071
576
  ### Not built yet, and named so you are not waiting for it
1072
577
 
1073
- Two halves of the intended feature are **not** in this release: using a save to work out which *other*
1074
- documents are now out of step and drafting the edits that would realign them, and feeding the
1075
- accumulated change log to agents as context. The editor, the diff and the log are here; the
1076
- propagation is not.
578
+ Two halves of the intended feature are **not** in this release: using a save to work out which *other* documents are now out of step and drafting the edits that would realign them, and feeding the accumulated change log to agents as context. The editor, the diff and the log are here; the propagation is not.
1077
579
 
1078
580
  ## What's new in 0.7.3
1079
581
 
1080
- **A fix — read this if you ran a document review on 0.7.1 or 0.7.2, and especially if you have more
1081
- than one repository open in the workspace.**
582
+ **A fix — read this if you ran a document review on 0.7.1 or 0.7.2, and especially if you have more than one repository open in the workspace.**
1082
583
 
1083
- Reviews were filed into the **workspace app's own install directory** rather than into the repository
1084
- being reviewed. Two consequences, and the first is the one that matters:
584
+ Reviews were filed into the **workspace app's own install directory** rather than into the repository being reviewed. Two consequences, and the first is the one that matters:
1085
585
 
1086
- - **Reviews from different repositories were pooled together.** Open two repos and the review you
1087
- filed against one appeared when you opened the review surface in the other. A review names the
1088
- documents it read and quotes their contents, so this put one project's material in front of
1089
- another — including in front of an agent session working in that second repo.
1090
- - **In a product repo using this kit, reviews were written nowhere useful.** The review skill was
1091
- written against PMOS's own layout and told the agent to write to `workspace/state/reviews/` and
1092
- read `workspace/state/needs.json`. **A product repo has no `workspace/` folder**, so the agent
1093
- either created a stray one or filed the review where nothing would ever read it.
586
+ - **Reviews from different repositories were pooled together.** Open two repos and the review you filed against one appeared when you opened the review surface in the other. A review names the documents it read and quotes their contents, so this put one project's material in front of another — including in front of an agent session working in that second repo.
587
+ - **In a product repo using this kit, reviews were written nowhere useful.** The review skill was written against PMOS's own layout and told the agent to write to `workspace/state/reviews/` and read `workspace/state/needs.json`. **A product repo has no `workspace/` folder**, so the agent either created a stray one or filed the review where nothing would ever read it.
1094
588
 
1095
- **Both are fixed.** Reviews now resolve through the same per-workspace state directory that
1096
- `needs.json` and `acceptances.jsonl` already used — your repo's own `pmos/state/reviews/`. The skill
1097
- no longer assumes any layout: the paths it needs are passed to it as absolute facts.
589
+ **Both are fixed.** Reviews now resolve through the same per-workspace state directory that `needs.json` and `acceptances.jsonl` already used — your repo's own `pmos/state/reviews/`. The skill no longer assumes any layout: the paths it needs are passed to it as absolute facts.
1098
590
 
1099
- **If you reviewed anything on 0.7.1 or 0.7.2**, look in the workspace app's install directory under
1100
- `workspace/state/reviews/` for reviews that belong to your repositories, and delete any you would
1101
- rather not have sitting there. Nothing was sent anywhere — this is local files in the wrong folder —
1102
- but if you had two repos open, they saw each other.
591
+ **If you reviewed anything on 0.7.1 or 0.7.2**, look in the workspace app's install directory under `workspace/state/reviews/` for reviews that belong to your repositories, and delete any you would rather not have sitting there. Nothing was sent anywhere — this is local files in the wrong folder — but if you had two repos open, they saw each other.
1103
592
 
1104
- **And the reason you probably never ran one: there was no way to say what to review.** The skill could
1105
- only be launched from the scheduled lens, and a schedule carries no scope — so its own instruction to
1106
- read exactly the documents you named had nothing behind it.
593
+ **And the reason you probably never ran one: there was no way to say what to review.** The skill could only be launched from the scheduled lens, and a schedule carries no scope — so its own instruction to read exactly the documents you named had nothing behind it.
1107
594
 
1108
- - **A `review` control now sits on the open document.** You are reading a document; you click
1109
- `review`; an agent reviews *that* document. Nothing to type, no schedule to create. The scope is
1110
- the thing in front of you.
595
+ - **A `review` control now sits on the open document.** You are reading a document; you click `review`; an agent reviews *that* document. Nothing to type, no schedule to create. The scope is the thing in front of you.
1111
596
 
1112
- **The standing disclosure is unchanged**, and it still matters more than any of the above: the review
1113
- surface has **not** been through its own review gate, and its false-positive rate is unmeasured. The
1114
- guard that withholds any proposal which would close a recorded open question or overwrite a decision
1115
- is tested, including in a real browser. How often its findings are simply *wrong* is not yet known.
597
+ **The standing disclosure is unchanged**, and it still matters more than any of the above: the review surface has **not** been through its own review gate, and its false-positive rate is unmeasured. The guard that withholds any proposal which would close a recorded open question or overwrite a decision is tested, including in a real browser. How often its findings are simply *wrong* is not yet known.
1116
598
 
1117
599
  ## What's new in 0.7.2
1118
600
 
1119
601
  **A fix — read this if you use the Terminal Workspace on a machine with `tmux` installed.**
1120
602
 
1121
- 0.7.0 and 0.7.1 both shipped a workspace terminal that renders **gibberish** there. Box-drawing
1122
- characters, check marks, spinners, emoji and accented letters all arrived damaged, and the output
1123
- lost its structure — which matters because agent CLIs print those constantly, so in practice most
1124
- frames were affected. If your terminal has looked broken since 0.7.0, this is why, and it was our
1125
- bug, not your setup.
1126
-
1127
- The cause: the workspace drives `tmux` in control mode, and that stream is **bytes**. `tmux` escapes
1128
- only the control characters and the backslash — every byte of a UTF-8 character passes through raw.
1129
- The workspace decoded that stream as text and then narrowed it back to bytes, which does not merely
1130
- lose characters, it *manufactures* control codes out of the wreckage. `┌` became a **form feed**,
1131
- which is why the layout collapsed and not just the glyphs.
1132
-
1133
- - **Fixed.** The control stream is now handled as bytes end to end, with a single UTF-8 decode in
1134
- one place. A character split across two `tmux` frames still survives.
1135
- - **A second, smaller source of the same symptom, also fixed.** The scrollback ring trims from the
1136
- front once it fills, and it used to cut at an arbitrary offset — routinely *inside* an escape
1137
- sequence, so the leftover fragment replayed as literal rubble like `5;203m` when you reattached.
1138
- It now cuts at a line boundary.
603
+ 0.7.0 and 0.7.1 both shipped a workspace terminal that renders **gibberish** there. Box-drawing characters, check marks, spinners, emoji and accented letters all arrived damaged, and the output lost its structure — which matters because agent CLIs print those constantly, so in practice most frames were affected. If your terminal has looked broken since 0.7.0, this is why, and it was our bug, not your setup.
604
+
605
+ The cause: the workspace drives `tmux` in control mode, and that stream is **bytes**. `tmux` escapes only the control characters and the backslash — every byte of a UTF-8 character passes through raw. The workspace decoded that stream as text and then narrowed it back to bytes, which does not merely lose characters, it *manufactures* control codes out of the wreckage. `┌` became a **form feed**, which is why the layout collapsed and not just the glyphs.
606
+
607
+ - **Fixed.** The control stream is now handled as bytes end to end, with a single UTF-8 decode in one place. A character split across two `tmux` frames still survives.
608
+ - **A second, smaller source of the same symptom, also fixed.** The scrollback ring trims from the front once it fills, and it used to cut at an arbitrary offset — routinely *inside* an escape sequence, so the leftover fragment replayed as literal rubble like `5;203m` when you reattached. It now cuts at a line boundary.
1139
609
  - **Nothing else changed.** 0.7.2 carries this fix and only this fix.
1140
610
 
1141
- **You were only affected if `tmux` is on your PATH.** The workspace falls back to a direct terminal
1142
- when it is not, and that path never had the defect — which is exactly why this survived two
1143
- releases. The regression test now reports which of the two transports it exercised, so a green run
1144
- on a machine without `tmux` can no longer read as if it had covered the one that broke.
611
+ **You were only affected if `tmux` is on your PATH.** The workspace falls back to a direct terminal when it is not, and that path never had the defect — which is exactly why this survived two releases. The regression test now reports which of the two transports it exercised, so a green run on a machine without `tmux` can no longer read as if it had covered the one that broke.
1145
612
 
1146
613
  ## What's new in 0.7.1
1147
614
 
1148
615
  **A correction to 0.7.0 — read this if you used the review surface.**
1149
616
 
1150
- 0.7.0 shipped the summoned document review with a defect in the part that records *why* you changed
1151
- an agent's proposal. The client sent a fixed reason — `incomplete` — on **every** edit, whatever the
1152
- actual reason was. So any correction record written by 0.7.0 carries a reason that is very likely
1153
- false, in the one file whose whole purpose is to make the human-correction rate trustworthy.
1154
-
1155
- If you ran a review on 0.7.0, treat the `reason` field in `planning/runs/correction-records.jsonl` as
1156
- unreliable. Everything else in those records — the agent's text, your text, the attribution — is
1157
- sound.
1158
-
1159
- - **You pick the reason now.** Applying an edit asks *what was wrong with it?* and offers
1160
- `factually wrong · incomplete · wrong scope · style · other…`. It **nudges rather than defaulting**,
1161
- and `other` asks for a few words. Dismiss is still one click — friction belongs on the action that
1162
- teaches something, not the common one.
1163
- - **A half-applied state is now impossible.** The record was validated *after* the document was
1164
- written, so a missing reason could leave your file changed with nothing recorded. Validation runs
1165
- first: every refusal leaves the repository byte-identical.
1166
- - **The counters are on the surface, and honest.** Dispositions, corrections and the action rate are
1167
- derived from the records themselves. Quiet-on-clean reads **`not measured`** rather than a
1168
- flattering zero — measuring it needs a corpus of documents known to be clean, which does not exist
1169
- yet.
1170
-
1171
- **The disclosure from 0.7.0 still stands**, and it matters more than this release note: the review
1172
- surface has **not** been through its own review gate. Its false-positive rate is unmeasured. It
1173
- withholds any proposal that would close a recorded open question or overwrite a decision — that guard
1174
- is tested, including in a real browser — but nothing yet tells you how often its findings are simply
1175
- wrong. Use it on documents you are willing to read carefully.
617
+ 0.7.0 shipped the summoned document review with a defect in the part that records *why* you changed an agent's proposal. The client sent a fixed reason — `incomplete` — on **every** edit, whatever the actual reason was. So any correction record written by 0.7.0 carries a reason that is very likely false, in the one file whose whole purpose is to make the human-correction rate trustworthy.
618
+
619
+ If you ran a review on 0.7.0, treat the `reason` field in `planning/runs/correction-records.jsonl` as unreliable. Everything else in those records — the agent's text, your text, the attribution — is sound.
620
+
621
+ - **You pick the reason now.** Applying an edit asks *what was wrong with it?* and offers `factually wrong · incomplete · wrong scope · style · other…`. It **nudges rather than defaulting**, and `other` asks for a few words. Dismiss is still one click — friction belongs on the action that teaches something, not the common one.
622
+ - **A half-applied state is now impossible.** The record was validated *after* the document was written, so a missing reason could leave your file changed with nothing recorded. Validation runs first: every refusal leaves the repository byte-identical.
623
+ - **The counters are on the surface, and honest.** Dispositions, corrections and the action rate are derived from the records themselves. Quiet-on-clean reads **`not measured`** rather than a flattering zero — measuring it needs a corpus of documents known to be clean, which does not exist yet.
624
+
625
+ **The disclosure from 0.7.0 still stands**, and it matters more than this release note: the review surface has **not** been through its own review gate. Its false-positive rate is unmeasured. It withholds any proposal that would close a recorded open question or overwrite a decision — that guard is tested, including in a real browser — but nothing yet tells you how often its findings are simply wrong. Use it on documents you are willing to read carefully.
1176
626
 
1177
627
  ## What's new in 0.7.0
1178
628
 
1179
- **The workspace GUI has layouts.** Until now it had exactly one arrangement: a fixed sidebar, the
1180
- terminal, and a right rail. Now it has four you can name, switch between in one act, and then change
1181
- however you like.
1182
-
1183
- - **Named layouts — `focus` · `read` · `compare` · `review`.** Switch from the header or with
1184
- ⌃1–⌃4. `focus` gives the terminal the window; `read` makes the document the primary column instead
1185
- of a 400px strip; `compare` puts two sessions side by side; `review` is the arrangement you already
1186
- had.
1187
- - **Adjust anything, and it's kept.** Drag a pane by its ⠿ grip to a different edge, drag a column's
1188
- edge to resize it, fold a pane away — whatever you change is written back into the layout you're
1189
- in. There is no save button, no "unsaved changes", and nothing to manage. Each stock layout has a
1190
- **restore** in the list for when you want the original back.
1191
- - **Two terminals at once.** `compare` (or the layout menu) splits the terminal into two groups, each
1192
- with its own tab strip and its own live session — so you can watch two agents work instead of
1193
- alternating tabs from memory. Closing the split doesn't kill anything; the second session goes back
1194
- to being a tab.
1195
- - **Make your own.** `+ new layout from this arrangement` names what you've built; custom layouts can
1196
- be renamed and deleted.
1197
- - **Layouts belong to the repo you opened.** Each workspace remembers its own, on your machine
1198
- (`workspace/state/layouts/`) — nothing is sent anywhere.
1199
- - **The sidebar caught up.** Its panes now fold and its width now drags, which only the right rail
1200
- could do before.
1201
-
1202
- **Upgrade note:** the workspace app ships inside the package; `npx create-pmos@latest workspace`
1203
- installs the new build. If you had already dragged your rail width or hidden it, that carries into
1204
- this workspace's `review` layout on first run — you keep what you had. Your `state/`, `planning/`,
1205
- and `okf/` records are untouched. Phones are unchanged: the single-column switcher still owns the
1206
- layout there, and the layout control is hidden.
1207
-
1208
- **Also in this build, and not yet finished:** a **summoned document review** surface (ask for a
1209
- review of a document, dispose of each finding by Apply / Edit / Dismiss, with every disposition
1210
- recorded as an attributed correction). It rides along because the package bundles the whole
1211
- workspace app — its own build is still open and it has not been through its review gate. Treat it as
1212
- a preview, not a finished feature.
629
+ **The workspace GUI has layouts.** Until now it had exactly one arrangement: a fixed sidebar, the terminal, and a right rail. Now it has four you can name, switch between in one act, and then change however you like.
630
+
631
+ - **Named layouts — `focus` · `read` · `compare` · `review`.** Switch from the header or with ⌃1–⌃4. `focus` gives the terminal the window; `read` makes the document the primary column instead of a 400px strip; `compare` puts two sessions side by side; `review` is the arrangement you already had.
632
+ - **Adjust anything, and it's kept.** Drag a pane by its ⠿ grip to a different edge, drag a column's edge to resize it, fold a pane away — whatever you change is written back into the layout you're in. There is no save button, no "unsaved changes", and nothing to manage. Each stock layout has a **restore** in the list for when you want the original back.
633
+ - **Two terminals at once.** `compare` (or the layout menu) splits the terminal into two groups, each with its own tab strip and its own live session — so you can watch two agents work instead of alternating tabs from memory. Closing the split doesn't kill anything; the second session goes back to being a tab.
634
+ - **Make your own.** `+ new layout from this arrangement` names what you've built; custom layouts can be renamed and deleted.
635
+ - **Layouts belong to the repo you opened.** Each workspace remembers its own, on your machine (`workspace/state/layouts/`) — nothing is sent anywhere.
636
+ - **The sidebar caught up.** Its panes now fold and its width now drags, which only the right rail could do before.
637
+
638
+ **Upgrade note:** the workspace app ships inside the package; `npx create-pmos@latest workspace` installs the new build. If you had already dragged your rail width or hidden it, that carries into this workspace's `review` layout on first run — you keep what you had. Your `state/`, `planning/`, and `okf/` records are untouched. Phones are unchanged: the single-column switcher still owns the layout there, and the layout control is hidden.
639
+
640
+ **Also in this build, and not yet finished:** a **summoned document review** surface (ask for a review of a document, dispose of each finding by Apply / Edit / Dismiss, with every disposition recorded as an attributed correction). It rides along because the package bundles the whole workspace app — its own build is still open and it has not been through its review gate. Treat it as a preview, not a finished feature.
1213
641
 
1214
642
  ## What's new in 0.6.4
1215
643
 
1216
644
  Workspace GUI session controls — two things the PM asked for while working in real terminals.
1217
645
 
1218
- - **Branch awareness + pick/create at session start.** The header now shows the active repo's current
1219
- git branch (dirty-marked), and the new-session form lets you start a session on an existing branch
1220
- or create a new one. It's honest about the shared working tree: switching a branch is repo-wide and
1221
- moves every session in that repo — the form says so rather than faking per-session isolation.
1222
- - **Scratchpad.** A collapsible drawer at the bottom of the terminal column (toggle from the header or
1223
- ⌘J) to stage commands and notes before they hit the terminal — it never overlays the terminal or the
1224
- document reader, persists per workspace, and has **copy** and **→ terminal** (which pastes without
1225
- pressing enter, so nothing auto-runs).
646
+ - **Branch awareness + pick/create at session start.** The header now shows the active repo's current git branch (dirty-marked), and the new-session form lets you start a session on an existing branch or create a new one. It's honest about the shared working tree: switching a branch is repo-wide and moves every session in that repo — the form says so rather than faking per-session isolation.
647
+ - **Scratchpad.** A collapsible drawer at the bottom of the terminal column (toggle from the header or ⌘J) to stage commands and notes before they hit the terminal — it never overlays the terminal or the document reader, persists per workspace, and has **copy** and **→ terminal** (which pastes without pressing enter, so nothing auto-runs).
1226
648
 
1227
- **Upgrade note:** the workspace app ships inside the package; `npx create-pmos@latest workspace`
1228
- installs the new build. Your `state/`, `planning/`, and `okf/` records are untouched — purely additive.
649
+ **Upgrade note:** the workspace app ships inside the package; `npx create-pmos@latest workspace` installs the new build. Your `state/`, `planning/`, and `okf/` records are untouched — purely additive.
1229
650
 
1230
651
  ## What's new in 0.6.1
1231
652
 
1232
653
  A completeness fix: two skills the kit already *pointed at* but didn't *ship*.
1233
654
 
1234
- - **`strategic-brief` and `source-to-concept` now ride in the kit.** The shipped `pmos-router` and
1235
- `prd` skills recommend `strategic-brief` (make the go/no-go case before a PRD — D61, optional and
1236
- router-recommended for new-bet feature work), and `ingest-repo` cites `source-to-concept` as its
1237
- extraction discipline — but neither skill was in the bundle, so those were dangling references.
1238
- Both are now included. They're file-mode-clean (no backend, no network).
655
+ - **`strategic-brief` and `source-to-concept` now ride in the kit.** The shipped `pmos-router` and `prd` skills recommend `strategic-brief` (make the go/no-go case before a PRD — D61, optional and router-recommended for new-bet feature work), and `ingest-repo` cites `source-to-concept` as its extraction discipline — but neither skill was in the bundle, so those were dangling references. Both are now included. They're file-mode-clean (no backend, no network).
1239
656
 
1240
- **Upgrade note:** `npx create-pmos@latest --update` brings both in and never touches your `state/`,
1241
- `planning/`, or `okf/product/` records. Purely additive.
657
+ **Upgrade note:** `npx create-pmos@latest --update` brings both in and never touches your `state/`, `planning/`, or `okf/product/` records. Purely additive.
1242
658
 
1243
659
  ## What's new in 0.6.0
1244
660
 
1245
- 0.5.0 made the kit provider- and model-agnostic. 0.6.0 adds a **face** to the file-mode loop: the
1246
- **Terminal Workspace GUI**, activated by one command.
661
+ 0.5.0 made the kit provider- and model-agnostic. 0.6.0 adds a **face** to the file-mode loop: the **Terminal Workspace GUI**, activated by one command.
1247
662
 
1248
- - **`npx create-pmos@latest workspace` — install and launch the GUI in one step.** The workspace is
1249
- a local companion app that runs your agent sessions as real terminals, with the library and the
1250
- gates in the same window (D62). The command installs it, puts a one-word `pmos` launcher on your
1251
- PATH, and opens your browser on the current repo. After that, `pmos` (plus `pmos status`,
1252
- `pmos stop`, `pmos doctor`) is the daily driver from any folder. The server is localhost-only and
1253
- persistent — close the terminal and your sessions keep running.
663
+ - **`npx create-pmos@latest workspace` — install and launch the GUI in one step.** The workspace is a local companion app that runs your agent sessions as real terminals, with the library and the gates in the same window (D62). The command installs it, puts a one-word `pmos` launcher on your PATH, and opens your browser on the current repo. After that, `pmos` (plus `pmos status`, `pmos stop`, `pmos doctor`) is the daily driver from any folder. The server is localhost-only and persistent — close the terminal and your sessions keep running.
1254
664
 
1255
- > See it before you wire it: `npx create-pmos@latest workspace` in any repo. The gates in the GUI
1256
- > write the same `state/acceptances.jsonl` records the file-mode kit already uses — only on your
1257
- > click, never automatically.
665
+ > See it before you wire it: `npx create-pmos@latest workspace` in any repo. The gates in the GUI write the same `state/acceptances.jsonl` records the file-mode kit already uses — only on your click, never automatically.
1258
666
 
1259
- - **The scaffolder is still dependency-free — on purpose.** Vendoring or updating the file-mode kit
1260
- builds nothing, fetches nothing, and stays proxy-safe exactly as before. The workspace is the one
1261
- place a native module (`node-pty`, for real terminals) is unavoidable, so it installs **only** when
1262
- you explicitly ask for the GUI. The app is bundled in this package — `workspace` builds it locally,
1263
- it is never downloaded.
667
+ - **The scaffolder is still dependency-free — on purpose.** Vendoring or updating the file-mode kit builds nothing, fetches nothing, and stays proxy-safe exactly as before. The workspace is the one place a native module (`node-pty`, for real terminals) is unavoidable, so it installs **only** when you explicitly ask for the GUI. The app is bundled in this package — `workspace` builds it locally, it is never downloaded.
1264
668
 
1265
- - **Graceful when the global install is locked down.** On machines where npm's global folder needs
1266
- elevation, activation doesn't fail — it opens the GUI from the bundled copy and prints the single
1267
- line to get the bare `pmos` command for next time.
669
+ - **Graceful when the global install is locked down.** On machines where npm's global folder needs elevation, activation doesn't fail — it opens the GUI from the bundled copy and prints the single line to get the bare `pmos` command for next time.
1268
670
 
1269
- **Upgrade note:** `npx create-pmos@latest --update` is unchanged and never touches your `state/`,
1270
- `planning/`, or `okf/product/` records. The GUI is purely additive and entirely optional — if you
1271
- never run `create-pmos workspace`, nothing native is ever installed and the file-mode workflow is
1272
- exactly what it was.
671
+ **Upgrade note:** `npx create-pmos@latest --update` is unchanged and never touches your `state/`, `planning/`, or `okf/product/` records. The GUI is purely additive and entirely optional — if you never run `create-pmos workspace`, nothing native is ever installed and the file-mode workflow is exactly what it was.
1273
672
 
1274
673
  ## What's new in 0.5.0
1275
674
 
1276
- 0.4.0 opened the front of the loop. 0.5.0 makes explicit what was always the intent: **the kit is
1277
- provider- and model-agnostic**, and the harness kernel now says so in its own words.
675
+ 0.4.0 opened the front of the loop. 0.5.0 makes explicit what was always the intent: **the kit is provider- and model-agnostic**, and the harness kernel now says so in its own words.
1278
676
 
1279
- - **Any capable coding agent runs the loop — not just Claude Code.** The runtime amendment
1280
- (D09/D34, ratified 2026-07-23) generalizes the evaluator, ingest, and design skills from
1281
- "runs in Claude Code" to "runs in the interactive agent runtime — any capable coding agent;
1282
- PMOS-self happens to use Claude Code, but the runtime is not Claude-specific." Point Codex,
1283
- Cursor, Gemini, or Copilot at `pmos/AGENTS.md` and the same protocol holds.
677
+ - **Any capable coding agent runs the loop — not just Claude Code.** The runtime amendment (D09/D34, ratified 2026-07-23) generalizes the evaluator, ingest, and design skills from "runs in Claude Code" to "runs in the interactive agent runtime — any capable coding agent; PMOS-self happens to use Claude Code, but the runtime is not Claude-specific." Point Codex, Cursor, Gemini, or Copilot at `pmos/AGENTS.md` and the same protocol holds.
1284
678
 
1285
- > Works the same in any of them: open your product folder in the agent, then
1286
- > "Read pmos/AGENTS.md and follow it." The gates, records, and metrics don't care which model
1287
- > wrote the code.
679
+ > Works the same in any of them: open your product folder in the agent, then "Read pmos/AGENTS.md and follow it." The gates, records, and metrics don't care which model wrote the code.
1288
680
 
1289
- - **Per-model calibration.** When you log a run or an eval you can now name the model that did the
1290
- work (`model`) or the judging (`evaluator_model`), so the evaluator's calibration is read *per
1291
- model* instead of silently pooling providers — `scripts/metrics.py` warns when labeled evals span
1292
- more than one evaluator model, because a trust score one model earned isn't inherited by another.
1293
- The design surface is documented as pluggable too (any surface that can take a brief and export a
1294
- component library), not tied to one vendor.
681
+ - **Per-model calibration.** When you log a run or an eval you can now name the model that did the work (`model`) or the judging (`evaluator_model`), so the evaluator's calibration is read *per model* instead of silently pooling providers — `scripts/metrics.py` warns when labeled evals span more than one evaluator model, because a trust score one model earned isn't inherited by another. The design surface is documented as pluggable too (any surface that can take a brief and export a component library), not tied to one vendor.
1295
682
 
1296
- - **A stated security posture that travels with the kit** (`pmos/SECURITY.md`), a `frontier.sh`
1297
- metrics helper, a file-mode `ticket-template.md`, and a sharper `SKILL-FORMAT.md` — all now part
1298
- of the vendored kernel.
683
+ - **A stated security posture that travels with the kit** (`pmos/SECURITY.md`), a `frontier.sh` metrics helper, a file-mode `ticket-template.md`, and a sharper `SKILL-FORMAT.md` — all now part of the vendored kernel.
1299
684
 
1300
- **Upgrade note:** `npx create-pmos@latest --update` brings all of this in and never touches your
1301
- `state/`, `planning/`, or `okf/product/` records. Purely additive — no change to how the gate
1302
- behaves on your existing initiatives.
685
+ **Upgrade note:** `npx create-pmos@latest --update` brings all of this in and never touches your `state/`, `planning/`, or `okf/product/` records. Purely additive — no change to how the gate behaves on your existing initiatives.
1303
686
 
1304
687
  ## What's new in 0.4.0
1305
688
 
1306
- 0.3.0 sharpened the judging. 0.4.0 adds the **front of the loop** — deciding *what* to build and
1307
- whether a user-facing idea is even right *before* a PRD locks it in.
689
+ 0.3.0 sharpened the judging. 0.4.0 adds the **front of the loop** — deciding *what* to build and whether a user-facing idea is even right *before* a PRD locks it in.
1308
690
 
1309
- - **A front door: the `pmos-router` skill.** Not sure which lane a piece of work takes? Start here.
1310
- It maps any entry — "I have an idea", "is this feasible?", "production is broken", "we need copy",
1311
- "just upkeep" — to its lane, its spec artifact, the next skill, and the gates to expect, running
1312
- a sharpness check ("can you *state* the question yet?") and a prior-rejection check on the way. It
1313
- decides nothing; it routes to lanes that already exist.
691
+ - **A front door: the `pmos-router` skill.** Not sure which lane a piece of work takes? Start here. It maps any entry — "I have an idea", "is this feasible?", "production is broken", "we need copy", "just upkeep" — to its lane, its spec artifact, the next skill, and the gates to expect, running a sharpness check ("can you *state* the question yet?") and a prior-rejection check on the way. It decides nothing; it routes to lanes that already exist.
1314
692
 
1315
693
  > Read pmos/AGENTS.md, then follow pmos/skills/pmos-router.skill: I want to [X] — route it.
1316
694
 
1317
- - **The prototype lane: see it before you spec it.** For a user-facing idea, the new
1318
- `prototype` skill runs a pre-PRD visual validation — you give a *quick* brief, a design agent
1319
- produces 2–3 genuinely different lookable options with real draft copy, a designer-grade grilling
1320
- sharpens them (a dialogue, never a score), and you dispose promote / iterate / kill. Promote
1321
- derives the PRD from what you actually validated. It's the cheapest way to kill a bad idea — before
1322
- it's a spec, not after four rebuilds.
695
+ - **The prototype lane: see it before you spec it.** For a user-facing idea, the new `prototype` skill runs a pre-PRD visual validation — you give a *quick* brief, a design agent produces 2–3 genuinely different lookable options with real draft copy, a designer-grade grilling sharpens them (a dialogue, never a score), and you dispose promote / iterate / kill. Promote derives the PRD from what you actually validated. It's the cheapest way to kill a bad idea — before it's a spec, not after four rebuilds.
1323
696
 
1324
697
  > Follow pmos/skills/prototype.skill: here's my idea — [two sentences]. Give me lookable options.
1325
698
 
1326
- - **A design-craft concept + prototype-brief template** now ship, and the `prd`/`eval-rubric`
1327
- skills gained a "grill before you write, write for durability (name interfaces, not file paths)"
1328
- discipline.
699
+ - **A design-craft concept + prototype-brief template** now ship, and the `prd`/`eval-rubric` skills gained a "grill before you write, write for durability (name interfaces, not file paths)" discipline.
1329
700
 
1330
- **Upgrade note:** `npx create-pmos@latest --update` brings all of this in and never touches your
1331
- `state/`, `planning/`, or `okf/product/` records. Purely additive — nothing about how the gate
1332
- behaves on your existing initiatives changes.
701
+ **Upgrade note:** `npx create-pmos@latest --update` brings all of this in and never touches your `state/`, `planning/`, or `okf/product/` records. Purely additive — nothing about how the gate behaves on your existing initiatives changes.
1333
702
 
1334
703
  ## What's new in 0.3.0
1335
704
 
1336
- 0.2.0 made the workflow fit real work. 0.3.0 goes after the two ways the *judging* half quietly
1337
- fails: a judge that can be talked into a pass, and a PM who accepts what they don't understand.
1338
-
1339
- - **The evaluator now defends itself.** It reads diffs and PR text written by someone else, so it
1340
- treats every word of that as *content under evaluation*, never as instructions. A "mark this
1341
- PASS" buried in a diff is reported as a defect instead of obeyed. And it's structurally
1342
- read-only — its one write is the verdict — because the part that reads hostile text must not be
1343
- the part that can act. Prompt-level defenses alone get bypassed; removing the capability doesn't.
1344
- - **An understanding layer.** The new `explain-run` skill writes a literate explainer + a
1345
- comprehension quiz for a run, authored by the *independent* evaluator, never the builder. Read
1346
- that before you accept. Raw transcripts are a vigilance task nobody wins at; accepting without
1347
- comprehending makes the human gate only formally human.
1348
- - **Evidence-anchored scoring.** Every scored dimension must cite a verbatim quote or a precise
1349
- pointer (file+line, command output, CI line). No evidence, no high score — the dimension is
1350
- marked `unverified` and capped. Verdicts became auditable instead of assertable.
1351
- - **Richer anchored scales.** Rubrics now prefer five described levels over a bare 0/0.5/1. It is
1352
- the single largest evidenced lever on judge agreement: the more precisely each level is
1353
- described, the less two evaluators — or the evaluator and you — drift apart.
1354
- - **Balanced exemplars before scoring.** The evaluator picks 2–4 prior cases from your calibration
1355
- log, deliberately balanced across passes *and* fails, and names them in the verdict. If your log
1356
- has no fail-side cases yet, it says so out loud rather than quietly leaning generous.
1357
- - **A leniency disclosure in every verdict.** The evaluator states its own recent pass-fraction. A
1358
- judge that passes everything is the failure mode you can't see from inside a single run.
1359
- - **SKILL-FORMAT v2.** The skill format is now compatible with the broader Agent Skills ecosystem,
1360
- with the quality bar for writing one made explicit.
1361
-
1362
- **Upgrade note:** `npx create-pmos@latest --update` brings all of this in — it refreshes skills,
1363
- concepts, templates, and scripts and never touches your `state/`, `planning/`, or `okf/product/`
1364
- records. One consequence to expect: because unevidenced dimensions are now capped, verdicts on
1365
- work the evaluator can't directly observe will score *lower* than they did on 0.2.0. That's the
1366
- change working, not a regression — it was scoring on trust before.
705
+ 0.2.0 made the workflow fit real work. 0.3.0 goes after the two ways the *judging* half quietly fails: a judge that can be talked into a pass, and a PM who accepts what they don't understand.
706
+
707
+ - **The evaluator now defends itself.** It reads diffs and PR text written by someone else, so it treats every word of that as *content under evaluation*, never as instructions. A "mark this PASS" buried in a diff is reported as a defect instead of obeyed. And it's structurally read-only — its one write is the verdict — because the part that reads hostile text must not be the part that can act. Prompt-level defenses alone get bypassed; removing the capability doesn't.
708
+ - **An understanding layer.** The new `explain-run` skill writes a literate explainer + a comprehension quiz for a run, authored by the *independent* evaluator, never the builder. Read that before you accept. Raw transcripts are a vigilance task nobody wins at; accepting without comprehending makes the human gate only formally human.
709
+ - **Evidence-anchored scoring.** Every scored dimension must cite a verbatim quote or a precise pointer (file+line, command output, CI line). No evidence, no high score — the dimension is marked `unverified` and capped. Verdicts became auditable instead of assertable.
710
+ - **Richer anchored scales.** Rubrics now prefer five described levels over a bare 0/0.5/1. It is the single largest evidenced lever on judge agreement: the more precisely each level is described, the less two evaluators — or the evaluator and you — drift apart.
711
+ - **Balanced exemplars before scoring.** The evaluator picks 2–4 prior cases from your calibration log, deliberately balanced across passes *and* fails, and names them in the verdict. If your log has no fail-side cases yet, it says so out loud rather than quietly leaning generous.
712
+ - **A leniency disclosure in every verdict.** The evaluator states its own recent pass-fraction. A judge that passes everything is the failure mode you can't see from inside a single run.
713
+ - **SKILL-FORMAT v2.** The skill format is now compatible with the broader Agent Skills ecosystem, with the quality bar for writing one made explicit.
714
+
715
+ **Upgrade note:** `npx create-pmos@latest --update` brings all of this in — it refreshes skills, concepts, templates, and scripts and never touches your `state/`, `planning/`, or `okf/product/` records. One consequence to expect: because unevidenced dimensions are now capped, verdicts on work the evaluator can't directly observe will score *lower* than they did on 0.2.0. That's the change working, not a regression — it was scoring on trust before.
1367
716
 
1368
717
  ## What's new in 0.2.0
1369
718
 
1370
719
  The kernel grew four capabilities, each born from real dogfooding of 0.1.x:
1371
720
 
1372
- - **Work-type lanes.** `type: feature | discovery | chore | incident | content` on the initiative
1373
- file — each lane has a fitting spec artifact (spike brief, stated intent, post-hoc incident
1374
- record, content brief) and the gate enforces per lane. Research, maintenance, fires, and copy no
1375
- longer have to cosplay as features.
1376
- - **Human builders, first-class.** `pmos/AGENTS-HUMAN.md` is the whole protocol on one page for a
1377
- person, and `pmos/scripts/pmos-log.sh` writes validated state records with one command — mixed
1378
- human/agent teams share the same files and metrics.
1379
- - **Health budgets.** Maintenance with no honest goal anchors to a declared budget
1380
- (`parent_kr: health:<id>` from `pmos/planning/okrs/health-budgets.md`, seeded with capped
1381
- tech/security/ops lines) instead of forcing a fake goal link. A fake anchor is worse than an
1382
- honest budget.
1383
- - **Test-first Quality Gate.** `templates/product-ci-starter.yml` ships failing-until-wired, so a
1384
- fresh repo's CI is loud until you give it real tests — never silently empty.
1385
-
1386
- **Upgrade note:** the gate now rejects an initiative file with **no `parent_kr`**. If `--update`
1387
- makes an old initiative fail the gate, that file was always unanchored — add a real goal, or a
1388
- health budget id if it's honest maintenance. The gate failing is the fix working. (One caveat for
1389
- upgraders: `--update` never touches `planning/`, so it won't create
1390
- `pmos/planning/okrs/health-budgets.md` — declare your budgets by writing that small table yourself
1391
- or copying it from a fresh vendor; the gate accepts the `health:<id>` string either way, but an
1392
- undeclared budget id is exactly the fake-anchor problem in new clothes.)
721
+ - **Work-type lanes.** `type: feature | discovery | chore | incident | content` on the initiative file — each lane has a fitting spec artifact (spike brief, stated intent, post-hoc incident record, content brief) and the gate enforces per lane. Research, maintenance, fires, and copy no longer have to cosplay as features.
722
+ - **Human builders, first-class.** `pmos/AGENTS-HUMAN.md` is the whole protocol on one page for a person, and `pmos/scripts/pmos-log.sh` writes validated state records with one command — mixed human/agent teams share the same files and metrics.
723
+ - **Health budgets.** Maintenance with no honest goal anchors to a declared budget (`parent_kr: health:<id>` from `pmos/planning/okrs/health-budgets.md`, seeded with capped tech/security/ops lines) instead of forcing a fake goal link. A fake anchor is worse than an honest budget.
724
+ - **Test-first Quality Gate.** `templates/product-ci-starter.yml` ships failing-until-wired, so a fresh repo's CI is loud until you give it real tests — never silently empty.
725
+
726
+ **Upgrade note:** the gate now rejects an initiative file with **no `parent_kr`**. If `--update` makes an old initiative fail the gate, that file was always unanchored — add a real goal, or a health budget id if it's honest maintenance. The gate failing is the fix working. (One caveat for upgraders: `--update` never touches `planning/`, so it won't create `pmos/planning/okrs/health-budgets.md` — declare your budgets by writing that small table yourself or copying it from a fresh vendor; the gate accepts the `health:<id>` string either way, but an undeclared budget id is exactly the fake-anchor problem in new clothes.)
1393
727
 
1394
728
  ## Scope & support
1395
729
 
1396
- This package contains only the PMOS workflow kernel. It holds no reference to, and never
1397
- contacts, any external backend — the publish pipeline verifies that on every release. MIT,
1398
- provided as-is: a snapshot from a private upstream, updated when the maintainer publishes.
1399
- Issues/PRs are not currently monitored — the kit is deliberately self-sufficient; everything it
1400
- needs to teach you is in `pmos/AGENTS.md` and `pmos/README.md`.
730
+ This package contains only the PMOS workflow kernel. It holds no reference to, and never contacts, any external backend — the publish pipeline verifies that on every release. MIT, provided as-is: a snapshot from a private upstream, updated when the maintainer publishes. Issues/PRs are not currently monitored — the kit is deliberately self-sufficient; everything it needs to teach you is in `pmos/AGENTS.md` and `pmos/README.md`.