create-pmos 0.1.1 → 0.2.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 (34) hide show
  1. package/README.md +72 -8
  2. package/package.json +2 -2
  3. package/payload/AGENTS-HUMAN.md +43 -0
  4. package/payload/AGENTS.md +80 -5
  5. package/payload/KIT-VERSION +2 -2
  6. package/payload/README.md +28 -4
  7. package/payload/okf/core/concepts/health-anchors.md +41 -0
  8. package/payload/okf/core/concepts/index.md +1 -0
  9. package/payload/okf/core/concepts/okr-anti-optimism.md +7 -0
  10. package/payload/okf/core/concepts/okr-tree.md +7 -0
  11. package/payload/okf/core/concepts/output-eval.md +2 -1
  12. package/payload/okf/core/concepts/sdlc-loop.md +2 -1
  13. package/payload/okf/core/templates/content-brief-template.md +70 -0
  14. package/payload/okf/core/templates/design-brief-template.md +1 -1
  15. package/payload/okf/core/templates/eval-rubric-template.md +15 -1
  16. package/payload/okf/core/templates/incident-record-template.md +66 -0
  17. package/payload/okf/core/templates/index.md +3 -0
  18. package/payload/okf/core/templates/prd-template.md +13 -4
  19. package/payload/okf/core/templates/spike-brief-template.md +68 -0
  20. package/payload/planning/evals/agent-run-eval-rubric.md +5 -1
  21. package/payload/planning/okrs/health-budgets.md +7 -0
  22. package/payload/scripts/gate-initiative.sh +50 -11
  23. package/payload/scripts/metrics.py +46 -1
  24. package/payload/scripts/pmos-log.sh +76 -0
  25. package/payload/skills/SKILL-FORMAT.md +103 -1
  26. package/payload/skills/copywriting.skill +55 -0
  27. package/payload/skills/discovery.skill +69 -0
  28. package/payload/skills/eval-rubric.skill +29 -1
  29. package/payload/skills/evaluator.skill +60 -14
  30. package/payload/skills/explain-run.skill +116 -0
  31. package/payload/skills/prd.skill +21 -10
  32. package/payload/state/outcome_checks.jsonl +0 -0
  33. package/payload/templates/agent-run-eval-rubric.md +5 -1
  34. package/payload/templates/product-ci-starter.yml +36 -0
package/README.md CHANGED
@@ -50,6 +50,30 @@ Next steps in /home/you/my-product:
50
50
  Do those three lines and setup is over. A fresh kit with zero history is not behind — it is
51
51
  exactly where every product starts.
52
52
 
53
+ ### Behind a corporate proxy? (403 on install)
54
+
55
+ On many work laptops, npm goes through a company registry mirror — and a brand-new public package
56
+ gets **403 Forbidden** until it's been vetted (a sandboxed AI session's network proxy can do the
57
+ same). That's your environment being careful, not something broken — and there are three clean
58
+ ways through:
59
+
60
+ 1. **Try a plain terminal first** — if the 403 came from inside an AI-session sandbox, the normal
61
+ terminal may just work.
62
+ 2. **Ask IT to allowlist `create-pmos`** — a routine request, and an easy one: public npm, MIT,
63
+ zero dependencies, no install scripts, no network code.
64
+ 3. **The registry-free install** — the package is just a file, so skip the registry entirely.
65
+ From any allowed network, download
66
+ `https://registry.npmjs.org/create-pmos/-/create-pmos-<version>.tgz`, move it to the work
67
+ machine, then:
68
+
69
+ ```bash
70
+ tar xzf create-pmos-*.tgz
71
+ node package/bin/create-pmos.js my-product
72
+ ```
73
+
74
+ Same result, byte-identical kit, no proxy involved. (Which is fitting — keeping your work
75
+ inside your own boundary is the whole point of this kit.)
76
+
53
77
  ## Your first conversation
54
78
 
55
79
  Open the folder with your coding agent and talk to it like a colleague — clear about the goal,
@@ -74,10 +98,16 @@ open about what you don't know. Copy-paste starters:
74
98
  ## The rhythm (every piece of work)
75
99
 
76
100
  1. **Name the work.** An initiative file is created in `pmos/state/initiatives/` — anchored to one
77
- of your goals, so nothing exists "just because."
78
- 2. **Define "good" first.** The agent drafts a PRD and a scoring rubric; you approve the contract
79
- (`PM_approved: true`) before any building. Deciding the standard in advance is your task —
80
- it is also what makes the agent's verdicts mean something later.
101
+ of your goals (or, for honest maintenance with no goal, a declared health budget), so nothing
102
+ exists "just because."
103
+ 2. **Define "good" first.** The agent drafts the spec artifact that fits the work's lane — a PRD +
104
+ scoring rubric for a feature (the default), a spike brief for research (`discovery`), a stated
105
+ intent for maintenance (`chore`), a content brief for copy (`content`). For a feature you
106
+ approve the contract (`PM_approved: true`) before any building — and spike/content briefs get
107
+ your sign-off before work starts too; a chore needs only its stated
108
+ intent, and an `incident` is the one sanctioned inversion — fix first, record within 48 hours.
109
+ Deciding the standard in advance is your task — it is also what makes the agent's verdicts
110
+ mean something later.
81
111
  3. **The agent builds** on its own branch and opens the work for review. A gate checks that every
82
112
  change is anchored. If someone (including the agent) skips the protocol, you'll see:
83
113
 
