create-pmos 0.4.0 → 0.6.0

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.
Files changed (67) hide show
  1. package/README.md +149 -4
  2. package/bin/create-pmos.js +97 -8
  3. package/package.json +7 -3
  4. package/payload/AGENTS-HUMAN.md +6 -0
  5. package/payload/AGENTS.md +62 -3
  6. package/payload/KIT-VERSION +2 -2
  7. package/payload/README.md +16 -2
  8. package/payload/SECURITY.md +59 -0
  9. package/payload/okf/core/concepts/design-loop.md +6 -3
  10. package/payload/okf/core/concepts/frontmatter-format.md +75 -0
  11. package/payload/okf/core/concepts/index.md +3 -0
  12. package/payload/okf/core/concepts/log.md +13 -0
  13. package/payload/okf/core/templates/design-brief-template.md +1 -1
  14. package/payload/okf/core/templates/eval-rubric-template.md +12 -10
  15. package/payload/okf/core/templates/prd-template.md +6 -0
  16. package/payload/okf/core/templates/prototype-brief-template.md +45 -21
  17. package/payload/planning/evals/agent-run-eval-rubric.md +10 -7
  18. package/payload/scripts/frontier.sh +60 -0
  19. package/payload/scripts/metrics.py +163 -102
  20. package/payload/scripts/pmos-log.sh +16 -6
  21. package/payload/skills/SKILL-FORMAT.md +72 -9
  22. package/payload/skills/discovery.skill +4 -0
  23. package/payload/skills/eval-rubric.skill +1 -1
  24. package/payload/skills/evaluator.skill +65 -20
  25. package/payload/skills/explain-run.skill +9 -6
  26. package/payload/skills/explain-surface.skill +156 -0
  27. package/payload/skills/ingest-repo.skill +4 -3
  28. package/payload/skills/pmos-router.skill +25 -3
  29. package/payload/skills/prd.skill +8 -0
  30. package/payload/skills/prototype.skill +106 -41
  31. package/payload/skills-native/copywriting/SKILL.md +57 -0
  32. package/payload/skills-native/discovery/SKILL.md +75 -0
  33. package/payload/skills-native/eval-rubric/SKILL.md +159 -0
  34. package/payload/skills-native/evaluator/SKILL.md +182 -0
  35. package/payload/skills-native/explain-run/SKILL.md +121 -0
  36. package/payload/skills-native/explain-surface/SKILL.md +158 -0
  37. package/payload/skills-native/ingest-repo/SKILL.md +120 -0
  38. package/payload/skills-native/okr/SKILL.md +70 -0
  39. package/payload/skills-native/pmos-router/SKILL.md +81 -0
  40. package/payload/skills-native/prd/SKILL.md +117 -0
  41. package/payload/skills-native/prototype/SKILL.md +147 -0
  42. package/payload/state/tickets/.gitkeep +0 -0
  43. package/payload/templates/agent-run-eval-rubric.md +10 -7
  44. package/payload/templates/ticket-template.md +20 -0
  45. package/workspace/README.md +112 -0
  46. package/workspace/REMOTE.md +131 -0
  47. package/workspace/bin/pmos.js +206 -0
  48. package/workspace/doctor.js +99 -0
  49. package/workspace/lib/console-state.js +117 -0
  50. package/workspace/lib/file-mode-parse.js +58 -0
  51. package/workspace/lib/harness-parse.js +222 -0
  52. package/workspace/lib/preview-kind.js +98 -0
  53. package/workspace/lib/rate-limit.js +26 -0
  54. package/workspace/lib/remote-access.js +235 -0
  55. package/workspace/lib/review-gate.js +39 -0
  56. package/workspace/lib/schedule-logic.js +132 -0
  57. package/workspace/lib/skill-store.js +143 -0
  58. package/workspace/lib/surface-contract.js +79 -0
  59. package/workspace/lib/transcript-read.js +247 -0
  60. package/workspace/package-lock.json +94 -0
  61. package/workspace/package.json +23 -0
  62. package/workspace/public/app.js +1710 -0
  63. package/workspace/public/index.html +175 -0
  64. package/workspace/public/styles.css +766 -0
  65. package/workspace/server.js +1753 -0
  66. package/workspace/skills/backlog-triage.skill +13 -0
  67. package/workspace/skills/weekly-report.skill +19 -0
package/README.md CHANGED
@@ -1,10 +1,17 @@
1
+ ---
2
+ type: Reference
3
+ title: "create-pmos"
4
+ timestamp: 2026-07-23
5
+ ---
6
+
1
7
  # create-pmos
2
8
 
3
9
  **A product manager's operating system you can adopt in five minutes — no coding expertise
4
10
  required.** One command puts a disciplined, eval-driven PM workflow inside your own repo:
5
- initiative → PRD → eval rubric → agreed contract → build → three gates. Your AI coding agent
6
- (e.g. Claude Code) does the building. You do the judging. Everything stays in your folder — no
7
- database, no account, no network calls, no telemetry.
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.
8
15
 
9
16
  ## Whose task is what
10
17
 
@@ -43,13 +50,18 @@ What you'll see:
43
50
 
44
51
  Next steps in /home/you/my-product:
45
52
  1. cp pmos/templates/pmos-gate.yml .github/workflows/pmos-gate.yml (only if on GitHub)
