create-pmos 0.34.0 → 0.37.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 (83) hide show
  1. package/bin/create-pmos.js +15 -3
  2. package/package.json +1 -1
  3. package/payload/AGENTS.md +2 -0
  4. package/payload/KIT-VERSION +2 -2
  5. package/payload/okf/core/concepts/agent-harness.md +2 -2
  6. package/payload/okf/core/concepts/design-loop.md +5 -5
  7. package/payload/okf/core/concepts/eval-driven-pm.md +1 -1
  8. package/payload/okf/core/concepts/okr-anti-optimism.md +1 -1
  9. package/payload/okf/core/concepts/okr-tree.md +2 -2
  10. package/payload/okf/core/concepts/output-eval.md +2 -2
  11. package/payload/okf/core/concepts/sdlc-loop.md +1 -1
  12. package/payload/okf/core/concepts/self-refining-harness.md +3 -3
  13. package/payload/okf/core/templates/content-brief-template.md +1 -1
  14. package/payload/okf/core/templates/design-brief-template.md +1 -1
  15. package/payload/okf/core/templates/eval-rubric-template.md +1 -1
  16. package/payload/okf/core/templates/log.md +1 -1
  17. package/payload/okf/core/templates/prd-template.md +1 -1
  18. package/payload/okf/core/templates/spike-brief-template.md +1 -1
  19. package/payload/scripts/frontier.sh +6 -2
  20. package/payload/scripts/gate-initiative.sh +24 -3
  21. package/payload/scripts/metrics.py +20 -4
  22. package/payload/scripts/read-jsonl.js +53 -0
  23. package/payload/scripts/workflow-state.js +144 -35
  24. package/payload/scripts/workflow-sweep.js +39 -22
  25. package/payload/skills/SKILL-FORMAT.md +1 -1
  26. package/payload/skills/copywriting.skill +1 -1
  27. package/payload/skills/correction-signal-derive.skill +1 -1
  28. package/payload/skills/design-brief.skill +4 -4
  29. package/payload/skills/design-reconcile.skill +1 -1
  30. package/payload/skills/discovery.skill +3 -3
  31. package/payload/skills/eval-rubric.skill +4 -4
  32. package/payload/skills/evaluator.skill +1 -1
  33. package/payload/skills/explain-run.skill +1 -1
  34. package/payload/skills/explain-surface.skill +6 -6
  35. package/payload/skills/harness-refine.skill +1 -1
  36. package/payload/skills/ingest-repo.skill +6 -6
  37. package/payload/skills/okr.skill +2 -2
  38. package/payload/skills/pmos-router.skill +8 -8
  39. package/payload/skills/prd.skill +5 -5
  40. package/payload/skills/prototype-grill.skill +8 -8
  41. package/payload/skills/prototype.skill +7 -7
  42. package/payload/skills/skill-creator.skill +1 -1
  43. package/payload/skills/source-to-concept.skill +1 -1
  44. package/payload/skills/ste-term-map.md +69 -0
  45. package/payload/skills/strategic-brief.skill +4 -4
  46. package/payload/skills/technical-writing-ste.skill +176 -0
  47. package/payload/skills-native/copywriting/SKILL.md +1 -1
  48. package/payload/skills-native/correction-signal-derive/SKILL.md +1 -1
  49. package/payload/skills-native/design-brief/SKILL.md +4 -4
  50. package/payload/skills-native/design-reconcile/SKILL.md +1 -1
  51. package/payload/skills-native/discovery/SKILL.md +3 -3
  52. package/payload/skills-native/eval-rubric/SKILL.md +4 -4
  53. package/payload/skills-native/evaluator/SKILL.md +1 -1
  54. package/payload/skills-native/explain-run/SKILL.md +1 -1
  55. package/payload/skills-native/explain-surface/SKILL.md +6 -6
  56. package/payload/skills-native/harness-refine/SKILL.md +1 -1
  57. package/payload/skills-native/ingest-repo/SKILL.md +6 -6
  58. package/payload/skills-native/okr/SKILL.md +2 -2
  59. package/payload/skills-native/pmos-router/SKILL.md +8 -8
  60. package/payload/skills-native/prd/SKILL.md +5 -5
  61. package/payload/skills-native/prototype/SKILL.md +7 -7
  62. package/payload/skills-native/prototype-grill/SKILL.md +8 -8
  63. package/payload/skills-native/skill-creator/SKILL.md +1 -1
  64. package/payload/skills-native/source-to-concept/SKILL.md +1 -1
  65. package/payload/skills-native/strategic-brief/SKILL.md +4 -4
  66. package/payload/skills-native/technical-writing-ste/SKILL.md +178 -0
  67. package/workspace/bin/pmos.js +9 -3
  68. package/workspace/lib/engine/read-jsonl.js +53 -0
  69. package/workspace/lib/engine/workflow-state.js +144 -35
  70. package/workspace/lib/file-mode-parse.js +19 -4
  71. package/workspace/lib/tree-share.js +69 -1
  72. package/workspace/package-lock.json +2 -2
  73. package/workspace/package.json +1 -1
  74. package/workspace/public/pm/board-read.js +38 -0
  75. package/workspace/public/pm/data.js +102 -1
  76. package/workspace/public/pm/modes.js +50 -28
  77. package/workspace/public/pm/panel-detail.js +2 -17
  78. package/workspace/public/pm/panel-initiatives.js +3 -20
  79. package/workspace/public/pm/panel-newsess.js +14 -1
  80. package/workspace/public/pm/panel-tabs.js +53 -14
  81. package/workspace/public/pm/tab-term.js +30 -2
  82. package/workspace/server.js +95 -70
  83. package/workspace/test-run.js +51 -9
@@ -18,7 +18,7 @@ whose pieces half-existed). This skill performs the mapping. **It decides nothin
18
18
  lanes and gates that already exist; where it and an authority disagree, the authority wins and the
19
19
  router is the bug (fix it via the weekly harness scan).
20
20
 
21
- > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
21
+ > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
22
22
  > Sources of truth: the AGENTS.md lane list, the initiative gate (PMOS-self: `.github/scripts/initiative-gate.sh`; a vendored kit: `pmos/scripts/gate-initiative.sh`), D56/D58/D60.
23
23
 
24
24
  ## Step 0 — three checks before any route
@@ -26,7 +26,7 @@ router is the bug (fix it via the weekly harness scan).
26
26
  1. **Sharpness (the fog/ticket test):** *can the PM state the question or idea precisely now — not
27
27
  answer it, state it?* If not, it is **fog**: not ready for intake. Name what would sharpen it
28
28
  (a conversation, a datum, a spike) and stop — do not open an initiative to hold fog.