@@ -101,6 +131,13 @@ open about what you don't know. Copy-paste starters:
101
131
  > I accept this run. Append the acceptance to pmos/state/acceptances.jsonl with pm_label
102
132
  > "pass" and corrections: [how many things you had to fix].
103
133
 
134
+ Or record it yourself, no agent needed — the helper validates and appends in one command
135
+ (`pmos/AGENTS-HUMAN.md` is the whole protocol on one page for humans):
136
+
137
+ ```bash
138
+ pmos/scripts/pmos-log.sh accept <run_id> <initiative_id> pass "one wording fix"
139
+ ```
140
+
104
141
  ## Your weekly ten minutes
105
142
 
106
143
  ```bash
@@ -134,8 +171,8 @@ Each stage of the loop has a mechanism behind it — not a promise, a mechanism:
134
171
 
135
172
  | Without the kit | With the kit |
136
173
  |---|---|
137
- | Work starts because someone felt like it | **Nothing exists without an initiative** anchored to a goal — the gate rejects unanchored work, automatically on GitHub, by one command locally |
138
- | "Good" gets defined after seeing the output (so everything looks fine) | **The rubric and contract are written first** — building is blocked until you've flipped `PM_approved: true` |
174
+ | Work starts because someone felt like it | **Nothing exists without an initiative** anchored to a goal — or a declared health budget for honest maintenance — the gate rejects unanchored work, automatically on GitHub, by one command locally |
175
+ | "Good" gets defined after seeing the output (so everything looks fine) | **The lane's spec artifact is written first** — a feature is blocked until you've flipped `PM_approved: true`; every lane's requirement is gate-enforced (the one sanctioned inversion: an incident is fixed first, recorded within 48h) |
139
176
  | The builder grades their own homework | **A separate adversarial evaluator scores against your rubric** — and even its verdict is advisory; the merge is yours alone |
140
177
  | History gets quietly rewritten | **State files are append-only** — corrections are added, never erased; git keeps the audit trail |
141
178
  | 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 |
@@ -153,8 +190,9 @@ defends structurally rather than relying on discipline:
153
190
  session read `pmos/AGENTS.md` before working — so a new session, a new model, or a new teammate
154
191
  starts on-protocol by default instead of drifting from a stale memory.
155
192
  - **The gate makes skipping visible.** On GitHub it's a failing check nobody can miss; locally
156
- it's the one command before a merge. Keep the `no-initiative` escape hatch for genuine chores
157
- only — if you find yourself reaching for it weekly, that's a signal, not a shortcut.
193
+ it's the one command before a merge. The `no-initiative` escape hatch is for anchor-free
194
+ trivia only (a typo, a broken link) — real maintenance takes the `chore` lane with a stated
195
+ intent, and if you find yourself reaching for the hatch weekly, that's a signal, not a shortcut.
158
196
  - **The weekly ten minutes is the ritual.** Put `metrics.py` + the discoveries scan on your
159
197
  calendar. A friction that shows up twice with no decision gets promoted to a rule — that's how
160
198
  the process improves instead of eroding.
@@ -197,6 +235,32 @@ Refreshes the skills, concepts, and scripts only. Your records — `state/`, `pl
197
235
  `okf/product/` — are yours, and an update never touches them. `pmos/KIT-VERSION` always says
198
236
  exactly what you're running.
199
237
 
238
+ ## What's new in 0.2.0
239
+
240
+ The kernel grew four capabilities, each born from real dogfooding of 0.1.x:
241
+
242
+ - **Work-type lanes.** `type: feature | discovery | chore | incident | content` on the initiative
243
+ file — each lane has a fitting spec artifact (spike brief, stated intent, post-hoc incident
244
+ record, content brief) and the gate enforces per lane. Research, maintenance, fires, and copy no
245
+ longer have to cosplay as features.
246
+ - **Human builders, first-class.** `pmos/AGENTS-HUMAN.md` is the whole protocol on one page for a
247
+ person, and `pmos/scripts/pmos-log.sh` writes validated state records with one command — mixed
248
+ human/agent teams share the same files and metrics.
249
+ - **Health budgets.** Maintenance with no honest goal anchors to a declared budget
250
+ (`parent_kr: health:<id>` from `pmos/planning/okrs/health-budgets.md`, seeded with capped
251
+ tech/security/ops lines) instead of forcing a fake goal link. A fake anchor is worse than an
252
+ honest budget.
253
+ - **Test-first Quality Gate.** `templates/product-ci-starter.yml` ships failing-until-wired, so a
254
+ fresh repo's CI is loud until you give it real tests — never silently empty.
255
+
256
+ **Upgrade note:** the gate now rejects an initiative file with **no `parent_kr`**. If `--update`
257
+ makes an old initiative fail the gate, that file was always unanchored — add a real goal, or a
258
+ health budget id if it's honest maintenance. The gate failing is the fix working. (One caveat for
259
+ upgraders: `--update` never touches `planning/`, so it won't create
260
+ `pmos/planning/okrs/health-budgets.md` — declare your budgets by writing that small table yourself
261
+ or copying it from a fresh vendor; the gate accepts the `health:<id>` string either way, but an
262
+ undeclared budget id is exactly the fake-anchor problem in new clothes.)
263
+
200
264
  ## Scope & support
201
265
 
202
266
  This package contains only the PMOS workflow kernel. It holds no reference to, and never
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pmos",
3
- "version": "0.1.1",
4
- "description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → PRD → eval rubric → contract → build → three gates) entirely inside your own repo, with all state as git-versioned files. No database, no network, no telemetry.",
3
+ "version": "0.2.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.",
5
5
  "license": "MIT",