46
- 2. Add to the repo's CLAUDE.md: "This product is PMOS-managed (file mode) — read pmos/AGENTS.md before any work."
53
+ 2. Wire PMOS into your agent's instruction file (CLAUDE.md, AGENTS.md, .cursorrules, GEMINI.md, or copilot-instructions): "This product is PMOS-managed (file mode) — read pmos/AGENTS.md before any work."
47
54
  3. Commit the pmos/ folder. Then follow pmos/AGENTS.md for every run.
48
55
  ```
49
56
 
50
57
  Do those three lines and setup is over. A fresh kit with zero history is not behind — it is
51
58
  exactly where every product starts.
52
59
 
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.
64
+
53
65
  ### Behind a corporate proxy? (403 on install)
54
66
 
55
67
  On many work laptops, npm goes through a company registry mirror — and a brand-new public package
@@ -74,6 +86,78 @@ ways through:
74
86
  Same result, byte-identical kit, no proxy involved. (Which is fitting — keeping your work
75
87
  inside your own boundary is the whole point of this kit.)
76
88
 
89
+ ## The Terminal Workspace (GUI) — optional
90
+
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).
95
+
96
+ ### Activate it — one command
97
+
98
+ ```bash
99
+ npx create-pmos@latest workspace
100
+ ```
101
+
102
+ That single command does everything:
103
+
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.
109
+
110
+ From then on, the daily driver is just one word, from any repo folder:
111
+
112
+ ```bash
113
+ pmos # open THIS repo as a workspace (starts the server if it isn't up)
114
+ pmos ../other-repo # open a different repo — one server hosts many, they never disturb each other
115
+ pmos status # is it running? which repos, which sessions?
116
+ pmos stop # shut the server down (scrollback is kept; sessions re-attach next launch)
117
+ pmos doctor # diagnose the environment (node build tools, PTY spawn test)
118
+ ```
119
+
120
+ Close the terminal and your sessions keep running — the server is persistent; `pmos stop` is the
121
+ only thing that ends it.
122
+
123
+ ### If `pmos` doesn't land on your PATH
124
+
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).
130
+
131
+ ### What to expect
132
+
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.
149
+
150
+ <details><summary>Running it from a PMOS checkout instead (no npx)</summary>
151
+
152
+ If you have the PMOS source, the workspace is a normal Node app:
153
+
154
+ ```bash
155
+ cd workspace
156
+ npm install -g . # installs the `pmos` command
157
+ pmos # from any folder
158
+ ```
159
+ </details>
160
+
77
161
  ## Your first conversation
78
162
 
79
163
  Open the folder with your coding agent and talk to it like a colleague — clear about the goal,
@@ -249,6 +333,67 @@ Refreshes the skills, concepts, and scripts only. Your records — `state/`, `pl
249
333
  `okf/product/` — are yours, and an update never touches them. `pmos/KIT-VERSION` always says
250
334
  exactly what you're running.
251
335
 
336
+ ## What's new in 0.6.0
337
+
338
+ 0.5.0 made the kit provider- and model-agnostic. 0.6.0 adds a **face** to the file-mode loop: the
339
+ **Terminal Workspace GUI**, activated by one command.
340
+
341
+ - **`npx create-pmos@latest workspace` — install and launch the GUI in one step.** The workspace is
342
+ a local companion app that runs your agent sessions as real terminals, with the library and the
343
+ gates in the same window (D62). The command installs it, puts a one-word `pmos` launcher on your
344
+ PATH, and opens your browser on the current repo. After that, `pmos` (plus `pmos status`,
345
+ `pmos stop`, `pmos doctor`) is the daily driver from any folder. The server is localhost-only and
346
+ persistent — close the terminal and your sessions keep running.
347
+
348
+ > See it before you wire it: `npx create-pmos@latest workspace` in any repo. The gates in the GUI
349
+ > write the same `state/acceptances.jsonl` records the file-mode kit already uses — only on your
350
+ > click, never automatically.
351
+
352
+ - **The scaffolder is still dependency-free — on purpose.** Vendoring or updating the file-mode kit
353
+ builds nothing, fetches nothing, and stays proxy-safe exactly as before. The workspace is the one
354
+ place a native module (`node-pty`, for real terminals) is unavoidable, so it installs **only** when
355
+ you explicitly ask for the GUI. The app is bundled in this package — `workspace` builds it locally,
356
+ it is never downloaded.
357
+
358
+ - **Graceful when the global install is locked down.** On machines where npm's global folder needs
359
+ elevation, activation doesn't fail — it opens the GUI from the bundled copy and prints the single
360
+ line to get the bare `pmos` command for next time.
361
+
362
+ **Upgrade note:** `npx create-pmos@latest --update` is unchanged and never touches your `state/`,
363
+ `planning/`, or `okf/product/` records. The GUI is purely additive and entirely optional — if you
364
+ never run `create-pmos workspace`, nothing native is ever installed and the file-mode workflow is
365
+ exactly what it was.
366
+
367
+ ## What's new in 0.5.0
368
+
369
+ 0.4.0 opened the front of the loop. 0.5.0 makes explicit what was always the intent: **the kit is
370
+ provider- and model-agnostic**, and the harness kernel now says so in its own words.
371
+
372
+ - **Any capable coding agent runs the loop — not just Claude Code.** The runtime amendment
373
+ (D09/D34, ratified 2026-07-23) generalizes the evaluator, ingest, and design skills from
374
+ "runs in Claude Code" to "runs in the interactive agent runtime — any capable coding agent;
375
+ PMOS-self happens to use Claude Code, but the runtime is not Claude-specific." Point Codex,
376
+ Cursor, Gemini, or Copilot at `pmos/AGENTS.md` and the same protocol holds.
377
+
378
+ > Works the same in any of them: open your product folder in the agent, then
379
+ > "Read pmos/AGENTS.md and follow it." The gates, records, and metrics don't care which model
380
+ > wrote the code.
381
+
382
+ - **Per-model calibration.** When you log a run or an eval you can now name the model that did the
383
+ work (`model`) or the judging (`evaluator_model`), so the evaluator's calibration is read *per
384
+ model* instead of silently pooling providers — `scripts/metrics.py` warns when labeled evals span
385
+ more than one evaluator model, because a trust score one model earned isn't inherited by another.
386
+ The design surface is documented as pluggable too (any surface that can take a brief and export a
387
+ component library), not tied to one vendor.
388
+
389
+ - **A stated security posture that travels with the kit** (`pmos/SECURITY.md`), a `frontier.sh`
390
+ metrics helper, a file-mode `ticket-template.md`, and a sharper `SKILL-FORMAT.md` — all now part
391
+ of the vendored kernel.
392
+
393
+ **Upgrade note:** `npx create-pmos@latest --update` brings all of this in and never touches your
394
+ `state/`, `planning/`, or `okf/product/` records. Purely additive — no change to how the gate
395
+ behaves on your existing initiatives.
396
+
252
397
  ## What's new in 0.4.0