29
- 2. **Prior rejection:** check [planning/out-of-scope/](/planning/out-of-scope/README.md) for the
29
+ 2. **Prior rejection:** check [planning/out-of-scope/](/README.md) for the
30
30
  concept. If a file exists, **read it first** and surface it to the PM — the concept returns only
31
31
  if the PM overrides the recorded reasoning, and the file is updated either way.
32
32
  3. **The specimen test — ASK it, do not wait to be told** (D60 as amended 2026-07-24):
@@ -46,7 +46,7 @@ router is the bug (fix it via the weekly harness scan).
46
46
 
47
47
  > **Would specifying this honestly require reading code that already exists?**
48
48
 
49
- Yes → an [explain-surface](/build-skills/explain-surface.skill) pass runs **first**, before the
49
+ Yes → an [explain-surface](/skills/explain-surface.skill) pass runs **first**, before the
50
50
  spike brief / prototype brief / PRD is authored, in a fresh context. Greenfield → skip it. This is
51
51
  standard, not optional: the PRD skill's own rule ("look it up rather than asking") means the
52
52
  *agent* acquires the understanding and the PM does not, and a spec built on facts the PM never saw
@@ -56,12 +56,12 @@ router is the bug (fix it via the weekly harness scan).
56
56
 
57
57
  | The PM says… | Route | Lane / artifacts / next skill | Gates to expect |
58
58
  |---|---|---|---|
59
- | "I have an idea" the PM **can't judge from a description** — they need an **instance** in front of them (a UI not yet seen; equally *does this skill's output teach?*, *does this API feel right to call?*) | **Prototype first — before any PRD** | `type: prototype`; quick brief at `prd_path` declaring **the judgement exercised + the specimen format** (**no rubric BY DESIGN** — grilled, never scored); [prototype skill](/skills/core/prototype.skill). Format fits the work: lookable UI, a worked sample output, call/response transcripts, a schema sketch. **The class's conventions are a BLOCKING precondition** (design system for UI; SKILL-FORMAT, D19 ACI, migration/RLS conventions elsewhere) — absent → the agent authors them from the same brief, PM approves, first. | Initiative Gate (brief exists); web-ci quarantine; PM disposition (promote/iterate/kill) |
60
- | A **new bet** — new product/capability/direction whose *whether* is unargued | **Offer the strategic brief** (recommended, skippable — D61) | [strategic-brief skill](/skills/core/strategic-brief.skill) → `planning/briefs/<id>-brief.md`; go → feature route below; no-go → file in out-of-scope/ | none (the brief is never a gate) |
61
- | A **validated direction or known feature** (incl. a promoted prototype) | **Feature lane** | `type: feature`; PRD + eval rubric ([prd](/skills/core/prd.skill) + [eval-rubric](/skills/core/eval-rubric.skill) skills), rubric authored alongside (D13); contract before build (D16). A promoted prototype's PRD is **derived from the validated option**. New surface → leg B: [design-brief](/skills/core/design-brief.skill) as the build's reference, held to the [design-reference rubric](/planning/evals/design-reference-eval-rubric.md) | Initiative Gate (PRD+rubric); full three-tier gate |
62
- | "**Is this feasible / should we / how would we…?**" — a **question** with an unknown answer, findable by investigation | **Discovery lane** | `type: discovery`; spike brief at `prd_path` ([discovery skill](/skills/core/discovery.skill)); question + timebox + disposition. Deliverable is a **learning**, and it closes on the **timebox** ("inconclusive" is a recordable outcome). Contrast the row above: that one holds a **candidate** whose rightness no description settles, delivers a **validated direction**, and closes on a **disposition against a specimen**. Widening this lane to cover that was considered and **rejected** in D60 | Initiative Gate (spike brief) |
59
+ | "I have an idea" the PM **can't judge from a description** — they need an **instance** in front of them (a UI not yet seen; equally *does this skill's output teach?*, *does this API feel right to call?*) | **Prototype first — before any PRD** | `type: prototype`; quick brief at `prd_path` declaring **the judgement exercised + the specimen format** (**no rubric BY DESIGN** — grilled, never scored); [prototype skill](/skills/prototype.skill). Format fits the work: lookable UI, a worked sample output, call/response transcripts, a schema sketch. **The class's conventions are a BLOCKING precondition** (design system for UI; SKILL-FORMAT, D19 ACI, migration/RLS conventions elsewhere) — absent → the agent authors them from the same brief, PM approves, first. | Initiative Gate (brief exists); web-ci quarantine; PM disposition (promote/iterate/kill) |
60
+ | A **new bet** — new product/capability/direction whose *whether* is unargued | **Offer the strategic brief** (recommended, skippable — D61) | [strategic-brief skill](/skills/strategic-brief.skill) → `planning/briefs/<id>-brief.md`; go → feature route below; no-go → file in out-of-scope/ | none (the brief is never a gate) |
61
+ | A **validated direction or known feature** (incl. a promoted prototype) | **Feature lane** | `type: feature`; PRD + eval rubric ([prd](/skills/prd.skill) + [eval-rubric](/skills/eval-rubric.skill) skills), rubric authored alongside (D13); contract before build (D16). A promoted prototype's PRD is **derived from the validated option**. New surface → leg B: [design-brief](/skills/design-brief.skill) as the build's reference, held to the [design-reference rubric](/planning/evals/design-reference-eval-rubric.md) | Initiative Gate (PRD+rubric); full three-tier gate |
62
+ | "**Is this feasible / should we / how would we…?**" — a **question** with an unknown answer, findable by investigation | **Discovery lane** | `type: discovery`; spike brief at `prd_path` ([discovery skill](/skills/discovery.skill)); question + timebox + disposition. Deliverable is a **learning**, and it closes on the **timebox** ("inconclusive" is a recordable outcome). Contrast the row above: that one holds a **candidate** whose rightness no description settles, delivers a **validated direction**, and closes on a **disposition against a specimen**. Widening this lane to cover that was considered and **rejected** in D60 | Initiative Gate (spike brief) |
63
63
  | "**Production is broken**" | **Incident lane** | `type: incident`; fix now, record post-hoc within 48h at `prd_path` (the one sanctioned inversion; [incident template](/okf/core/templates/incident-record-template.md)) | Initiative Gate (record, post-hoc) |
64
- | A **text deliverable** (landing page, microcopy, release notes, campaign) | **Content lane** | `type: content`; content brief at `prd_path`, rubric recommended not required (D58); [copywriting skill](/skills/domains/copywriting.skill). Copy for a prototype rides the prototype instead (D60) | Initiative Gate (content brief) |
64
+ | A **text deliverable** (landing page, microcopy, release notes, campaign) | **Content lane** | `type: content`; content brief at `prd_path`, rubric recommended not required (D58); [copywriting skill](/skills/copywriting.skill). Copy for a prototype rides the prototype instead (D60) | Initiative Gate (content brief) |
65
65
  | **Upkeep** — refactor/ops/security with no honest KR | **Chore lane, health-anchored** | `type: chore`; one-paragraph intent in `status`; anchor `health:<id>` from [health-budgets](/planning/okrs/health-budgets.md) (D59) — never a faked KR | Initiative Gate (intent + anchor) |