6
6
  "bin": {
7
7
  "create-pmos": "bin/create-pmos.js"
@@ -0,0 +1,43 @@
1
+ # AGENTS-HUMAN.md — the PMOS kit for a human builder (D58)
2
+
3
+ You're a person, not an agent — same loop, plain terms, one helper. The full protocol lives in
4
+ [AGENTS.md](AGENTS.md); this page is everything you need day-to-day. **Never edit `pmos/state/`
5
+ files by hand — use the helper**, which validates and appends (records are append-only; a
6
+ correction is a new record, never an edit).
7
+
8
+ ## The loop (per piece of work)
9
+
10
+ 1. **Open the work.** Create `pmos/state/initiatives/<id>.md` with a lane
11
+ (`type: feature | discovery | chore | incident | content`) and its artifact — feature: PRD +
12
+ rubric (copy the templates from `pmos/okf/core/templates/`); discovery: a spike brief; chore:
13
+ an `intent:` line; incident: fix first, record within 48h; content: a content brief. Anchor to
14
+ a KR in `pmos/planning/okrs/` — or, for maintenance work with no honest KR, to a declared
15
+ health budget (`parent_kr: health:<id>` from `pmos/planning/okrs/health-budgets.md`). Always
16
+ one or the other; never unanchored.
17
+ 2. **Branch `initiative/<id>`, do the work.** For feature work, write your tests first where you
18
+ can — the CI you wired via `templates/product-ci-starter.yml` is your Quality Gate.
19
+ 3. **Record as you go** (each command prints exactly what it appended):
20
+
21
+ ```sh
22
+ pmos/scripts/pmos-log.sh run <run_id> <initiative_id> [human_corrections]
23
+ pmos/scripts/pmos-log.sh eval <run_id> <initiative_id> <score 0..1> <PASS|PASS-WITH-FINDINGS|FAIL> <rubric_path>
24
+ pmos/scripts/pmos-log.sh accept <run_id> <initiative_id> <pass|fail> "note"
25
+ pmos/scripts/pmos-log.sh outcome <initiative_id> <validated|refuted|inconclusive> "evidence"
26
+ pmos/scripts/pmos-log.sh friction "what fought you"
27
+ ```
28
+
29
+ The helper rejects bad values with a clear message (wrong verdict/disposition, a
30
+ validated/refuted outcome with no evidence, malformed score) — the same rules the hosted
31
+ backend enforces.
32
+ 4. **Merge = the Acceptance Gate.** The **accepting human (the PM)** merges and records it
33
+ (`accept … pass`) — if you built it and someone else accepts, they merge, not you. A solo
34
+ operator is their own PM and merges with that hat on. If
35
+ you declared an `outcome_metric` on the initiative, you're not done until you dispose it at
36
+ its horizon (`outcome …`).
37
+ 5. **Weekly (15 min):** run `python3 pmos/scripts/metrics.py` and read the red first; skim
38
+ `pmos/state/discoveries.md`.
39
+
40
+ ## Working with an agent sometimes?
41
+
42
+ Mixed teams are fine: agents follow `AGENTS.md`, you follow this page — both write the same state
43
+ through the same conventions, and `metrics.py` doesn't care who built.
package/payload/AGENTS.md CHANGED
@@ -18,7 +18,7 @@ yourself wanting an MCP tool, use the state adapter below instead.
18
18
 
19
19
  | Hosted tool (as skills name them) | File-mode equivalent |
20
20
  |---|---|
21
- | `create_initiative` | write `pmos/state/initiatives/<id>.md` (frontmatter: id, title, parent_kr, stage, status, prd_path, rubric_path, created) |
21
+ | `create_initiative` | write `pmos/state/initiatives/<id>.md` (frontmatter: id, title, parent_kr, stage, status, **type** — the D56 lane, default `feature` — plus `intent` for the chore lane, prd_path, rubric_path, created; optionally `outcome_metric` + `outcome_horizon` — the D57 declaration for post-ship success criteria) |
22
22
  | `save_spec` | the PRD file itself at `pmos/planning/prd/<id>-prd.md` (set `prd_path` on the initiative file) |
23
23
  | `get_spec` / `get_planning_artifact` | read `pmos/planning/…` |
24
24
  | `get_skill` | read `pmos/skills/<name>.skill` |
@@ -27,6 +27,7 @@ yourself wanting an MCP tool, use the state adapter below instead.
27
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
28
  | `save_eval` | append one JSON line to `pmos/state/evals.jsonl` (`{run_id, initiative_id, rubric_path, score, verdict, dimensions, date}`) |
29
29
  | `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
+ | `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 |
30
31
  | `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) |
31
32
  | `register_product_repo` | not applicable — this repo IS the product; skip the step |
32
33
  | `log_friction` / `log_discovery` | append to `pmos/state/discoveries.md` (ISO date, `#friction` tag where applicable) |
@@ -36,6 +37,26 @@ State files are **append-only**: never rewrite or delete an existing line or ini
36
37
  correct by appending. When a vendored skill names a hosted tool, apply this table — the skill
37
38
  bodies are single-sourced from the PMOS kernel and are not forked for file mode.
38
39
 
40
+ ## Work-type lanes (D56)
41
+
42
+ Every initiative carries a `type` — the lane picks what the gate requires **before** work; the
43
+ kernel (anchor — a KR **or** `health:<id>` from `planning/okrs/health-budgets.md` (D59) —
44
+ eval-before-work in lane-appropriate form, human Acceptance, append-only state)
45
+ holds in every lane. Unknown/missing type = `feature`, the strictest lane. The enum is closed —
46
+ never invent a lane; a work shape with no lane escalates to the PM.
47
+
48
+ | type | spec artifact the gate requires | eval form |
49
+ |---|---|---|
50
+ | `feature` (default) | PRD + eval rubric before build | rubric + evaluator skill (unchanged) |
51
+ | `discovery` | spike brief at `prd_path` (question + timebox — `skills/discovery.skill`, template in `okf/core/templates/`) | disposition: learned / promoted / discarded; rubric optional |
52
+ | `chore` | a one-paragraph `intent:` in the initiative file | repo CI + PM spot-check at merge |
53
+ | `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
+ | `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 |
55
+
56
+ `no-initiative` label = anchor-free trivia ONLY (a typo, a broken link). A chore, spike,
57
+ incident, or piece of content is real work and takes its lane — that is what keeps the record
58
+ honest.
59
+
39
60
  ## Agent run protocol (every run, in order)
40
61
 
41
62
  1. Read this file.
@@ -43,9 +64,14 @@ bodies are single-sourced from the PMOS kernel and are not forked for file mode.
43
64
  No skill fits → escalate to the PM; do not improvise a procedure.
44
65
  3. Retrieve context: `pmos/okf/` for concepts, `pmos/okf/product/` for this product's knowledge,
45
66
  `pmos/state/runs.jsonl` + `discoveries.md` for what prior runs tried (episodic memory).
46
- 4. Anchor: the initiative file must exist at stage `intake`/`spec` with a PRD and rubric authored
47
- **before** build (eval-first, D13). Write the **pre-run contract** into the rubric's sprint
48
- contract section and get the PM's explicit approval (`PM_approved: true`) before any work.
67
+ 4. Anchor: the initiative file must exist at stage `intake`/`spec` with its **lane's** spec/eval
68
+ artifacts authored **before** build (eval-first, D13, generalized per lane — see the lane table
69
+ above; `feature` = PRD + rubric; the incident lane alone records post-hoc). Contract per lane:
70
+ `feature` = the rubric's sprint-contract section with the PM's explicit `PM_approved: true`;
71
+ `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
73
+ `test_method`s SHOULD be executable checks written before build (D58) — wire
74
+ `templates/product-ci-starter.yml` so tier 1 is never silently empty.
49
75
  5. Branch `initiative/<id>`; execute at control altitude; one commit per artifact.
50
76
  6. Self-evaluate against the contract — self-eval is unreliable; it is an input to the gates, never
51
77
  a verdict.
@@ -55,6 +81,28 @@ bodies are single-sourced from the PMOS kernel and are not forked for file mode.
55
81
  = the human PM merges and disposes — final and non-delegable. Never merge your own PR.
56
82
  8. Log the run (`runs.jsonl`) and any friction (`discoveries.md`, `#friction`).
57
83
 
84
+ ## Human builders & multi-repo initiatives (D58)
85
+
86
+ - **A human building instead of an agent?** Same loop, plain terms: [AGENTS-HUMAN.md](AGENTS-HUMAN.md).
87
+ State is written with `scripts/pmos-log.sh` (validated, append-only) — never hand-edited. Mixed
88
+ human+agent teams write the same state through the same conventions.
89
+ - **An initiative spanning multiple repos?** ONE repo is its **home** — the initiative record,
90
+ brief/PRD, rubric, and state live there. Every sibling repo's PR anchors by declaring
91
+ `Initiative: <id>` in the PR body (the gate's body-key path); records land in the home state
92
+ layer. There is no cross-repo registry — the body key IS the join. **Sibling repos either do
93
+ not install the pmos gate, or mirror the initiative file locally** — a vendored sibling gate
94
+ fails closed on a missing local record by design (S5 Review Gate finding).
95
+
96
+ ## New agent paths — the lethal-trifecta audit
97
+
98
+ Before creating any new agent path or widening a tool grant, verify it does **not** hold all three
99
+ of: **private data access + untrusted-content exposure + external communication**. An agent holding
100
+ all three can be tricked by content it reads into exfiltrating what it knows — remove a leg
101
+ (preferably external communication) structurally; prompt-level defenses alone are bypassed by
102
+ adaptive attacks. If a path genuinely needs all three, its PRD/brief must name the compensating
103
+ gate; silence is not a pass. The evaluator is the standing example: it reads adversarial diffs, so
104
+ it stays read-only with its verdict append as the only write.
105
+
58
106
  ## Escalation (stop and ask the PM)
59
107
 
60
108
  An architectural choice with no recorded decision; a wrong or unsatisfiable contract; scope growth;
@@ -73,7 +121,34 @@ and the Goodhart tripwire from `pmos/state/`.
73
121
 
74
122
  Scan `discoveries.md`; a friction theme seen twice with no resolving decision must be promoted to a
75
123
  decision. Read run records since last review; log overrides to `eval-calibration.md`. Run
76
- `pmos/scripts/metrics.py` and read the red first.
124
+ `pmos/scripts/metrics.py` and read the red first. **Scan the lane mix (D56):** count initiatives
125
+ per `type` — a chore share climbing review over review, discovery spikes that never close their
126
+ disposition, or `no-initiative` PRs that should have been chores are drift signals; a lane misused
127
+ twice is promoted to a decision like any recurring friction. **Scan the anchor mix (D59):** feature-vs-health share of the period's initiatives; a budget over
128
+ its cap or health-shaped work with a KR anchor is a drift signal; quarterly, review the caps.
129
+ **Scan outcome checks (D57):**
130
+ metrics.py lists due outcomes (accepted, past horizon, undisposed) — dispose each
131
+ (`validated | refuted | inconclusive`, evidence for the first two) or consciously defer; a check
132
+ deferred twice, or a horizon moved twice, is promoted like recurring friction. An accepted
133
+ initiative with a declared outcome is NOT finished until disposed. **Read the run's explainer where
134
+ one exists** — the `explain-run` skill writes an independently-authored literate explainer + quiz to
135
+ `pmos/planning/evals/explainers/<run_id>-explainer.md`; start there instead of the raw transcript,
136
+ and for a high-risk run pass its quiz as a comprehension self-check before you accept. Recommended
137
+ discipline, not an enforced gate — accepting runs you cannot explain is the PM's own watermelon.
138
+
139
+ **Anti-atrophy forcing functions (complacency is structural, not a willpower problem):**
140
+ - **Name one hand-verified fact at every Acceptance** — the `record_acceptance` note states something
141
+ *you* checked directly (ran it, read the hunk, reproduced it), not the evaluator's verdict restated.
142
+ - **Watch the acceptance-friction meta-watermelon** — a run of zero-comment, fast acceptances is
143
+ itself a flag; mandated oversight decays into rubber-stamping that legitimizes the system.
144
+ - **Guard the four satisficing heuristics**: plan-as-proxy, tests-as-guarantee (CI-green ≠ correct —
145
+ the Quality Gate is not the Acceptance Gate), eyeballing-suffices, deference-in-unfamiliar-domains.
146
+ - **Adaptive autonomy** — drop an initiative to every-diff review on a failed eval, a reverted merge,
147
+ a gate-touching change, or a subsystem you haven't personally touched in ~3 months.
148
+ - **Monthly**, do one hands-on rep — personally diagnose one defect or re-derive one diff from its
149
+ spec before reading the agent's version (diagnosis-shaped; comprehension decays faster than typing).
150
+ **Quarterly**, ask *"what would I no longer know how to fix by hand?"* — supervision cost rises as
151
+ runs improve.
77
152
 
78
153
  ## Kit maintenance
79
154
 
@@ -1,3 +1,3 @@
1
- kernel-source: pmos@30a011b
2
- assembled: 2026-07-17
1
+ kernel-source: pmos@907bf50
2
+ assembled: 2026-07-20
3
3
  mode: vendor
package/payload/README.md CHANGED
@@ -10,6 +10,9 @@ personally-owned PMOS backend).
10
10
 
11
11
  - `AGENTS.md` — the run protocol. **Start here; every agent session reads it first.** Contains the
12
12
  state adapter: the table mapping each hosted PMOS tool to a file convention.
13
+ - `AGENTS-HUMAN.md` — the same loop for a **human** builder (D58): plain terms + the
14
+ `scripts/pmos-log.sh` helper that appends validated state records in one command. Mixed
15
+ human+agent teams share the same state.
13
16
  - `skills/` — the PMOS skill kernel (prd, eval-rubric, okr, evaluator, …). Single-sourced from the
14
17
  PMOS repo; where a skill names a hosted tool, apply the AGENTS.md state adapter.
15
18
  - `okf/core/` — kernel concepts (the sdlc loop, the three-tier gate, watermelon flags, …).
@@ -35,6 +38,11 @@ workflow: `initiative/<id>` branches, merge = Acceptance), but GitHub is optiona
35
38
  existing code there is nothing to ingest: start by seeding `planning/okrs/` (the okr skill) and a