253
398
 
254
399
  0.3.0 sharpened the judging. 0.4.0 adds the **front of the loop** — deciding *what* to build and
@@ -4,25 +4,36 @@
4
4
  *
5
5
  * npx create-pmos@latest [target-dir] vendor a fresh pmos/ kit (default target: cwd)
6
6
  * npx create-pmos@latest --update [dir] refresh ONLY the kernel of an existing kit
7
+ * npx create-pmos@latest workspace [dir] install + launch the Terminal Workspace GUI (D62)
7
8
  * npx create-pmos@latest --version print package version + bundled kernel provenance
8
9
  *
9
- * Dependency-free by design. Makes NO network calls, sends NO telemetry — the payload is
10
- * bundled in this package (assembled by the canonical kit/build-kit.sh at publish time).
11
- * --update never touches state/, planning/ (except check_rubrics.py), or okf/product/.
10
+ * The SCAFFOLDER is dependency-free by design: vendoring/updating the file-mode kit makes NO
11
+ * network calls, sends NO telemetry, and builds NOTHING native — the kit payload is bundled in
12
+ * this package (assembled by the canonical kit/build-kit.sh at publish time). --update never
13
+ * touches state/, planning/ (except check_rubrics.py), or okf/product/.
14
+ *
15
+ * The `workspace` subcommand is the one OPT-IN exception: the Terminal Workspace is a local
16
+ * companion app with a native dependency (node-pty), so activating it runs `npm install`. Nothing
17
+ * native is fetched unless the user explicitly asks for the GUI — the proxy-safe scaffolder path
18
+ * is unchanged. The workspace app itself is bundled in this package, not downloaded.
12
19
  */
13
20
  'use strict';
14
21
  const fs = require('fs');
15
22
  const path = require('path');
23
+ const { spawnSync } = require('child_process');
16
24
 
17
- const PAYLOAD = path.join(__dirname, '..', 'payload'); // the assembled pmos/ kit
25
+ const PAYLOAD = path.join(__dirname, '..', 'payload'); // the assembled pmos/ kit (file-mode)
26
+ const WORKSPACE = path.join(__dirname, '..', 'workspace'); // the bundled Terminal Workspace app (D62)
18
27
  const PKG = require(path.join(__dirname, '..', 'package.json'));
19
28
 
20
29
  // Kernel paths (relative to the kit root) that --update may rewrite. Everything else is state.