66
66
 
67
67
  **Every route** still takes the universal steps: anchored initiative row (`create_initiative`),
@@ -16,7 +16,7 @@ strategy, so a generator agent and the PM share one definition of the work befor
16
16
  agreed.
17
17
 
18
18
  > **Format note:** this skill follows three-level progressive disclosure
19
- > ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). Level 1 above is the trigger; this body is Level 2;
19
+ > ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)). Level 1 above is the trigger; this body is Level 2;
20
20
  > rare variants are pushed to Level 3 sub-files referenced by name.
21
21
 
22
22
  ## When to use vs. not
@@ -25,13 +25,13 @@ agreed.
25
25
  - **Do not use** to make the strategic case for *whether* to do the initiative — that is the
26
26
  `strategic-brief` skill. The PRD assumes the initiative is already chosen.
27
27
  - **Do not use** to define how output is judged — that is the
28
- [eval-rubric skill](/skills/core/eval-rubric.skill). PRD and rubric are authored together (see
28
+ [eval-rubric skill](/skills/eval-rubric.skill). PRD and rubric are authored together (see
29
29
  [eval-driven-pm](/okf/core/concepts/eval-driven-pm.md)) but are separate artifacts.
30
30
 
31
31
  ## Procedure
32
32
 
33
33
  0a. **Existing surface? Understand it first — before grilling.** If specifying this honestly
34
- requires reading code that already exists, an [explain-surface](/build-skills/explain-surface.skill)
34
+ requires reading code that already exists, an [explain-surface](/skills/explain-surface.skill)
35
35
  pass runs on that region **first**, in a fresh context and **not by you**. Its *Open questions*
36
36
  section is a declared input to the grilling below: those are the things that could not be
37
37
  determined from the code, and they must be resolved with the PM or carried explicitly into the
@@ -62,7 +62,7 @@ agreed.
62
62
  5. **State success as outcomes, not output.** Success criteria describe a change in the world tied
63
63
  to the anchor — the parent KR, or the declared budget's purpose (D59) — not a list of artifacts
64
64
  produced.
65
- 6. **Pair with a rubric.** Flag that the [eval-rubric](/skills/core/eval-rubric.skill) must be
65
+ 6. **Pair with a rubric.** Flag that the [eval-rubric](/skills/eval-rubric.skill) must be
66
66
  authored before the build starts — the eval is written first.
67
67
  7. **Write for durability.** The PRD (and the contract derived from it) waits while work is
68
68
  scheduled, so write what stays true: name **interfaces, types, and behavioral contracts — never
@@ -111,5 +111,5 @@ its situating sentence (D58); the eval rubric is queued to be written first.
111
111
  (author on first need).
112
112
  - Spike / discovery work where the deliverable is a learning, not a feature, is **not a PRD
113
113
  case** — take the discovery lane ([D56](/okf/products/pmos/adr/d56-initiative-lanes.md)):
114
- [discovery skill](/skills/core/discovery.skill) +
114
+ [discovery skill](/skills/discovery.skill) +
115
115
  [spike-brief template](/okf/core/templates/spike-brief-template.md).
@@ -11,16 +11,16 @@ scope: read:okf, read:prototype, write:prototype
11
11
  # prototype-grill — The second party in D60's dialogue
12
12
 
13
13
  [D60](/okf/products/pmos/adr/d60-prototype-loop.md) clause (d) makes leg A **grilled as dialogue,
14
- never scored**, and [`prototype.skill`](/skills/core/prototype.skill) step 6 has always described the
14
+ never scored**, and [`prototype.skill`](/skills/prototype.skill) step 6 has always described the
15
15
  critic correctly. What it never had was a way to *dispatch* one — so the cheapest path was to grill
16
16
  your own specimens, and **a dialogue with one party is a monologue with extra steps**. This skill is
17
- step 6 made dispatchable, the way [`evaluator`](/build-skills/evaluator.skill) made the Review Gate
18
- first-class and [`explain-surface`](/build-skills/explain-surface.skill) made the understanding pass
17
+ step 6 made dispatchable, the way [`evaluator`](/skills/evaluator.skill) made the Review Gate
18
+ first-class and [`explain-surface`](/skills/explain-surface.skill) made the understanding pass
19
19
  standard.
20
20
 
21
- > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
21
+ > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
22
22
  > L1 above is the trigger; this L2 body is the procedure.
23
- > **Not [`evaluator`](/build-skills/evaluator.skill).** That one *scores a finished diff against a
23
+ > **Not [`evaluator`](/skills/evaluator.skill).** That one *scores a finished diff against a
24
24
  > rubric* and writes a verdict. This one **never scores anything** and writes no verdict. They share
25
25
  > only the adversarial stance. Confusing them is the single most likely way to violate D60 here.
26
26
 
@@ -49,7 +49,7 @@ standard.
49
49
  - **Use** at `prototype.skill` **step 6** — specimens exist in `prototype/<id>/`, the PM has not yet
50
50
  disposed. Also on **iterate**: a second round earns a second grilling, not a re-read of the first.
51
51
  - **Do not use** to compare finished implementations (that is `evaluator`), to judge a design against
52
- a design system (that is [`design-reconcile`](/skills/core/design-reconcile.skill)), or on a lane
52
+ a design system (that is [`design-reconcile`](/skills/design-reconcile.skill)), or on a lane
53
53
  that is not `prototype`. No other lane is ungraded, so this skill's no-score rule would be wrong
54
54
  everywhere else.
55
55
 
@@ -58,7 +58,7 @@ standard.
58
58
  1. **Load the ground.** The initiative record, the quick brief at `prd_path` — specifically **the
59
59
  judgement being exercised** and **the specimen format**, which are what the grilling hangs on —
60
60
  and every specimen in `prototype/<id>/`. Then load the **artifact class's craft**: the design
61
- system for UI, [SKILL-FORMAT](/skills/core/SKILL-FORMAT.md) for a skill,
61
+ system for UI, [SKILL-FORMAT](/skills/SKILL-FORMAT.md) for a skill,
62
62
  [D19](/okf/products/pmos/adr/d19-aci-design.md)'s ACI principle for a tool or API, the OKF spec for
63
63
  a knowledge doc, the migration/RLS conventions for a schema. **A critic without the class's craft
64
64
  produces taste, not a grilling.**
@@ -94,7 +94,7 @@ standard.
94
94
  not a griller pre-empting it. Volunteering it is the violation.
95
95
  8. **Log.** Append the run (`log_agent_run`; file-mode `planning/runs/agent-runs.jsonl`) with
96
96
  `self_eval` recorded as **unscored by design**, so the absence reads as deliberate rather than as
97
- a skipped gate. Friction to [discoveries.md](/discoveries.md) tagged `#friction`.
97
+ a skipped gate. Friction to [discoveries.md](/state/discoveries.md) tagged `#friction`.
98
98
 
99
99
  ## Hard rules
100
100
 
@@ -14,7 +14,7 @@ The [D60](/okf/products/pmos/adr/d60-prototype-loop.md) lane skill. The division
14
14
  point: **the PM briefs; the agent builds the specimen.** The PM should never have to author a design
15
15
  system, a convention set, or a prototype to validate an idea.
16
16
 
17
- > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
17
+ > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
18
18
  > Level 1 above is the trigger; this body is Level 2.
19
19
  > **Scope note (2026-07-24 amendment):** this lane is **no longer gated on the work being a user
20
20
  > interface**. D60's mechanism — *make it examinable, then grill it, before committing to a spec* —
@@ -41,7 +41,7 @@ system, a convention set, or a prototype to validate an idea.
41
41
  [design loop](/okf/core/concepts/design-loop.md): design-brief → design → reconcile, open to new
42
42
  surfaces per D60's D48 amendment).
43
43
  - **Do not use** when you hold a *question* rather than a *candidate* — that is the
44
- [discovery lane](/skills/core/discovery.skill):
44
+ [discovery lane](/skills/discovery.skill):
45
45
 
46
46
  | | You hold | Deliverable | Closes on |
47
47
  |---|---|---|---|
@@ -57,7 +57,7 @@ system, a convention set, or a prototype to validate an idea.
57
57
  1. **Open the lane.** `create_initiative({id, title, parent_kr, type:'prototype', stage:'intake'})` —
58
58
  anchored like all work (D21/D59). Branch `initiative/<id>`.
59
59
  1b. **Improving something that already exists? Understand it first.** If the specimen will replace
60
- or alter an existing surface, run an [explain-surface](/build-skills/explain-surface.skill) pass on
60
+ or alter an existing surface, run an [explain-surface](/skills/explain-surface.skill) pass on
61
61
  it — fresh context, **before** the brief. Divergent options against a surface nobody has
62
62
  characterised diverge from a guess, and the PM cannot grill them honestly. Brand-new → skip.
63
63
  2. **Take the quick brief.** The PM fills the
@@ -73,7 +73,7 @@ system, a convention set, or a prototype to validate an idea.
73
73
  | Class | Its conventions live in |
74
74
  |---|---|
75
75
  | A user interface | the product's **design system** — tokens, type scale, components (PMOS's own app: [D38](/DECISIONS.md); tenants checked at onboarding) |