36
39
  first right-sized initiative; the product's code grows in the same folder.
37
40
 
41
+ **403 on `npx` (corporate proxy/mirror)?** Try a plain terminal (not a sandboxed AI session); ask
42
+ IT to allowlist `create-pmos` (zero deps, no install scripts, no network code); or install
43
+ registry-free — download the `.tgz` from `registry.npmjs.org/create-pmos/-/create-pmos-<v>.tgz`
44
+ on any allowed network, then `tar xzf create-pmos-*.tgz && node package/bin/create-pmos.js <dir>`.
45
+
38
46
  **No GitHub?** Skip the workflow file and run the gate by hand before merging any initiative
39
47
  branch: `HEAD_REF=$(git branch --show-current) bash pmos/scripts/gate-initiative.sh` — green means
40
48
  anchored; your local `git merge` is the Acceptance Gate. If the repo later lands on GitHub, copy
@@ -42,11 +50,17 @@ anchored; your local `git merge` is the Acceptance Gate. If the repo later lands
42
50
 
43
51
  ## Operate (every piece of work)
44
52
 
45
- 1. Create `pmos/state/initiatives/<id>.md` (stage `intake`, anchored to a KR in `planning/okrs/`).
46
- 2. Author the PRD and the rubric **before building** (copy the rubric template); agree the sprint
47
- contract; the PM flips `PM_approved: true`.
53
+ 1. Create `pmos/state/initiatives/<id>.md` (stage `intake`, anchored to a KR in `planning/okrs/` — or to a health budget,
54
+ `parent_kr: health:<id>` from `planning/okrs/health-budgets.md` (D59)),
55
+ with its **work-type lane**: `type: feature` (default) `| discovery | chore | incident | content`
56
+ (D56/D58 — the lane table in `AGENTS.md` says what each requires).
57
+ 2. Author the lane's spec artifacts **before building** — feature: PRD + rubric (copy the
58
+ templates), sprint contract, PM flips `PM_approved: true`; discovery: a spike brief (question +
59
+ timebox) the PM approves; chore: a one-paragraph `intent:`; incident: fix first, record within
60
+ 48h.
48
61
  3. Branch `initiative/<id>`, build, open a PR — the `pmos-gate` CI check fails any PR that isn't
