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.
- package/README.md +149 -4
- package/bin/create-pmos.js +97 -8
- package/package.json +7 -3
- package/payload/AGENTS-HUMAN.md +6 -0
- package/payload/AGENTS.md +62 -3
- package/payload/KIT-VERSION +2 -2
- package/payload/README.md +16 -2
- package/payload/SECURITY.md +59 -0
- package/payload/okf/core/concepts/design-loop.md +6 -3
- package/payload/okf/core/concepts/frontmatter-format.md +75 -0
- package/payload/okf/core/concepts/index.md +3 -0
- package/payload/okf/core/concepts/log.md +13 -0
- package/payload/okf/core/templates/design-brief-template.md +1 -1
- package/payload/okf/core/templates/eval-rubric-template.md +12 -10
- package/payload/okf/core/templates/prd-template.md +6 -0
- package/payload/okf/core/templates/prototype-brief-template.md +45 -21
- package/payload/planning/evals/agent-run-eval-rubric.md +10 -7
- package/payload/scripts/frontier.sh +60 -0
- package/payload/scripts/metrics.py +163 -102
- package/payload/scripts/pmos-log.sh +16 -6
- package/payload/skills/SKILL-FORMAT.md +72 -9
- package/payload/skills/discovery.skill +4 -0
- package/payload/skills/eval-rubric.skill +1 -1
- package/payload/skills/evaluator.skill +65 -20
- package/payload/skills/explain-run.skill +9 -6
- package/payload/skills/explain-surface.skill +156 -0
- package/payload/skills/ingest-repo.skill +4 -3
- package/payload/skills/pmos-router.skill +25 -3
- package/payload/skills/prd.skill +8 -0
- package/payload/skills/prototype.skill +106 -41
- package/payload/skills-native/copywriting/SKILL.md +57 -0
- package/payload/skills-native/discovery/SKILL.md +75 -0
- package/payload/skills-native/eval-rubric/SKILL.md +159 -0
- package/payload/skills-native/evaluator/SKILL.md +182 -0
- package/payload/skills-native/explain-run/SKILL.md +121 -0
- package/payload/skills-native/explain-surface/SKILL.md +158 -0
- package/payload/skills-native/ingest-repo/SKILL.md +120 -0
- package/payload/skills-native/okr/SKILL.md +70 -0
- package/payload/skills-native/pmos-router/SKILL.md +81 -0
- package/payload/skills-native/prd/SKILL.md +117 -0
- package/payload/skills-native/prototype/SKILL.md +147 -0
- package/payload/state/tickets/.gitkeep +0 -0
- package/payload/templates/agent-run-eval-rubric.md +10 -7
- package/payload/templates/ticket-template.md +20 -0
- package/workspace/README.md +112 -0
- package/workspace/REMOTE.md +131 -0
- package/workspace/bin/pmos.js +206 -0
- package/workspace/doctor.js +99 -0
- package/workspace/lib/console-state.js +117 -0
- package/workspace/lib/file-mode-parse.js +58 -0
- package/workspace/lib/harness-parse.js +222 -0
- package/workspace/lib/preview-kind.js +98 -0
- package/workspace/lib/rate-limit.js +26 -0
- package/workspace/lib/remote-access.js +235 -0
- package/workspace/lib/review-gate.js +39 -0
- package/workspace/lib/schedule-logic.js +132 -0
- package/workspace/lib/skill-store.js +143 -0
- package/workspace/lib/surface-contract.js +79 -0
- package/workspace/lib/transcript-read.js +247 -0
- package/workspace/package-lock.json +94 -0
- package/workspace/package.json +23 -0
- package/workspace/public/app.js +1710 -0
- package/workspace/public/index.html +175 -0
- package/workspace/public/styles.css +766 -0
- package/workspace/server.js +1753 -0
- package/workspace/skills/backlog-triage.skill +13 -0
- 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.
|
|
6
|
-
|
|
7
|
-
|
|
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.
|
|
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
|
package/bin/create-pmos.js
CHANGED
|
@@ -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
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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');
|
|
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.
|
|
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:
|
|
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(
|
|
189
|
+
update(positional[0]);
|
|
101
190
|
} else {
|
|
102
|
-
vendor(path.resolve(
|
|
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
|
-
"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
|
}
|
package/payload/AGENTS-HUMAN.md
CHANGED
|
@@ -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
|
|
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
|
package/payload/KIT-VERSION
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
kernel-source: pmos@
|
|
2
|
-
assembled: 2026-07-
|
|
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
|
|
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
|
-
|
|
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).
|