76
- | A skill | [SKILL-FORMAT](/skills/core/SKILL-FORMAT.md) — three-level progressive disclosure |
76
+ | A skill | [SKILL-FORMAT](/skills/SKILL-FORMAT.md) — three-level progressive disclosure |
77
77
  | A tool or API | [D19](/okf/products/pmos/adr/d19-aci-design.md)'s ACI principle |
78
78
  | A knowledge doc | the OKF spec + [frontmatter-format](/okf/core/concepts/frontmatter-format.md) |
79
79
  | A schema | the repo's migration + RLS conventions |
@@ -105,12 +105,12 @@ system, a convention set, or a prototype to validate an idea.
105
105
  5. **Produce divergent specimens** into `prototype/<id>/` — low-fidelity, self-contained, examinable
106
106
  (whatever renders or reads fastest). **2–3 genuinely different directions, not one safe one with
107
107
  variants** — divergence is the point in any medium. **Real draft content, never placeholder**
108
- (D60: copy rides the prototype — [copywriting.skill](/skills/domains/copywriting.skill) craft
108
+ (D60: copy rides the prototype — [copywriting.skill](/skills/copywriting.skill) craft
109
109
  applies in-loop; claim-sourcing waits for the content lane at production). The non-visual analogue
110
110
  is the same rule: real inputs and real outputs, because fake ones hide exactly the friction the
111
111
  specimen exists to surface. Respect the accessibility floors even at low fidelity.
112
112
  6. **Grill — dialogue, never a score. Dispatch
113
- [`prototype-grill`](/build-skills/prototype-grill.skill).** A craft-grade critic (fresh context,
113
+ [`prototype-grill`](/skills/prototype-grill.skill).** A craft-grade critic (fresh context,
114
114
  default-to-refute stance, the class's craft loaded) interrogates each specimen: *why this
115
115
  structure? what job does the focal element serve? what would the best practitioner in this class
116
116
  say is wrong? what was NOT tried?* It writes `prototype/<id>/grilling.md`. Sharpen the specimens
@@ -131,7 +131,7 @@ system, a convention set, or a prototype to validate an idea.
131
131
  work has a surface, then runs inside that initiative's Build.
132
132
  - **iterate** → back to step 5 with the PM's reaction folded in.
133
133
  - **kill** → record one honest line on the initiative, **file the concept into
134
- [planning/out-of-scope/](/planning/out-of-scope/README.md)** (decision, reasoning, what would
134
+ [planning/out-of-scope/](/README.md)** (decision, reasoning, what would
135
135
  reopen it) so it is not re-prototyped from scratch, and close. A cheap kill is this lane
136
136
  *succeeding*.
137
137
  8. **Log.** `log_agent_run` with the disposition; friction to discoveries.md (`#friction`).
@@ -10,7 +10,7 @@ maturity_mode: active
10
10
  (for AI-draft) spawns a local session to sharpen it. This skill is that session's procedure. It exists
11
11
  because a scheduler skill runs **unattended on a cadence** — a body that is vague or mis-grounded fails
12
12
  silently, at 2am, into a corrupted queue. The authority for body quality is
13
- [SKILL-FORMAT](/skills/core/SKILL-FORMAT.md); do not restate its rules here, apply them.
13
+ [SKILL-FORMAT](/skills/SKILL-FORMAT.md); do not restate its rules here, apply them.
14
14
 
15
15
  A workspace `.skill` differs from a `skills/core/` skill in one way: it keeps **runtime frontmatter**
16
16
  the scheduler reads (`label`, `run: agent`, `agent: claude`, `output:` list = the consistency contract).
@@ -20,7 +20,7 @@ into a curated OKF concept in `core/concepts/` or `products/<product_slug>/`, pr
20
20
  and conforming to the [OKF spec](/okf/core/concepts/okf-governance.md).
21
21
 
22
22
  > **Format note:** three-level progressive disclosure
23
- > ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). Level 1 is the trigger; this body is the spec of
23
+ > ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)). Level 1 is the trigger; this body is the spec of
24
24
  > the procedure; Level 3 holds rare extraction variants.
25
25
 
26
26
  ## Intended procedure (specification)
@@ -0,0 +1,69 @@
1
+ ---
2
+ type: Reference
3
+ title: "PMOS-STE term map — one term per concept"
4
+ description: The register of PMOS terms that have drifted into two names for one thing, with the evidence for each and a recommended canonical term. Level 3 sub-file of the technical-writing-ste skill, implementing ASD-STE100 rules 1.11 and 9.4 — the one rule that binds in every register, including argumentative text.
5
+ tags: [ste, writing, terminology, skills, house-standard]
6
+ timestamp: 2026-08-07
7
+ ---
8
+
9
+ # PMOS-STE term map — one term per concept
10
+
11
+ Level 3 sub-file of `technical-writing-ste.skill`. Read it when you name a concept in any register, or when you notice a second name for something that already has one.
12
+
13
+ Rules 1.11 and 9.4 say it in one line: **do not use different terms for the same item, and keep terminology consistent.** This is the only STE rule that binds in Class C as well as A and B, because two names for one concept costs a reader the same whether the text instructs, describes, or argues.
14
+
15
+ **If you are reading this in your own repo, the method is what transfers, not the entries.** The register below holds PMOS's own drift, kept as worked examples of what an entry looks like and how strong its evidence has to be. Start your own register empty and add to it from *Adding an entry* at the end. The one portable finding is the question in step 2 of that procedure: **ask which reader is mechanical.** It settles most collisions without anyone ruling on anything.
16
+
17
+ ## Status — proposed, not ruled
18
+
19
+ **Every canonical choice below is a recommendation with its evidence, not a decision.** Naming rulings on a live repo are the PM's: each one implies future edits to text that already exists, and the profile's own rule is that it binds new and modified text only. Until the PM rules, this file is a register of *known* drift — which is useful on its own, because you cannot avoid a collision you have not seen.
20
+
21
+ Where the recommendation is strong the entry says so, and says what makes it strong. Where two terms may be genuinely distinct, the entry says that instead of forcing a merge.
22
+
23
+ ## The register — PMOS's own
24
+
25
+ ### 1. `lane` vs `type`, for an initiative's work-type — **strong recommendation: `lane`**
26
+
27
+ The evidence is one-sided:
28
+
29
+ | Source | Says |
30
+ |---|---|
31
+ | `planning/initiatives/*.md` | **211 records** carry `lane:`. **Zero** carry `type:` with a lane value. |
32
+ | `scripts/workflow-state.js` | Reads `fm.lane`, defaulting to `feature`. It never reads a lane from `type`. |
33
+ | `pmos-router.skill` | Instructs `type: prototype`, `type: feature`, `type: discovery`. |
34
+ | `discovery.skill` | Instructs `type: discovery`, and states "file mode: `type: discovery` in the initiative frontmatter". |
35
+ | [`spike-brief-template`](/okf/core/templates/spike-brief-template.md) | Instructs `- type: discovery`. |
36
+
37
+ `type` is already taken. D63 makes `type` the repo-wide frontmatter key whose value comes from `scripts/frontmatter_registry.txt`, and an initiative record's correct value there is `Initiative`. So the three authoring sources tell you to overwrite a required field with a value its registry does not contain.
38
+
39
+ **How it fails, stated precisely:** loudly, not silently. An author who follows those instructions literally writes `type: discovery`, and the Frontmatter Gate rejects it because `discovery` is not in the registry. The cost is a confused author and a wasted CI round, not a corrupt record. It is worth fixing because the instruction is simply wrong, not because the repo is at risk.
40
+
41
+ The MCP argument name `type` is a separate question. That interface is a different surface with its own compatibility story, and this entry does not reach it.
42
+
43
+ ### 2. `pre_run_contract` vs "sprint contract" — **recommendation: split the roles, keep both**
44
+
45
+ CLAUDE.md's own glossary lists them together, as one entry: *"pre_run_contract / sprint contract."* That is the defect stated in the source of truth. Counts across the harness docs, skills and scripts: `pre_run_contract` **20**, "sprint contract" **10**.
46
+
47
+ They are not quite synonyms in practice. `pre_run_contract` is the **field** on a run record. "Sprint contract" is the **section heading** in a rubric where the criteria are written. The honest fix is not to delete one but to say which is which, once, and then hold it: **`pre_run_contract` for the field and the concept; "sprint contract" only as the rubric's section heading, never as a synonym for the concept in prose.**
48
+
49
+ ### 3. "health budget" vs "health anchor" — **watch item, no recommendation**
50
+
51
+ Counts: "health budget" **21**, "health anchor" **3**. The registry file is [`health-budgets.md`](/planning/okrs/health-budgets.md) and the concept file is [`health-anchors`](/okf/core/concepts/health-anchors.md).
52
+
53
+ These may be genuinely distinct: a *budget* is the allocation, and *anchoring* is what an initiative does to it. Forcing them together would lose a real difference. Recorded here so the next author checks the distinction rather than picking whichever came to mind — not to be merged.
54
+
55
+ ## Not drift — do not "fix" these
56
+
57
+ A term map that flags near-misses trains people to ignore it. These pairs look like drift and are not:
58
+
59
+ - **"specimen test" vs "sharpness test."** Two different checks in the router's Step 0 — sharpness is 0.1 (*can the PM state the question?*), the specimen test is 0.3 (*can the PM judge it from a description?*). Both names are correct.
60
+ - **"explainer" vs "surface explainer."** `explain-surface` and `explain-run` produce different artifacts at different ends of the loop. The qualifier carries meaning.
61
+
62
+ ## Adding an entry
63
+
64
+ 1. Find a second name for something already named. Count both, and record the two counts.
65
+ 2. Name what reads the term mechanically — a gate, a script, a field. That reader usually settles the question.
66
+ 3. Write the recommendation, or write "watch item" when the two terms may be distinct.
67
+ 4. Do not rewrite existing text. The profile binds new and modified text only.
68
+
69
+ **Done when:** the entry carries counts, a mechanical reader (or a statement that none exists), and either a recommendation or a stated reason to leave both.
@@ -11,18 +11,18 @@ scope: read:okf, write:planning/briefs
11
11
  # strategic-brief — Make the Strategic Case
12
12
 
13
13
  Produces a strategic brief: the argument for *whether* an initiative should exist, made **before** a
14
- [PRD](/skills/core/prd.skill) specs *what and why in detail*. The PRD assumes the bet is already
14
+ [PRD](/skills/prd.skill) specs *what and why in detail*. The PRD assumes the bet is already
15
15
  chosen; the brief is where that choice is argued. **Activated by [D61](/DECISIONS.md)** (2026-07-21)
16
16
  after being spec-only since P0 — its own activation criteria (OKRs on a regular cadence; initiative
17
17
  volume where informal prioritization strains) are now met.
18
18
 
19
19
  > **Format note:** three-level progressive disclosure
20
- > ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). Level 1 above is the trigger; this body is Level 2.
20
+ > ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)). Level 1 above is the trigger; this body is Level 2.
21
21
 