49
- anchored (branch or `Initiative: <id>` in the PR body; `no-initiative` label for genuine chores).
62
+ anchored (branch or `Initiative: <id>` in the PR body; `no-initiative` label for anchor-free
63
+ trivia ONLY — a chore, spike, or incident takes its lane, D56).
50
64
  4. Review Gate: run the evaluator skill against the rubric; append the verdict to
51
65
  `state/evals.jsonl`. The verdict is advisory until locally calibrated.
52
66
  5. Acceptance Gate: the **human PM** merges and disposes; append to `state/acceptances.jsonl`
@@ -64,6 +78,11 @@ Talk to your agent like a colleague; your task is direction and judgment, its ta
64
78
  initiative — fast first win, not completeness."
65
79
  - **Start a piece of work:** "Read pmos/AGENTS.md. I want: [outcome]. Create the initiative file,
66
80
  then draft the PRD and eval rubric for my approval before you build anything."
81
+ - **Explore before committing (discovery lane):** "Read pmos/AGENTS.md. I don't know yet whether
82
+ [idea] is worth building. Open a discovery initiative per pmos/skills/discovery.skill: draft the
83
+ spike brief — one question, a timebox — for my approval. Prototype code is throwaway."
84
+ - **Quick maintenance (chore lane):** "Read pmos/AGENTS.md. Open a chore initiative: [one-sentence
85
+ intent]. No PRD or rubric — just state the intent in the initiative file and do it."
67
86
  - **Review Gate:** "Follow pmos/skills/evaluator.skill: score the work on branch initiative/[id]
