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.
- package/bin/create-pmos.js +15 -3
- package/package.json +1 -1
- package/payload/AGENTS.md +2 -0
- package/payload/KIT-VERSION +2 -2
- package/payload/okf/core/concepts/agent-harness.md +2 -2
- package/payload/okf/core/concepts/design-loop.md +5 -5
- package/payload/okf/core/concepts/eval-driven-pm.md +1 -1
- package/payload/okf/core/concepts/okr-anti-optimism.md +1 -1
- package/payload/okf/core/concepts/okr-tree.md +2 -2
- package/payload/okf/core/concepts/output-eval.md +2 -2
- package/payload/okf/core/concepts/sdlc-loop.md +1 -1
- package/payload/okf/core/concepts/self-refining-harness.md +3 -3
- package/payload/okf/core/templates/content-brief-template.md +1 -1
- package/payload/okf/core/templates/design-brief-template.md +1 -1
- package/payload/okf/core/templates/eval-rubric-template.md +1 -1
- package/payload/okf/core/templates/log.md +1 -1
- package/payload/okf/core/templates/prd-template.md +1 -1
- package/payload/okf/core/templates/spike-brief-template.md +1 -1
- package/payload/scripts/frontier.sh +6 -2
- package/payload/scripts/gate-initiative.sh +24 -3
- package/payload/scripts/metrics.py +20 -4
- package/payload/scripts/read-jsonl.js +53 -0
- package/payload/scripts/workflow-state.js +144 -35
- package/payload/scripts/workflow-sweep.js +39 -22
- package/payload/skills/SKILL-FORMAT.md +1 -1
- package/payload/skills/copywriting.skill +1 -1
- package/payload/skills/correction-signal-derive.skill +1 -1
- package/payload/skills/design-brief.skill +4 -4
- package/payload/skills/design-reconcile.skill +1 -1
- package/payload/skills/discovery.skill +3 -3
- package/payload/skills/eval-rubric.skill +4 -4
- package/payload/skills/evaluator.skill +1 -1
- package/payload/skills/explain-run.skill +1 -1
- package/payload/skills/explain-surface.skill +6 -6
- package/payload/skills/harness-refine.skill +1 -1
- package/payload/skills/ingest-repo.skill +6 -6
- package/payload/skills/okr.skill +2 -2
- package/payload/skills/pmos-router.skill +8 -8
- package/payload/skills/prd.skill +5 -5
- package/payload/skills/prototype-grill.skill +8 -8
- package/payload/skills/prototype.skill +7 -7
- package/payload/skills/skill-creator.skill +1 -1
- package/payload/skills/source-to-concept.skill +1 -1
- package/payload/skills/ste-term-map.md +69 -0
- package/payload/skills/strategic-brief.skill +4 -4
- package/payload/skills/technical-writing-ste.skill +176 -0
- package/payload/skills-native/copywriting/SKILL.md +1 -1
- package/payload/skills-native/correction-signal-derive/SKILL.md +1 -1
- package/payload/skills-native/design-brief/SKILL.md +4 -4
- package/payload/skills-native/design-reconcile/SKILL.md +1 -1
- package/payload/skills-native/discovery/SKILL.md +3 -3
- package/payload/skills-native/eval-rubric/SKILL.md +4 -4
- package/payload/skills-native/evaluator/SKILL.md +1 -1
- package/payload/skills-native/explain-run/SKILL.md +1 -1
- package/payload/skills-native/explain-surface/SKILL.md +6 -6
- package/payload/skills-native/harness-refine/SKILL.md +1 -1
- package/payload/skills-native/ingest-repo/SKILL.md +6 -6
- package/payload/skills-native/okr/SKILL.md +2 -2
- package/payload/skills-native/pmos-router/SKILL.md +8 -8
- package/payload/skills-native/prd/SKILL.md +5 -5
- package/payload/skills-native/prototype/SKILL.md +7 -7
- package/payload/skills-native/prototype-grill/SKILL.md +8 -8
- package/payload/skills-native/skill-creator/SKILL.md +1 -1
- package/payload/skills-native/source-to-concept/SKILL.md +1 -1
- package/payload/skills-native/strategic-brief/SKILL.md +4 -4
- package/payload/skills-native/technical-writing-ste/SKILL.md +178 -0
- package/workspace/bin/pmos.js +9 -3
- package/workspace/lib/engine/read-jsonl.js +53 -0
- package/workspace/lib/engine/workflow-state.js +144 -35
- package/workspace/lib/file-mode-parse.js +19 -4
- package/workspace/lib/tree-share.js +69 -1
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
- package/workspace/public/pm/board-read.js +38 -0
- package/workspace/public/pm/data.js +102 -1
- package/workspace/public/pm/modes.js +50 -28
- package/workspace/public/pm/panel-detail.js +2 -17
- package/workspace/public/pm/panel-initiatives.js +3 -20
- package/workspace/public/pm/panel-newsess.js +14 -1
- package/workspace/public/pm/panel-tabs.js +53 -14
- package/workspace/public/pm/tab-term.js +30 -2
- package/workspace/server.js +95 -70
- 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/
|
|
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/](/
|
|
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](/
|
|
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/
|
|
60
|
-
| A **new bet** — new product/capability/direction whose *whether* is unargued | **Offer the strategic brief** (recommended, skippable — D61) | [strategic-brief skill](/skills/
|
|
61
|
-
| A **validated direction or known feature** (incl. a promoted prototype) | **Feature lane** | `type: feature`; PRD + eval rubric ([prd](/skills/
|
|
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/
|
|
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/
|
|
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`),
|
package/payload/skills/prd.skill
CHANGED
|
@@ -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/
|
|
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/
|
|
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](/
|
|
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/
|
|
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/
|
|
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/
|
|
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`](/
|
|
18
|
-
first-class and [`explain-surface`](/
|
|
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/
|
|
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`](/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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](/
|
|
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/
|
|
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/
|
|
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`](/
|
|
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/](/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/](/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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/
|
|
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](/
|
|
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/
|
|
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/
|
|
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/
|
|
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](/
|
|
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
|