22
22
  ## When to use vs. not (D61 — optional, router-recommended)
23
23
 
24
24
  - **Use** when the work is a **new bet** — a new product, capability, or direction whose "whether"
25
- has not been argued — typically on the [pmos-router](/skills/core/pmos-router.skill)'s
25
+ has not been argued — typically on the [pmos-router](/skills/pmos-router.skill)'s
26
26
  recommendation at intake. The PM may always demand one.
27
27
  - **Skippable by design.** The brief is never a gate. Skipping it on a new bet is the PM's call;
28
28
  the router recommends, it does not require. (Mandatory briefs recreate the ceremony-pressure
@@ -49,7 +49,7 @@ volume where informal prioritization strains) are now met.
49
49
 
50
50
  - `planning/briefs/<initiative-id>-brief.md` — operational instance, never in the OKF bundle.
51
51
  - An accepted brief becomes the PRD's parent rationale (the PRD links it). A **no-go** files the
52
- concept into [planning/out-of-scope/](/planning/out-of-scope/README.md) so it is not re-litigated.
52
+ concept into [planning/out-of-scope/](/README.md) so it is not re-litigated.
53
53
 
54
54
  ## Level 3 sub-cases
55
55
 
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: technical-writing-ste
3
+ description: Apply the PMOS-STE writing profile — the ASD-STE100 writing rules, scoped by register — when you write or rewrite text a reader must act on: a skill body, a gate or CI failure message, an MCP tool description, workspace copy, an explainer, an OKF concept, a README. Do NOT use it on argumentative text (ADRs, PRD rationale, briefs, eval verdicts, PR bodies), where graded confidence is the payload and the profile deliberately does not apply.
4
+ version: 1.0.0
5
+ owner: wawan
6
+ risk: low
7
+ category: domain
8
+ scope: read:okf, write:any-prose
9
+ ---
10
+
11
+ # technical-writing-ste — Write text a reader can act on once
12
+
13
+ PMOS's output is read under load: an agent parsing a skill body, a PM reading a red CI line. This
14
+ skill carries the **PMOS-STE profile** — the [ASD-STE100](/okf/core/concepts/simplified-technical-english.md)
15
+ writing rules, bound by **register** instead of repo-wide. The scoping is the whole design. That
16
+ concept's *one-meaning trade* section is why: applied uniformly, STE deletes the graded confidence
17
+ that eval verdicts and decision records are made of.
18
+
19
+ > **Format:** three-level progressive disclosure (`SKILL-FORMAT.md`).
20
+ > **This file demonstrates the profile it defines.** The procedure below is Class A. The rationale is
21
+ > Class B. Read the two registers against each other — that contrast teaches faster than the rules do.
22
+
23
+ ## Two things to know before you apply it
24
+
25
+ **PMOS adopts the writing rules, not the vocabulary control.** ASD owns the ~900-word dictionary and
26
+ grants free reproduction only to named aerospace and defense categories. PMOS is in none of them, so
27
+ the word list is neither vendored nor checkable here. **Never write that PMOS output is
28
+ "STE-compliant."** Write "PMOS-STE" and mean the writing rules only. The stronger claim is false.
29
+
30
+ **Nothing mechanical enforces this profile.** No lint runs, and no gate reads it. An advisory
31
+ `ste_lint.py` is a named follow-on, not a shipped thing. The only mechanism is that you read this and
32
+ comply, and the only check is a human at the Acceptance Gate. Treat availability as availability. A
33
+ standard that reads as enforced when it is not is a [watermelon](/okf/core/concepts/watermelon-flag.md).
34
+
35
+ ## Step 1 — Classify the text. Do this first.
36
+
37
+ Ask what the reader must do with it. Derive the class from the path, not from feel.
38
+
39
+ | Class | What the reader must do | Where it lives |
40
+ |---|---|---|
41
+ | **A — instructional** | **Act**, correctly, on one reading | `skills/**` · playbooks and runbooks · gate and CI failure strings · UI copy and microcopy · tool descriptions · template usage notes |
42
+ | **B — descriptive** | **Understand**, not obey | `okf/**` concepts and references · explainers · `**/README.md` · design and data-model docs |
43
+ | **C — argumentative** | **Weigh a judgement under uncertainty** | ADRs and decision records · `planning/prd/**` · briefs · the discoveries log · eval verdicts · PR bodies |
44
+
45
+ The three classes are the rule. **The paths are your repo's, so write them down once.** In PMOS they
46
+ also cover `build-skills/**` and `okf/core/playbooks/**` (A), `planning/explainers/**` and
47
+ `planning/design/**` (B), and `pm-decisions.md` and `discoveries.md` (C). In a product repo they
48
+ cover your CLI output, your error strings and your component copy (A), and your architecture notes
49
+ (B). When a path is not on your list, ask the question in column two and add the answer to the list.
50
+
51
+ Two boundary rules. **Text the PM wrote is Class C**, whatever it is about. And the profile binds
52
+ **new and modified text only** — never rewrite an existing corpus to satisfy it.
53
+
54
+ **Done when:** you can name the class and the row that put it there.
55
+
56
+ ## Step 2 — If the text is Class C, stop here.
57
+
58
+ Class C keeps four things and nothing else:
59
+
60
+ - Short sentences, where they fit.
61
+ - One topic per sentence.
62
+ - Active voice by default.
63
+ - **One term per concept** (1.11, 9.4). This is the one hard rule that binds in every class.
64
+
65
+ Then write freely.
66
+
67
+ **Why this exemption exists — read it, because the reason is the rule.** Class C's payload *is* the
68
+ hedge. "Confidence: medium", "probably", "this should be re-run before the number is quoted" — these
69
+ carry the actual content. STE has no approved way to write them: its recurring-errors list replaces
70
+ `should` and `may` with `MUST`. Apply it here and a recommendation becomes an obligation, an estimate
71
+ becomes a certainty. The text ends up **more certain than its author was**. That inverts the
72
+ [anti-optimism](/okf/core/concepts/okr-anti-optimism.md) stance PMOS reports by. The exemption is not
73
+ leniency for hard-to-constrain prose. It is the profile refusing to damage its own repo.
74
+
75
+ **Done when:** you have applied the four principles and stopped.
76
+
77
+ ## Step 3 — For Class A, write to act on.
78
+
79
+ Apply these. Rule numbers point into the standard.
80
+
81
+ - **≤20 words per sentence** (5.1). Count under 8.4–8.7. Each of these counts as **one word**:
82
+ - a number, or a number with its unit
83
+ - an abbreviation, or an alphanumeric identifier
84
+ - a parenthetical
85
+ - a hyphenated word
86
+ - **One instruction per sentence** (5.2), unless the actions happen at the same time.
87
+ - **Imperative form** (5.3). Say "Run the gate", not "the gate should be run".
88
+ - **Condition first, then a comma, then the command** (5.4). "If the branch is `claude/*`, name the
89
+ initiative in the PR body."
90
+ - **Notes inform. Notes never instruct** (5.5).
91
+ - **Active voice** (3.6). Simple verb forms only (3.2). Keep `-ing` inside a technical noun (3.5).
92
+ - **Noun clusters: three words maximum** (2.1).
93
+ - **Keep every word** (4.2). No contractions, no dropped articles.
94
+ - **Vertical lists for anything complex** (4.3).
95
+ - **No semicolons** (8.1).
96
+ - **Every pronoun resolves to one antecedent** (GR-3, GR-4). This one earns its place in agent
97
+ instructions: an unresolvable "it" is where a run silently guesses.
98
+ - **Inclusive language** (GR-7). Use they/them when a person's pronouns are not stated.
99
+ - **Warnings carry three parts** (7.1–7.3): the risk level, the command, the consequence. Use this for
100
+ every destructive or irreversible action.
101
+ - **One term per concept** (1.11, 9.4). Pick the term, then use only that term.
102
+
103
+ **Done when:** every sentence is ≤20 words, every instruction stands alone, and every pronoun resolves.
104
+
105
+ ### A worked pair — a real gate message
106
+
107
+ From PMOS's own workflow gate (`scripts/workflow-state.js`), the `how` line for rule O4:
108
+
109
+ > **Before:** `run build-skills/explain-surface.skill in a FRESH context (not the agent that will
110
+ > write the spec), then set explainer_path:`
111
+ >
112
+ > **After:** `Run build-skills/explain-surface.skill in a fresh context. Do not use the agent that
113
+ > will write the spec. Then set explainer_path.`
114
+
115
+ One command with a prohibition buried in a parenthetical becomes three short commands. The
116
+ prohibition is now impossible to skim past. Nothing was lost.
117
+
118
+ ## Step 4 — For Class B, write to be understood.
119
+
120
+ - **≤25 words per sentence** (6.3), counted the same way.
121
+ - **One topic per paragraph** (6.5). **Six sentences maximum** (6.6).
122
+ - **Give information gradually** (6.1). Let key words carry the structure (6.2).
123
+ - Carried over from Class A, unchanged:
124
+ - **active voice** (3.6) and **≤3-word noun clusters** (2.1)
125
+ - **no semicolons** (8.1) and **keep every word** (4.2)
126
+ - **pronouns resolve** (GR-3, GR-4) and **inclusive language** (GR-7)
127
+ - **one term per concept** (1.11, 9.4)
128
+ - **The imperative stays out.** Description is not instruction (section 6).
129
+
130
+ **Done when:** no sentence passes 25 words, no paragraph holds two topics or seven sentences.
131
+
132
+ ### A worked pair — a real concept sentence
133
+
134
+ From [eval-driven-pm](/okf/core/concepts/eval-driven-pm.md) — 42 words, one semicolon, a nested aside:
135
+
136
+ > **Before:** "The Quality and Review gates check the work against the pre-written rubric
137
+ > mechanically; the PM's scarce attention is spent on the one question the rubric cannot answer —
138
+ > *is this the right thing?* — and on whether the rubric itself was right."
139
+ >
140
+ > **After:** "The Quality and Review gates check the work against the pre-written rubric
141
+ > mechanically. The rubric cannot answer one question: is this the right thing? The PM spends their
142
+ > scarce attention there, and on whether the rubric itself was right."
143
+
144
+ 14, 13 and 18 words. The passive is gone. **State the trade honestly:** the original's aside had more
145
+ bite, and the rewrite is flatter. For reference text that price is worth paying. For an argument it is
146
+ not — which is why Class C exists.
147
+
148
+ ## Step 5 — Check the register held.
149
+
150
+ Read the finished text once more and ask the one question the word counts cannot answer:
151
+
152
+ > **Did an instruction leak into descriptive text, or a hedge get flattened out of an argument?**
153
+
154
+ Two shapes answer yes. A Class B passage has turned imperative. Or a Class C sentence's "probably"
155
+ has become "must". Either one is the failure this profile exists to prevent. Fix it there.
156
+
157
+ **Done when:** the text reads in the register its class names.
158
+
159
+ ## Quality bar
160
+
161
+ Before you call the text done, confirm each of these:
162
+
163
+ - The class is derived from the table, not felt.
164
+ - Class A sentences are ≤20 words. Class B sentences are ≤25. Both counted under 8.4–8.7.
165
+ - One term per concept, throughout.
166
+ - Every pronoun resolves to one antecedent.
167
+ - Class C kept its hedges.
168
+ - Nothing claims "STE compliance".
169
+
170
+ ## Level 3 sub-cases
171
+
172
+ - `ste-term-map.md` — the one-term-per-concept register (1.11,
173
+ 9.4). Read it when you name a concept in **any** register, including Class C. It holds the known
174
+ drift with its evidence, and it proposes canonical terms rather than ruling on them.
175
+ - `ste-safety-instructions.md` — not yet written. Author it on first need, mapping section 7 onto
176
+ destructive-action warnings and confirmation copy.
@@ -18,7 +18,7 @@ The first `/skills/domains/` skill: how copy work runs through PMOS's **content
18
18
  — never the `no-initiative` hatch — but it iterates fast, so the lane contracts on a **brief**,