21
30
  const KERNEL = [
22
31
  'AGENTS.md',
23
32
  'README.md',
33
+ 'SECURITY.md',
24
34
  'KIT-VERSION',
25
35
  'skills',
36
+ 'skills-native',
26
37
  'okf/core',
27
38
  'scripts',
28
39
  'templates',
@@ -59,7 +70,8 @@ function vendor(targetRoot) {
59
70
  Next steps in ${targetRoot}:
60
71
  1. If the repo is not git yet: git init
61
72
  2. If it lives on GitHub: cp pmos/templates/pmos-gate.yml .github/workflows/pmos-gate.yml
62
- 3. Add to the repo's CLAUDE.md: "This product is PMOS-managed (file mode) — read pmos/AGENTS.md before any work."
73
+ 3. Wire PMOS into your agent's instruction file (CLAUDE.md, AGENTS.md, .cursorrules, GEMINI.md, or
74
+ .github/copilot-instructions.md): "This product is PMOS-managed (file mode) — read pmos/AGENTS.md before any work."
63
75
  4. Commit the pmos/ folder. Then follow pmos/AGENTS.md for every run.`);
64
76
  }
65
77
 
@@ -90,14 +102,91 @@ function update(dirArg) {
90
102
  console.log('state/, planning/ (beyond check_rubrics.py), and okf/product/ were not touched. Review the diff as a normal PR.');
91
103
  }
92
104
 
105
+ // ── workspace ────────────────────────────────────────────────────────────────
106
+ // Activate the Terminal Workspace GUI (D62). This is the one command that installs — the workspace
107
+ // hosts real agent-CLI terminals (PTYs), so it needs the native node-pty module. We do it in two
108
+ // honest steps so the failure mode of each is legible:
109
+ // 1. put the `pmos` command on PATH (npm install -g the bundled app → builds node-pty once)
110
+ // 2. launch it (`pmos <dir>` starts the localhost server + opens the GUI)
111
+ // After this one-time activation, the daily driver is just `pmos` from any repo folder. If the
112
+ // global install can't run (locked-down npm prefix), we DON'T fail — we launch straight from the
113
+ // bundled copy (its own bin/pmos.js installs runtime deps on first run) and print the one manual
114
+ // line to get the bare `pmos` word for next time.
115
+ function onPath(cmd) {
116
+ // `command -v` (POSIX) and `where` (Windows) are shell BUILTINS — neither has a standalone binary on
117
+ // Linux, so the probe MUST run through a shell or it ENOENTs and always reports "not found" (which,
118
+ // after a successful install, prints a false PATH warning and defeats the idempotent fast path). cmd
119
+ // is always a literal, so the string form is injection-safe.
120
+ const probe = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;
121
+ try { return spawnSync(probe, { stdio: 'ignore', shell: true }).status === 0; }
122
+ catch { return false; }
123
+ }
124
+
125
+ function workspaceOrDie() {
126
+ if (!fs.existsSync(path.join(WORKSPACE, 'bin', 'pmos.js'))) {
127
+ die('this build does not bundle the Terminal Workspace — reinstall with `npx create-pmos@latest`, '
128
+ + 'or install it from a PMOS checkout: `cd workspace && npm install -g .`');
129
+ }
130
+ }
131
+
132
+ function launchWorkspace(targetDir, viaGlobal) {
133
+ if (viaGlobal && onPath('pmos')) {
134
+ // `pmos` owns the whole lifecycle: start the server detached, open the browser on this repo.
135
+ return spawnSync('pmos', [targetDir], { stdio: 'inherit', shell: process.platform === 'win32' }).status || 0;
136
+ }
137
+ // Fallback: run the bundled launcher directly. Its ensureInstalled() pulls runtime deps on first run.
138
+ console.log('Launching from the bundled copy (the `pmos` command is not on PATH).');
139
+ return spawnSync(process.execPath, [path.join(WORKSPACE, 'bin', 'pmos.js'), targetDir],
140
+ { stdio: 'inherit', env: process.env }).status || 0;
141
+ }
142
+
143
+ function workspace(targetArg) {
144
+ workspaceOrDie();
145
+ const targetDir = path.resolve(targetArg || '.');
146
+
147
+ // Already activated? Then this is just a launch — fast path, no reinstall.
148
+ if (onPath('pmos')) {
149
+ console.log('✅ workspace already activated — launching. (Type `pmos` directly next time.)');
150
+ process.exit(launchWorkspace(targetDir, true));
151
+ }
152
+
153
+ console.log('Activating the PMOS Terminal Workspace (one-time). Installing node-pty (native) + putting `pmos` on PATH…');
154
+ const npmCmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
155
+ const g = spawnSync(npmCmd, ['install', '-g', WORKSPACE, '--no-audit', '--no-fund'],
156
+ { stdio: 'inherit', shell: process.platform === 'win32' });
157
+
158
+ if (g.status === 0 && onPath('pmos')) {
159
+ console.log('\n✅ `pmos` is now on your PATH. From any repo folder, just type: pmos');
160
+ console.log(' pmos status · pmos stop · pmos doctor');
161
+ process.exit(launchWorkspace(targetDir, true));
162
+ }
163
+
164
+ // Global install refused (common on system-owned npm prefixes) — don't fail, still open the GUI.
165
+ console.log('\n⚠ Could not put `pmos` on your PATH automatically (your npm global prefix may be locked down).');
166
+ console.log(' To get the bare `pmos` command for next time, run ONE of:');
167
+ console.log(` npm install -g "${WORKSPACE}" # then: pmos`);
168
+ console.log(` sudo npm install -g "${WORKSPACE}" # if your node is system-owned`);
169
+ console.log(` Docs: npm prefix without sudo → https://docs.npmjs.com/resolving-eacces-permissions-errors`);
170
+ console.log(' Opening the GUI now from the bundled copy…\n');
171
+ process.exit(launchWorkspace(targetDir, false));
172
+ }
173
+
93
174
  const args = process.argv.slice(2);