68
87
  against its rubric. Be skeptical — try to refute it. Append the verdict to pmos/state/evals.jsonl."
69
88
  - **Acceptance:** "I accept this run. Append the acceptance to pmos/state/acceptances.jsonl with
@@ -87,6 +106,11 @@ PMOS checkout) — refreshes ONLY the kernel (skills/okf-core/scripts/AGENTS.md/
87
106
  stamps `KIT-VERSION`, never touches `state/`, `planning/`, or `okf/product/`. Updates flow
88
107
  one-way, PMOS → kit; review the diff as a normal PR.
89
108
 
109
+ > Upgrade note (D59 kernel): the gate now rejects an initiative file with **no `parent_kr`**
110
+ > (hosted parity, D21). If a pre-D59 vendored file trips it, that file was always unanchored —
111
+ > add a real KR, or `parent_kr: health:<id>` from `planning/okrs/health-budgets.md` if it is
112
+ > honest maintenance. The gate failing is the fix working, not a regression.
113
+
90
114
  ## The containment guarantee
91
115
 
92
116
  The assembly script greps its own output and fails on any reference to the hosted PMOS backend.
@@ -0,0 +1,41 @@
1
+ ---
2
+ type: Concept
3
+ title: Health Anchors
4
+ description: The second anchor class — work anchors to a KR or a declared health budget (a standing, capped, PM-reviewed allocation), so refactor/ops/security work anchors honestly instead of faking a KR or escaping the record.
5
+ tags: [anchoring, health, anti-optimism, budgets]
6
+ timestamp: 2026-07-18
7
+ ---
8
+
9
+ # Health Anchors
10
+
11
+ **Situating context:** Added with [D59](/okf/products/pmos/adr/d59-health-anchors.md) out of the
12
+ SDLC stress test: KR-only anchoring forced legitimate KR-orthogonal work (refactors, ops/SLO
13
+ upkeep, security hardening) into fake anchors or the escape hatch — Goodhart on the anchoring rule
14
+ itself. This concept defines the second anchor class the [OKR tree](/okf/core/concepts/okr-tree.md)
15
+ rule now admits.
16
+
17
+ ## The rule
18
+
19
+ Every initiative anchors ([D21]) — but to one of **two classes**:
20
+
21
+ - **A KR** — an outcome bet: the initiative moves a measurable result.
22
+ - **A health budget** — `health:<id>` from the closed registry
23
+ [`planning/okrs/health-budgets.md`](/planning/okrs/health-budgets.md): a standing, capped
24
+ allocation for work that keeps the system worth building on (tech health, security, ops).
25
+
26
+ The distinction is honest bookkeeping: **health is a budget, not an outcome bet.** Dressing a
27
+ refactor as a KR corrupts both — the KR's metric and the refactor's justification.
28
+
29
+ ## Governance
30
+
31
+ The registry is closed (PM-edited, visible diffs). Caps are shares of a quarter's initiatives.
32
+ The weekly scan reads the **anchor mix** (feature vs health) beside the lane mix — a climbing
33
+ health share, a budget over cap, or health-shaped work still arriving with KR anchors are drift
34
+ signals. The quarterly cadence reviews caps and **promotes** budget work to a real KR when it
35
+ stops being upkeep and becomes a bet.
36
+
37
+ ## Relationship to lanes
38
+
39
+ Orthogonal axes of one kernel rule: the [lane](/okf/products/pmos/adr/d56-initiative-lanes.md)
40
+ fixes WHAT the gate requires; the anchor fixes WHY the work exists. A `chore`-lane refactor
41
+ anchored `health:tech` is the canonical honest pairing.
@@ -7,6 +7,7 @@ to pick concepts, then fetch the file(s) you need.
7
7
  - [control-plane](control-plane.md) — What it means for PMOS to be a control plane — it orchestrates, specs, evaluates, and routes agent work rather than generating production code itself.
8
8
  - [design-loop](design-loop.md) — How PMOS makes UI/UX design a first-class, repeatable sub-flow of the Build stage — brief → design → reconcile → build → design-sync — gated by the Review Gate, presentation-only, and never a data decision.
9
9
  - [eval-driven-pm](eval-driven-pm.md) — PMOS's core method — write the eval before the build. The rubric is the spec; the PM manages by defining what "good" means, not by inspecting work after the fact.
10
+ - [health-anchors](health-anchors.md) — The second anchor class (D59): work anchors to a KR or a declared, capped, PM-reviewed health budget, so refactor/ops/security work anchors honestly.
10
11
  - [okf-governance](okf-governance.md) — How PMOS organizes its Open Knowledge Format bundle and the governance rules that keep it spec-conformant.
11
12
  - [okr-anti-optimism](okr-anti-optimism.md) — Why PMOS biases status reporting toward pessimism — surfacing the red underneath green metrics — to keep KR self-reporting honest.
12
13
  - [okr-tree](okr-tree.md) — How PMOS structures Objectives and Key Results as a tree that links strategy to initiatives and to the agent runs that move them.
@@ -52,3 +52,10 @@ The goal is *calibration*, not gloom. Over-reporting red is also a failure — i
52
52
  ignore reports. The discipline is: report the honest reading, weight uncertainty toward the
53
53
  downside, and always separate "where we are" from "how confident we are." A well-calibrated amber is
54
54
  worth more than a confident green or a reflexive red.
55
+
56
+ ## Amendment — the anchor mix (D59, 2026-07-18)
57
+
58
+ Anti-optimism reporting gains the **anchor mix**: the feature-vs-health share of a period's
59
+ initiatives, read beside the lane mix. Drift signals: a health budget over its cap, a climbing
60
+ health share crowding out outcome bets, or health-shaped work still arriving with KR anchors
61
+ (fake-anchor recidivism). See [health-anchors](/okf/core/concepts/health-anchors.md).
@@ -65,3 +65,10 @@ Individual KRs should ladder toward it, directly or indirectly.
65
65
  - KRs are reviewed on the PM's regular cadence; objectives are reset each period.
66
66
  - The OKR file is an **operational instance** — it lives under `/planning/`, not in OKF. This
67
67
  concept is the timeless *structure*; the quarterly file is the dated *content*.
68
+
69
+ ## Amendment — the second anchor class (D59, 2026-07-18)
70
+
71
+ Initiative anchoring generalizes: an initiative anchors to a KR **or** to a declared
72
+ [health budget](/okf/core/concepts/health-anchors.md) (`health:<id>` from the closed registry in
73
+ `/planning/okrs/health-budgets.md`). Health work is a budget, not an outcome bet — forcing it
74
+ under a KR corrupts both. The tree's KR discipline is unchanged for outcome work.
@@ -39,7 +39,8 @@ nature and a different owner.
39
39
 
40
40
  - **Nature:** subjective, strategic.
41
41
  - **Checks:** strategic fit. Is this what the product actually needs right now? Does it move the
42
- parent KR? **This is NOT a re-check of the rubric.**
42
+ parent KR — or, for health-anchored work, honestly serve its declared budget (D59)? **This is
43
+ NOT a re-check of the rubric.**
43
44
  - **Owner:** the **human PM only**. Non-delegable.
44
45
  - The PM's role at the end of every agent run **is** the Acceptance Gate.
45
46
 
@@ -27,7 +27,8 @@ PMOS drives a closed lifecycle. Each turn of the loop moves one initiative throu
27
27
  ```
28
28
 
29
29
  1. **Spec** — the initiative gets a PRD via the [prd skill](/skills/core/prd.skill). The PRD says
30
- what to build and why, anchored to a KR in the [OKR tree](/okf/core/concepts/okr-tree.md).
30
+ what to build and why, anchored to a KR in the [OKR tree](/okf/core/concepts/okr-tree.md) —
31
+ or, for maintenance work, a declared [health budget](/okf/core/concepts/health-anchors.md) (D59).
31
32
  2. **Contract** — generator and evaluator agree a **pre-run contract**: testable done-criteria,
32
33
  before any work starts. The PM approves it. (P0: temp file + PM approval; P1+:
33
34
  `agent_runs.pre_run_contract`.)
@@ -0,0 +1,70 @@
1
+ ---
2
+ type: Template
3
+ title: Content Brief Template
4
+ description: The scaffold for a content-lane brief (D58) — audience, message, voice, deliverables, claim sources, and an optional weighted copy rubric. Copy into /planning/prd/ as <id>-content-brief.md and set it as the initiative's prd_path.
5
+ tags: [template, content, copywriting, lanes]
6
+ timestamp: 2026-07-18
7
+ ---
8
+
9
+ # Content Brief Template
10
+
11
+ **Situating context:** Authored with [D58](/okf/products/pmos/adr/d58-builder-profiles.md) as the
12
+ content lane's spec artifact — the contract copy work is drafted and judged against. The
13
+ [copywriting skill](/skills/domains/copywriting.skill) instantiates it. A rubric is recommended,
14
+ not required (PM call at D58 ratification); the optional section below is the recommended shape.
15
+
16
+ > Usage: replace every `<…>` placeholder. An empty audience or an unsourced claim list means the
17
+ > brief is not ready. PM approval of this brief is the lane's pre-work contract.
18
+
19
+ ---
20
+
21
+ ```markdown
22
+ # Content Brief: <initiative title>
23
+
24
+ ## Identity
25
+ - initiative_id: <id>
26
+ - type: content
27
+ - product_slug: <product_slug>
28
+ - pm_slug: <pm_slug>
29
+ - parent_KR: <link or health:<id> (D59)> — *"<KR text quoted>"; <why this copy advances it>* <!-- REQUIRED -->
30
+ - status: draft | approved
31
+ - date: <YYYY-MM-DD>
32
+
33
+ ## Audience & placement
34
+ <!-- WHO reads this, WHERE it appears (page/screen/email), and what they know walking in. One
35
+ line per audience/placement pair; each pair gets its own variant in the draft. -->
36
+ - <audience> @ <placement>
37
+
38
+ ## Message
39
+ <!-- The ONE thing each audience should take away, and the action it should prompt. -->
40
+
41
+ ## Voice & constraints
42
+ <!-- Tone (e.g. plain, technical, playful), banned phrases, length limits, required terms,
43
+ localization notes. Link the product voice guide if one exists in OKF. -->
44
+
45
+ ## Claims & sources
46
+ <!-- EVERY factual claim the copy will make, each with its source. Unsourced claims don't ship —
47
+ wrong public claims are incidents, not nits. -->
48
+ - <claim> — <source>
49
+
50
+ ## Deliverables
51
+ - <artifact + path, e.g. web/landing hero copy, README intro>
52
+
53
+ ## Copy rubric (RECOMMENDED, optional — delete if the PM judges at the gate instead)
54
+ | Dimension | Weight |
55
+ |---|---:|
56
+ | Audience-fit (right register + assumed knowledge per variant) | 0.30 |
57
+ | Clarity (message lands in one read; no filler) | 0.30 |
58
+ | Voice (constraints above followed, or deviation argued) | 0.15 |
59
+ | Claim accuracy (every claim matches its source) | 0.25 |
60
+ | **Total** | **1.00** |
61
+ pass_threshold: 0.85
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Authoring checklist
67
+
68
+ - [ ] `parent_KR` present with quoted text — content is anchored work, never the hatch.
69
+ - [ ] Every claim has a source; every audience/placement pair has a planned variant.
70
+ - [ ] PM approved the brief before drafting began.
@@ -28,7 +28,7 @@ instance and does not live in the OKF bundle.
28
28
  - initiative_id: <id>
29
29
  - product_slug: <product_slug>
30
30
  - pm_slug: <pm_slug>
31
- - parent_KR: <objective.kr reference>
31
+ - parent_KR: <objective.kr reference OR health:<id> (D59)>
32
32
  - date: <YYYY-MM-DD>
33
33
 
34
34
  ## Point of view (so the design has one)
@@ -28,7 +28,7 @@ OKF bundle.
28
28
  - initiative_id: <id>
29
29
  - product_slug: <product_slug>
30
30
  - pm_slug: <pm_slug>
31
- - parent_KR: <reference>
31
+ - parent_KR: <reference OR health:<id> (D59)>
32
32
  - pass_threshold: <0.00–1.00> <!-- pre-committed, before output exists -->
33
33
  - date: <YYYY-MM-DD>
34
34
 
@@ -83,7 +83,18 @@ Rules:
83
83
  is repeatable across evaluators (and calibratable against
84
84
  [eval-calibration.md](/planning/evals/eval-calibration.md)).
85
85
  - **Threshold is pre-committed.** Never tune the threshold after seeing the output.
86
+ - **Evidence per dimension.** A Review-Gate verdict must carry, for each scored dimension, a short
87
+ verbatim quote or precise pointer (file+line, query output, CI line) from the evaluated artifact;
88
+ a dimension without evidence is marked `unverified` and scored conservatively (≤ 0.5). Rubric
89
+ authors should write dimensions so that evidence is *citable* — observable outcomes, not
90
+ impressions ([llm-judge-calibration](/planning/research/llm-judge-calibration.md)).
86
91
  - **Outcome-only.** Score the artifact produced, not the tool-call sequence or reasoning path.
92
+ - **Coherence criteria are semantic.** A "rule holds everywhere" criterion must enumerate its
93
+ live-doc set — every living mirror of a live surface (skills, templates, playbooks, concepts,
94
+ protocol docs, tool schemas + their reference/data-model mirrors, UI copy, intake instruments) —
95
+ and be tested by a semantic pass (reading for meaning); a grep sweep is evidence,
96
+ never the definition of done (health-anchors lesson —
97
+ [eval-calibration](/planning/evals/eval-calibration.md)).
87
98
 
88
99
  ## Authoring checklist
89
100
 
@@ -92,4 +103,7 @@ Rules:
92
103
  - [ ] Each dimension supports partial credit with anchored 0/0.5/1.
93
104
  - [ ] `pass_threshold` pre-committed.
94
105
  - [ ] Gate assignment stated; Acceptance Gate marked PM-only, not graded.
106
+ - [ ] Dimensions written so a verdict can cite verbatim evidence per dimension (observable
107
+ outcomes, not impressions).
108
+ - [ ] Any rule-coherence criterion enumerates its live-doc set and tests by semantic pass.
95
109
  - [ ] Sprint contract present with `PM_approved`.