19
19
  and a rubric is *recommended, not required* (a required one recreates fake-rubric pressure).
20
20
 
21
- > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
21
+ > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
22
22
 
23
23
  ## When to use vs. not
24
24
 
@@ -14,7 +14,7 @@ self-report (`agent_runs.human_corrections`) — pre-commit conversational steer
14
14
  git-invisible and stays the self-report's lane; the **delta** between the two is the point
15
15
  (KR-B consumes it).
16
16
 
17
- > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
17
+ > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
18
18
  > Level 1 frontmatter above is the trigger; this Level 2 body is the full procedure.
19
19
 
20
20
  ## Non-negotiable stance
@@ -14,10 +14,10 @@ metadata:
14
14
 
15
15
  This skill produces a design brief instance for one initiative. It is **leg 1** of the
16
16
  [design loop](/okf/core/concepts/design-loop.md): the context handoff from Claude Code to
17
- claude.ai/design. The brief is to design what the [PRD](/skills/core/prd.skill) is to build — the shared
17
+ claude.ai/design. The brief is to design what the [PRD](/skills/prd.skill) is to build — the shared
18
18
  definition of *what to design* and the hard constraints, agreed before any design or build starts.
19
19
 
20
- > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
20
+ > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
21
21
  > Level 1 above is the trigger; this body is Level 2; rare variants go to Level 3 sub-files by name.