175
+ const positional = args.filter((a) => !a.startsWith('-'));
94
176
  if (args.includes('--help') || args.includes('-h')) {
95
- console.log('usage: create-pmos [target-dir] | create-pmos --update [kit-or-repo-dir] | create-pmos --version');
177
+ console.log('usage:');
178
+ console.log(' create-pmos [target-dir] vendor the file-mode kit into a repo');
179
+ console.log(' create-pmos --update [kit-or-repo] refresh only the kit kernel');
180
+ console.log(' create-pmos workspace [repo-dir] install + launch the Terminal Workspace GUI');
181
+ console.log(' create-pmos --version print version + bundled kernel provenance');
96
182
  } else if (args.includes('--version') || args.includes('-v')) {
97
183
  console.log(`create-pmos ${PKG.version}`);
98
184
  console.log(kitVersion());
185
+ console.log(`workspace bundled: ${fs.existsSync(path.join(WORKSPACE, 'bin', 'pmos.js')) ? 'yes' : 'no'}`);
186
+ } else if (positional[0] === 'workspace') {
187
+ workspace(positional[1]);
99
188
  } else if (args.includes('--update')) {
100
- update(args.filter((a) => !a.startsWith('-'))[0]);
189
+ update(positional[0]);
101
190
  } else {
102
- vendor(path.resolve(args.filter((a) => !a.startsWith('-'))[0] || '.'));
191
+ vendor(path.resolve(positional[0] || '.'));
103
192
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pmos",
3
- "version": "0.4.0",
4
- "description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → lane-fit spec → contract → build → three gates, with work-type lanes for features, research, maintenance, incidents, and content) entirely inside your own repo, with all state as git-versioned files. No database, no network, no telemetry.",
3
+ "version": "0.6.0",
4
+ "description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → lane-fit spec → contract → build → three gates, with work-type lanes for features, research, maintenance, incidents, and content) entirely inside your own repo, with all state as git-versioned files. `create-pmos workspace` also installs + launches the local Terminal Workspace GUI. No database, no network, no telemetry.",
5
5
  "license": "MIT",
6
6
  "bin": {
7
7
  "create-pmos": "bin/create-pmos.js"
@@ -9,6 +9,7 @@
9
9
  "files": [
10
10
  "bin/",
11
11
  "payload/",
12
+ "workspace/",
12
13
  "README.md",
13
14
  "LICENSE"
14
15
  ],
@@ -21,6 +22,9 @@
21
22
  "agent-harness",
22
23
  "eval-driven",
23
24
  "scaffold",
24
- "create"
25
+ "create",
26
+ "workspace",
27
+ "terminal",
28
+ "gui"
25
29
  ]
26
30
  }
@@ -1,3 +1,9 @@
1
+ ---
2
+ type: Reference
3
+ title: "AGENTS-HUMAN.md — the PMOS kit for a human builder (D58)"
4
+ timestamp: 2026-07-18
5
+ ---
6
+
1
7
  # AGENTS-HUMAN.md — the PMOS kit for a human builder (D58)
2
8
 
3
9
  You're a person, not an agent — same loop, plain terms, one helper. The full protocol lives in
package/payload/AGENTS.md CHANGED
@@ -1,3 +1,9 @@
1
+ ---
2
+ type: Reference
3
+ title: "AGENTS.md — PMOS Portable Kit (file mode)"
4
+ timestamp: 2026-07-22
5
+ ---
6
+
1
7
  # AGENTS.md — PMOS Portable Kit (file mode)
2
8
 
3
9
  > This file must be read at optimal altitude — concrete heuristics that guide behavior, not brittle
@@ -24,8 +30,8 @@ yourself wanting an MCP tool, use the state adapter below instead.
24
30
  | `get_skill` | read `pmos/skills/<name>.skill` |
25
31
  | `get_okf_concepts` | read `pmos/okf/…` (index-first, then the concept body — progressive disclosure) |
26
32
  | `get_eval_rubric` | read `pmos/planning/evals/<id>-eval-rubric.md` |
27
- | `log_agent_run` | append one JSON line to `pmos/state/runs.jsonl` (`{run_id, initiative_id, pre_run_contract, self_eval, human_corrections, date}`) |
28
- | `save_eval` | append one JSON line to `pmos/state/evals.jsonl` (`{run_id, initiative_id, rubric_path, score, verdict, dimensions, date}`) |
33
+ | `log_agent_run` | append one JSON line to `pmos/state/runs.jsonl` (`{run_id, initiative_id, pre_run_contract, self_eval, human_corrections, date, model}`) — record `model` = the model that produced the run so metrics stay honest across model switches |
34
+ | `save_eval` | append one JSON line to `pmos/state/evals.jsonl` (`{run_id, initiative_id, rubric_path, score, verdict, dimensions, date, evaluator_model}`) — record `evaluator_model` = the model that rendered the verdict; κ is calibrated **per evaluator model** (a model swap does not inherit a prior κ) |
29
35
  | `record_acceptance` | append one JSON line to `pmos/state/acceptances.jsonl` (`{run_id, initiative_id, accepted, pm_label, note, date}`) — **written only on the PM's explicit word** |
30
36
  | `record_outcome_check` | append one JSON line to `pmos/state/outcome_checks.jsonl` (`{initiative_id, disposition, evidence, date}`) — the D57 post-acceptance outcome verdict (`validated | refuted | inconclusive`; evidence required for the first two). **PM's word only — never auto-dispose from metrics**; a re-judgment is a new line |
31
37
  | `save_okf_doc` | write the doc under `pmos/okf/product/…` marked as a DRAFT; the PM approves it via PR review (the file-mode form of draft→approved) |
@@ -52,6 +58,26 @@ never invent a lane; a work shape with no lane escalates to the PM.
52
58
  | `chore` | a one-paragraph `intent:` in the initiative file | repo CI + PM spot-check at merge |
53
59
  | `incident` | incident record at `prd_path`, **post-hoc within 48h** (template in `okf/core/templates/`) — the one sanctioned inversion of eval-first | retro in the record; follow-ups become their own initiatives |
54
60
  | `content` | content brief at `prd_path` (audience, message, claims + sources — `skills/copywriting.skill`, template in `okf/core/templates/`) | copy rubric recommended, not required (D58); PM judges at the gate otherwise |