22
22
 
23
23
  ## When to use vs. not
@@ -36,11 +36,11 @@ definition of *what to design* and the hard constraints, agreed before any desig
36
36
  [design-reference grilling rubric](/planning/evals/design-reference-eval-rubric.md). Anything beyond
37
37
  what the PRD decided is still flagged back.
38
38
  - **Do not use** for the reconciliation gate — classifying a returned design against real capability is the
39
- [design-reconcile skill](/skills/core/design-reconcile.skill) (leg 3).
39
+ [design-reconcile skill](/skills/design-reconcile.skill) (leg 3).
40
40
 
41
41
  ## Procedure
42
42
 
43
- 0. **Grill before you brief** (the [prd skill](/skills/core/prd.skill)'s step-0 discipline, applied
43
+ 0. **Grill before you brief** (the [prd skill](/skills/prd.skill)'s step-0 discipline, applied
44
44
  to design intent): where the PM's aesthetic or structural intent is ambiguous, ask **one question
45
45
  at a time with a recommended answer**, stop at unambiguous — no cap; a batch questionnaire is not
46
46
  compliant. Look up what the environment answers (the capability ledger, the design system, the
@@ -19,7 +19,7 @@ realizes the reconciliation rule captured in the product's capability ledger (PM
19
19
  [watermelon-flag](/okf/core/concepts/watermelon-flag.md) defense applied to UI — it catches a design that
20
20
  *looks* functional but has no backend, before it becomes hollow, green-on-the-surface code.
21
21
 
22
- > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
22
+ > **Format note:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
23
23
  > Level 1 above is the trigger; this body is Level 2.
24
24
 
25
25
  ## Non-negotiable stance
@@ -19,7 +19,7 @@ and a timebox**, not requirements, and closes with a mandatory **disposition** i
19
19
  verdict. It resolves the stress-test finding that pre-certainty work either got blocked, got a
20
20
  fake rubric, or escaped the record entirely.
21
21
 
22
- > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)).
22
+ > **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)).
23
23
  > Level 1 above is the trigger; this body is Level 2.