61
+ | `prototype` | quick prototype brief at `prd_path` (the judgement exercised + the specimen format — `skills/prototype.skill`, template in `okf/core/templates/`), **before** the PRD | **NO rubric, BY DESIGN** — grilled as dialogue, never scored (D60(d)); closes on a PM disposition: promote / iterate / kill |
62
+
63
+ > **Known gap in this kit build:** `scripts/gate-initiative.sh` does not yet parameterise the
64
+ > `prototype` lane — a prototype initiative falls through to the `feature` branch and is asked for a
65
+ > `rubric_path` it must not have. Until that is fixed, set the lane's `type: prototype` in the
66
+ > initiative file as normal and expect to carry the gate failure knowingly, or run the prototype
67
+ > before opening the record. Tracked upstream; not a licence to invent a rubric for leg A.
68
+
69
+ **Routing rule (D60, as amended 2026-07-24) — an idea the PM cannot judge from a DESCRIPTION goes to
70
+ the `prototype` lane BEFORE anyone writes a PRD.** The entry rule is the **specimen test**: *can the
71
+ PM judge this from a description, or do they need an instance of it in front of them?* It is **not
72
+ gated on the work having a user interface** — *does this skill's output actually teach?* and *does
73
+ this API feel right to call?* qualify exactly as an unseen screen does. The PM briefs; an agent
74
+ produces **2–3 divergent specimens in whatever format fits** (lookable UI, a worked sample output,
75
+ call/response transcripts, a schema sketch); a craft-grade grilling sharpens them as **dialogue,
76
+ never a score**; a promote-disposition derives the feature-lane PRD + rubric from what was validated.
77
+ The test must discriminate **both ways** — most work (a tool, a migration, a CI gate) *is*
78
+ description-judgeable and routes straight to its PRD untaxed. Contrast `discovery`, which holds a
79
+ **question** and delivers a **learning**; this lane holds a **candidate** and delivers a **validated
80
+ direction**. Prototypes live in `prototype/` and never ship.
55
81
 
56
82
  `no-initiative` label = anchor-free trivia ONLY (a typo, a broken link). A chore, spike,
57
83
  incident, or piece of content is real work and takes its lane — that is what keeps the record
@@ -64,12 +90,20 @@ honest.
64
90
  No skill fits → escalate to the PM; do not improvise a procedure.
65
91
  3. Retrieve context: `pmos/okf/` for concepts, `pmos/okf/product/` for this product's knowledge,
66
92
  `pmos/state/runs.jsonl` + `discoveries.md` for what prior runs tried (episodic memory).
93
+ - **Existing surface → the PM needs the understanding too.** That retrieval warms *you*. When the
94
+ work touches something that already exists — the test is *would specifying this honestly require
95
+ reading code that already exists?* — run `skills/explain-surface.skill` on that region **before**
96
+ the brief/PRD is authored, in a fresh context and **not** by the agent that will write it.
97
+ Standard for existing surfaces, skipped for greenfield. Without it, the agent acquires the
98
+ understanding and the **PM approves a spec built on facts they never saw**.
67
99
  4. Anchor: the initiative file must exist at stage `intake`/`spec` with its **lane's** spec/eval
68
100
  artifacts authored **before** build (eval-first, D13, generalized per lane — see the lane table
69
101
  above; `feature` = PRD + rubric; the incident lane alone records post-hoc). Contract per lane:
70
102
  `feature` = the rubric's sprint-contract section with the PM's explicit `PM_approved: true`;
71
103
  `discovery` = the PM-approved spike brief (question + timebox); `chore` = the stated intent;
72
- `content` = the PM-approved content brief. No work before the lane's approval. Feature-lane
104
+ `content` = the PM-approved content brief; `prototype` = the PM-approved quick brief (the
105
+ judgement exercised + the specimen format) — and **no rubric**, which is the decision, not an
106
+ omission. No work before the lane's approval. Feature-lane
73
107
  `test_method`s SHOULD be executable checks written before build (D58) — wire
74
108
  `templates/product-ci-starter.yml` so tier 1 is never silently empty.
75
109
  5. Branch `initiative/<id>`; execute at control altitude; one commit per artifact.
@@ -93,6 +127,22 @@ honest.
93
127
  not install the pmos gate, or mirror the initiative file locally** — a vendored sibling gate
94
128
  fails closed on a missing local record by design (S5 Review Gate finding).
95
129
 
130
+ ## Decomposing an initiative into tickets (file mode has no board)
131
+
132
+ When an initiative is bigger than one run, break it into **tickets** — the plain-file equivalent of
133
+ the hosted product's SDLC board. One file per ticket in `pmos/state/tickets/NNN-slug.md`, numbered
134
+ in **dependency order**, from [templates/ticket-template.md](templates/ticket-template.md):
135
+
136
+ - Frontmatter: `id` (the NNN), `title`, `status` (`todo | doing | done`), and `blocked_by` — an
137
+ explicit list of the ticket ids that must be `done` first. Blocking edges are **text**, not a
138
+ hidden graph.
139
+ - **Work the frontier.** `pmos/scripts/frontier.sh` lists exactly the tickets that are not done and
140
+ whose every blocker is done — the workable set. Start only from there. If it reports the frontier
141
+ is *blocked*, there is a cycle or an undone blocker to resolve before more work is startable.
142
+ - Each ticket names **one deliverable**, behaviorally (interfaces/types/contracts, never file paths
143
+ or line numbers — they stale while the ticket waits). Tickets decompose an initiative; they do not
144
+ replace it — the initiative record, PRD, rubric, and the three gates are unchanged.
145
+
96
146
  ## New agent paths — the lethal-trifecta audit
97
147
 
98
148
  Before creating any new agent path or widening a tool grant, verify it does **not** hold all three
@@ -117,6 +167,15 @@ deployment until this repo has accumulated its own PM-vs-evaluator record (appen
117
167
  `pmos/scripts/metrics.py` computes the north star (human corrections per accepted run), pass rates,
118
168
  and the Goodhart tripwire from `pmos/state/`.
119
169
 
170
+ **Model-awareness (any provider).** PMOS is provider/model-agnostic — any capable coding agent can
171
+ run this loop — but calibration is a property of the **evaluator model**, not of "the Review Gate"
172
+ abstractly. Record the model on every run/eval (the `model` / `evaluator_model` fields above); a
173
+ model swap **forks** the calibration record — you do not inherit a κ another model earned, and
174
+ `metrics.py` warns when labeled evals pool more than one evaluator model. The high-judgment roles
175
+ (the adversarial evaluator, `explain-run`) assume a **frontier-tier reasoner**: a weaker model
176
+ degrades *silently* to leniency and grep-clean while its output still looks well-formed — the
177
+ per-model κ is what makes that degradation visible.
178
+
120
179
  ## PM protocol (weekly)
121
180
 
122
181
  Scan `discoveries.md`; a friction theme seen twice with no resolving decision must be promoted to a
@@ -1,3 +1,3 @@
1
- kernel-source: pmos@1687768
2
- assembled: 2026-07-21
1
+ kernel-source: pmos@58bb72a
2
+ assembled: 2026-07-26
3
3
  mode: vendor
package/payload/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ ---
2
+ type: Reference
3
+ title: "PMOS Portable Kit (file mode)"
4
+ timestamp: 2026-07-23
5
+ ---
6
+
1
7
  # PMOS Portable Kit (file mode)
2
8
 
3
9
  Run the PMOS workflow — initiative → PRD → eval rubric → pre-run contract → build →
@@ -13,16 +19,24 @@ personally-owned PMOS backend).
13
19
  - `AGENTS-HUMAN.md` — the same loop for a **human** builder (D58): plain terms + the
14
20
  `scripts/pmos-log.sh` helper that appends validated state records in one command. Mixed
15
21
  human+agent teams share the same state.
22
+ - `SECURITY.md` — the kit's **security posture**: skills are executable instructions, what the kit
23
+ does structurally to be safe to install, and what stays your responsibility. Read it before you
24
+ install skills into your agent.
16
25
  - `skills/` — the PMOS skill kernel (prd, eval-rubric, okr, evaluator, …). Single-sourced from the
17
26
  PMOS repo; where a skill names a hosted tool, apply the AGENTS.md state adapter.
27
+ - `skills-native/` — the same skills in **Agent-Skills standard** form (`<name>/SKILL.md`
28
+ directories), generated from `skills/` so a Claude Code / Codex / skills.sh harness can load them.
29
+ The flat `skills/` files stay the source of truth; this is the portable mirror.
18
30
  - `okf/core/` — kernel concepts (the sdlc loop, the three-tier gate, watermelon flags, …).
19
31
  `okf/product/` — YOUR product's knowledge; drafted by ingest, approved via PR review.
20
32
  - `planning/` — okrs, PRDs, rubrics (`agent-run-eval-rubric.md` is the per-initiative template),
21
33
  `eval-calibration.md` (append every PM override of an evaluator verdict).
22
34
  - `state/` — the operational record, **append-only**: `initiatives/<id>.md`, `runs.jsonl`,
23
- `evals.jsonl`, `acceptances.jsonl`, `discoveries.md`.
35
+ `evals.jsonl`, `acceptances.jsonl`, `discoveries.md`. `tickets/NNN-slug.md` decompose an
36
+ initiative into ordered, dependency-numbered work (file-mode's board — see AGENTS.md).
24
37
  - `scripts/` — `gate-initiative.sh` (the fail-closed CI gate), `metrics.py` (north star +
25
- calibration + Goodhart tripwire), `kit-update.sh` (kernel refresh).
38
+ calibration + Goodhart tripwire), `kit-update.sh` (kernel refresh), `frontier.sh` (lists the
39
+ workable tickets — those not done whose blockers are all done).
26
40
  - `templates/pmos-gate.yml` — CI drop-in; copy to `.github/workflows/`.
27
41
  - `KIT-VERSION` — which PMOS kernel this was assembled from.
28
42
 