24
24
 
25
25
  ## When to use vs. not
@@ -27,7 +27,7 @@ fake rubric, or escaped the record entirely.
27
27
  - **Use** when the deliverable is an answer: "is X feasible?", "which approach?", "what should the
28
28
  PRD even say?" — and you could not write honest done-criteria today.
29
29
  - **Do not use** when you *can* write done-criteria — that is a `feature` initiative
30
- ([prd skill](/skills/core/prd.skill)). A spike that is secretly a small feature corrupts the lane.
30
+ ([prd skill](/skills/prd.skill)). A spike that is secretly a small feature corrupts the lane.
31
31
  - **Do not use** for urgent production fixes — that is the `incident` lane.
32
32
  - A spike is still **anchored work** (D21): no anchor — a parent KR, or a declared health budget
33
33
  `health:<id>` (D59) — no spike.
@@ -40,7 +40,7 @@ fake rubric, or escaped the record entirely.
40
40
  - Tool form: `create_initiative({id, title, parent_kr, type: 'discovery'})`. The argument keeps
41
41
  its name. Read it as "record the equivalent in file-mode state" (AGENTS.md).
42
42
  1b. **Existing surface? Understand it first.** If answering the question honestly requires reading
43
- code that already exists, run an [explain-surface](/build-skills/explain-surface.skill) pass on
43
+ code that already exists, run an [explain-surface](/skills/explain-surface.skill) pass on
44
44
  that region — in a fresh context, **before** writing the brief. A spike aimed at a system the PM
45
45
  does not understand produces a learning they cannot act on. Greenfield → skip.
46
46
  2. **Write the spike brief** from
@@ -14,11 +14,11 @@ metadata:
14
14
 
15
15
  This skill produces an eval rubric instance for one initiative. In eval-driven PM the rubric **is the
16
16
  spec made measurable** ([eval-driven-pm](/okf/core/concepts/eval-driven-pm.md)): it is authored
17
- *before* the build, alongside the [PRD](/skills/core/prd.skill), and it defines how output will pass
17
+ *before* the build, alongside the [PRD](/skills/prd.skill), and it defines how output will pass
18
18
  through the [three-tier gate](/okf/core/concepts/output-eval.md).
19
19
 
20
20
  > **Format note:** three-level progressive disclosure
21
- > ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). Level 1 frontmatter above is the trigger and
21
+ > ([SKILL-FORMAT](/skills/SKILL-FORMAT.md)). Level 1 frontmatter above is the trigger and
22
22
  > carries only `name` + `description`. Note: the *rubric instances* this skill produces carry their
23
23
  > own frontmatter (including `eval_type`, below) — that is the rubric's frontmatter, not this skill
24
24
  > file's.
@@ -81,7 +81,7 @@ Before any work begins, the generator and evaluator **agree on done-criteria**
81
81
  contract stage of the [SDLC loop](/okf/core/concepts/sdlc-loop.md). A rubric is incomplete without
82
82
  one.
83
83
 
84
- **Reach the criteria by grilling, not assumption** (the [prd skill](/skills/core/prd.skill)'s step-0
84
+ **Reach the criteria by grilling, not assumption** (the [prd skill](/skills/prd.skill)'s step-0
85
85
  discipline applies here too): where the PM's intent is ambiguous, ask **one question at a time with a
86
86
  recommended answer**, stop at unambiguous — no cap, and a batch questionnaire is not compliant. If a
87
87
  fact can be found by exploring the environment, look it up rather than asking — the decisions are the
@@ -131,7 +131,7 @@ construction; no per-contract justification needed beyond naming the doc set.
131
131
 
132
132
  **Dimensions must be evidence-citable.** The Review Gate scores each dimension with a verbatim
133
133
  quote or precise pointer from the artifact as evidence (an unevidenced dimension is `unverified`,
134
- scored ≤ 0.5 — see [evaluator.skill](/build-skills/evaluator.skill)). Write every dimension as an
134
+ scored ≤ 0.5 — see [evaluator.skill](/skills/evaluator.skill)). Write every dimension as an
135
135
  **observable outcome a quote can prove** — "the dry-run verdict names its exemplars" — never an
136
136
  impression ("the verdict feels thorough"). If you cannot imagine the evidence quote for a
137
137
  dimension, rewrite the dimension