@@ -0,0 +1,59 @@
1
+ ---
2
+ type: Reference
3
+ title: "PMOS kit — security posture"
4
+ timestamp: 2026-07-23
5
+ ---
6
+
7
+ # PMOS kit — security posture
8
+
9
+ A skill is not a document. It is **instructions that run inside your agent**, with your agent's
10
+ tools and your agent's access. Anything the kit ships into your repo can shape what your agent does.
11
+ This file states, concretely, what the PMOS kit does to be safe to install — and where the
12
+ responsibility stays yours.
13
+
14
+ ## Why "we scanned it" is not a posture
15
+
16
+ The largest skills registry (skills.sh) shipped a malicious-skill scanner. Trail of Bits bypassed it
17
+ with prompt injection plus compiled bytecode. Static scanning of agent instructions is *evadable by
18
+ construction* — the payload is natural language aimed at a model, not a signature you can enumerate.
19
+ So the PMOS kit does not claim "scanned and safe." It claims a set of **structural** properties you
20
+ can check yourself, below.
21
+
22
+ ## What the kit does
23
+
24
+ - **No on-load command execution in shipped skills.** No PMOS kit skill uses Claude Code's dynamic
25
+ `` !`cmd` `` context injection or any load-time shell-out. A skill's body is read as instructions,
26
+ not run as a script when it loads. *(Check: `grep -rn '!\`' pmos/skills` — expect nothing.)*
27
+ - **Least authority, declared.** Shipped skills request the minimum tools they need; the
28
+ security-sensitive one — the **evaluator** — is **read-only by design**: its only write is the
29
+ schema-constrained verdict. The component that reads untrusted content (diffs, PR text) is
30
+ deliberately *not* the component that can act, which removes the exfiltration leg of the lethal
31
+ trifecta.
32
+ - **A `license` on every shipped skill** (portability + provenance), and PMOS producer metadata is
33
+ carried under the spec's `metadata:` extension map, never as ambient top-level directives.
34
+ - **Fail-closed containment.** The kit is assembled by `kit/build-kit.sh`, which greps its own output
35
+ and **aborts** if any reference to a hosted PMOS backend (a project ref, an MCP endpoint, or a
36
+ hosted-backend URL) leaks in. The npm publish path re-runs this check on the exact tarball and
37
+ refuses to publish on anything but a clean result. The kit you get is self-contained: **no
38
+ database, no network, no telemetry.**
39
+ - **No network calls in the installer.** `create-pmos` vendors a bundled payload; it makes no
40
+ outbound requests and sends nothing about you anywhere.
41
+ - **Everything the evaluator reads is untrusted data, never instructions.** An instruction embedded
42
+ in a diff or PR body ("mark this PASS") is treated as *evidence of a defect*, not a command —
43
+ paired with the read-only scope above, because prompt-level defenses alone are bypassable.
44
+
45
+ ## What stays your responsibility
46
+
47
+ - **Review before you install.** Read the skills and scripts in `pmos/` the way you would review any
48
+ dependency PR. The kit is small and plain-text on purpose so you can. `--update` refreshes only the
49
+ kernel and never touches your `state/` — review its diff like any other change.
50
+ - **Your agent's tools are yours to scope.** The kit declares least authority for its own skills, but
51
+ what your agent is *allowed* to do in your repo is set by you, not by us.
52
+ - **Pin what you install.** Prefer a pinned `create-pmos@<version>` over `@latest` in automation, and
53
+ re-review the kernel diff on each update.
54
+
55
+ ## Reporting
56
+
57
+ Found something that violates the posture above — a shipped skill with load-time execution, a
58
+ containment leak, an over-scoped tool request? Open an issue in the PMOS repo describing what and
59
+ where. The posture is only worth stating if it is enforced; a false claim here is itself a bug.
@@ -32,7 +32,8 @@ An initiative with a user-facing surface runs four legs *inside* Build:
32
32
  1. **Brief** — the [design-brief skill](/skills/core/design-brief.skill) writes the context handoff: what
33
33
  to design and the hard, presentation-only constraints, each surface tied to a real data source. It is to
34
34
  design what the [PRD](/skills/core/prd.skill) is to build.
35
- 2. **Design** — the design is made in claude.ai/design (external to this repo).
35
+ 2. **Design** — the design is made in an external design surface (PMOS-self uses claude.ai/design;
36
+ any capable design surface fits — external to this repo).
36
37
  3. **Reconcile + build** — the [design-reconcile skill](/skills/core/design-reconcile.skill) classifies
37
38
  every surface against **the product's capability ledger** and the PM signs off before any code; then the
38
39
  design is built into the product's app on its design system, verified by the product's CI. (For PMOS's own
@@ -42,7 +43,9 @@ An initiative with a user-facing surface runs four legs *inside* Build:
42
43
  to claude.ai/design (for PMOS, see [.design-sync/conventions.md](/.design-sync/conventions.md)), so the
43
44
  next design starts from the product's actual parts.
44
45
 
45
- Legs 2 and 4 are external tools PMOS *references*; legs 1 and 3 are the PMOS skills that make the loop
46
+ The design surface (legs 2 and 4) is **pluggable and provider-agnostic** — PMOS-self uses
47
+ claude.ai/design, but the loop is not tied to it; any capable design surface that can consume a brief
48
+ and export a component library fits (harness-model-agnosticism). Legs 2 and 4 are external tools PMOS *references*; legs 1 and 3 are the PMOS skills that make the loop
46
49
  repeatable.
47
50
 
48
51
  ## Presentation-only is the load-bearing constraint
@@ -119,7 +122,7 @@ PMOS's own instance: the `web/` app, the [D38](/okf/products/pmos/adr/d38-design
119
122
  [eval-driven](/okf/core/concepts/eval-driven-pm.md) style (the fidelity rubric before the build).
120
123
  - Reconciliation is [watermelon-flag](/okf/core/concepts/watermelon-flag.md) applied to UI.
121
124
  - PMOS stays a [control plane](/okf/core/concepts/control-plane.md): it specs and evaluates design; the design
122
- itself is made in claude.ai/design and built by a build agent.
125
+ itself is made in an external design surface (e.g. claude.ai/design) and built by a build agent.
123
126
  - Formalized by [D48](/okf/products/pmos/adr/d48-design-loop.md); made product-scoped by
124
127
  [D50](/okf/products/pmos/adr/d50-design-loop-product-scoped.md); composes with the design *system* (D38,
125
128
  PMOS's own instance).