create-pmos 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/package.json +1 -1
- package/payload/KIT-VERSION +2 -2
- package/payload/okf/core/concepts/index.md +2 -2
- package/payload/okf/core/concepts/simplified-technical-english.md +74 -0
- package/payload/skills/SKILL-FORMAT.md +50 -155
- package/payload/skills/discovery.skill +5 -3
- package/payload/skills/harness-refine.skill +3 -2
- package/payload/skills/ingest-repo.skill +12 -11
- package/payload/skills-native/discovery/SKILL.md +5 -3
- package/payload/skills-native/harness-refine/SKILL.md +3 -2
- package/payload/skills-native/ingest-repo/SKILL.md +12 -11
- package/workspace/lib/tree-share.js +15 -1
- package/workspace/package-lock.json +2 -2
- package/workspace/package.json +1 -1
package/README.md
CHANGED
|
@@ -232,6 +232,25 @@ npx create-pmos@latest --update
|
|
|
232
232
|
|
|
233
233
|
Refreshes the skills, concepts, and scripts only. Your records — `state/`, `planning/`, `okf/product/` — are yours, and an update never touches them. `pmos/KIT-VERSION` always says exactly what you're running.
|
|
234
234
|
|
|
235
|
+
## What's new in 0.34.0
|
|
236
|
+
|
|
237
|
+
**A feature this README advertised for fifteen releases and never shipped.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
|
|
238
|
+
|
|
239
|
+
- **The session chooser now shows the agent's last words.** It has been listed under "What's new in 0.19.0" since that release and never rendered once. The chooser read `doing` off each session row; the rows carry `lastWords`, and the server mapped between the two only on the path the *pane* uses, not the path the *chooser* uses. So the line was always blank. If you are on 0.19.0 through 0.33.0, that one line was missing from the chooser and nothing else on that list was affected.
|
|
240
|
+
- **How it was found, and why that matters more than the fix.** An independent evaluation of the original run — commissioned because that run had been merged and published without ever passing a Review Gate — drove a real browser against the shipped code and measured the field. The test that was supposed to cover this passed the whole time: it handed the function a hand-written row with a literal `doing` key that no real row has, so it tested a passthrough rather than the feature. The new test uses the wire shape and asserts the key is absent, so a rename on the server cannot quietly re-break it while the suite stays green.
|
|
241
|
+
- **Known broken, and not fixed here: `end it` in the chooser.** In a freshly opened window with no terminal tab yet, the chooser is populated over HTTP while the terminal socket is still closed, so clicking `end it` **silently does nothing** — the button disarms as though it worked and the session keeps running. It has no test coverage anywhere. It is named here rather than left for you to discover. `open it` and `+ start another session here anyway` are unaffected.
|
|
242
|
+
|
|
243
|
+
## What's new in 0.33.0
|
|
244
|
+
|
|
245
|
+
**Three shipped documents stop telling you to do things that were never possible in your repo.** Run `npx create-pmos@latest --update`. No behaviour changes — this is a correctness release for the instructions the kit hands your agent.
|
|
246
|
+
|
|
247
|
+
- **`SKILL-FORMAT.md` no longer sends you after a seed you never had.** When you edited a `.skill`, it told you to "regenerate the seed in the same PR" and to grep an RLS test suite for pinned metadata. Those instructions described a hosted mirror table that only ever existed in PMOS's own backend — never in a vendored kit. That backend has now been removed entirely, and the section is rewritten to say what is actually true for you: **the frontmatter on disk is the only copy**, which is why the whole class of mirror-drift bug it warned about cannot reach you. The trade is stated rather than glossed: nothing validates your skill metadata, so a wrong registry key is simply wrong.
|
|
248
|
+
- **`ingest-repo` and `harness-refine` stop linking at reference docs your kit does not contain.** Both pointed at PMOS's hosted data-model and monitoring-view docs. `ingest-repo` now describes its write path as what it is in file mode — drafts into your own repo, approved in PR review — and `harness-refine` reads its evidence from `discoveries.md` and your run log instead of from SQL views.
|
|
249
|
+
|
|
250
|
+
**Why now.** PMOS removed its own hosted backend in this release's parent change, and these three files were the places where instructions written for that backend had leaked into what your kit ships. None of it was ever reachable from a kit install, so nothing was broken — it was wrong documentation, and it is now right.
|
|
251
|
+
|
|
252
|
+
**Unchanged:** the payload's skill set, the state layout, every gate, and the zero-network guarantee. Your records are untouched, as always.
|
|
253
|
+
|
|
235
254
|
## What's new in 0.32.0
|
|
236
255
|
|
|
237
256
|
**The PM's own accept button now writes through the guarded writer, instead of appending to the acceptance log directly.** Run `npx create-pmos@latest workspace`; the version bump means an existing install auto-upgrades.
|
|
@@ -352,8 +371,10 @@ Refreshes the skills, concepts, and scripts only. Your records — `state/`, `pl
|
|
|
352
371
|
- **Opening a long document no longer scrolls the whole window.** Scrolling a document in the right panel moved the entire interface — the top bar slid away, the status bar rose from below — while the panel's own scrollbar never engaged. Every panel now scrolls inside itself and the app frame never moves. (If you are curious: the shell's middle row was written `1fr`, which is `minmax(auto, 1fr)`, so a tall document enlarged the row rather than overflowing it. Every style involved read as correct, which is why it survived review.)
|
|
353
372
|
- **`+ session` now asks before it starts one, when the checkout is already busy.** It used to start the session and *then* tell you how many others were in there — a count arriving after the decision, naming something you cannot act on. Now you get a chooser first, listing every session in that checkout.
|
|
354
373
|
- **It says what each one is.** Its name, its agent, the same word the sidebar uses (`working` · `quiet 12m` · `needs you` · `maybe blocked`), the agent's own last words, and who holds the writer claim.
|
|
374
|
+
- **Correction (0.34.0):** the last-words line was advertised here from 0.19.0 and **never rendered** — the chooser read a field name the session rows do not carry, so it was always blank. Fixed in 0.34.0; if you are on any version from 0.19.0 to 0.33.0, that one line was missing and nothing else on this list was affected.
|
|
355
375
|
- **…and what ending it would cost, without over-claiming.** Only `needs you` reads as settled — its turn finished and it is waiting on you. `working` says output is arriving right now. `quiet` and `maybe blocked` say, in as many words, that the workspace *cannot tell* a finished turn from a permission prompt from a stuck tool. A confident "safe to end" that discarded a running turn would be worse than no reading at all.
|
|
356
376
|
- **You can take the running session instead of making another.** `open it` attaches a tab to it and starts nothing. `end it` is there too — the first click arms it and names what it will end, the second does it. `+ start another session here anyway` is always one click: being told is never being blocked, and no session is ever refused because another is there.
|
|
377
|
+
- **Correction (0.34.0):** `end it` does not work reliably and is being repaired. In a freshly opened window with no terminal tab yet, the chooser is populated over HTTP while the terminal socket is still closed, so the click **silently does nothing** — the button disarms as though it had worked and the session keeps running. If you use it, confirm in the sidebar that the session actually ended. `open it` and `start another anyway` are unaffected.
|
|
357
378
|
- **The same detail is written into the new session's scrollback**, so scrolling back tomorrow answers the same question the chooser did.
|
|
358
379
|
|
|
359
380
|
## What's new in 0.18.1
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-pmos",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"description": "Scaffold the PMOS portable kit — run the PMOS product-management workflow (initiative → lane-fit spec → contract → build → three gates, with work-type lanes for features, research, maintenance, incidents, and content) entirely inside your own repo, with all state as git-versioned files. Includes `workflow-sweep`, which audits the state every board derives from and separates real defects from work you simply have not done. `create-pmos workspace` also installs + launches the local Terminal Workspace GUI. No database, no network, no telemetry.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"bin": {
|
package/payload/KIT-VERSION
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
kernel-source: pmos@
|
|
2
|
-
assembled: 2026-08-
|
|
1
|
+
kernel-source: pmos@1313507
|
|
2
|
+
assembled: 2026-08-07
|
|
3
3
|
mode: vendor
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# core/concepts — Index
|
|
2
2
|
|
|
3
|
-
OKF reserved file (no frontmatter). Directory listing for progressive disclosure — read this
|
|
4
|
-
to pick concepts, then fetch the file(s) you need.
|
|
3
|
+
OKF reserved file (no frontmatter). Directory listing for progressive disclosure — read this to pick concepts, then fetch the file(s) you need.
|
|
5
4
|
|
|
6
5
|
- [agent-harness](agent-harness.md) — Everything wrapping the model that lets it finish work — and the Summary Gate, the input gate that compresses prior-session context into essential state.
|
|
7
6
|
- [control-plane](control-plane.md) — What it means for PMOS to be a control plane — it orchestrates, specs, evaluates, and routes agent work rather than generating production code itself.
|
|
@@ -18,4 +17,5 @@ to pick concepts, then fetch the file(s) you need.
|
|
|
18
17
|
- [product-slug-convention](product-slug-convention.md) — The rules for product_slug — the stable lowercase identifier that scopes products across OKF namespaces, planning artifacts, and agent records.
|
|
19
18
|
- [sdlc-loop](sdlc-loop.md) — The closed agent-driven software development lifecycle PMOS orchestrates — spec, contract, build, evaluate, accept, learn — and how it loops.
|
|
20
19
|
- [self-refining-harness](self-refining-harness.md) — The pattern where the harness improves from its own run evidence (evals, friction, calibration) via a detect → draft → PM-gate loop, bounded at the L3 ceiling — never L4 self-mutation.
|
|
20
|
+
- [simplified-technical-english](simplified-technical-english.md) — ASD-STE100: the controlled-language standard (53 rules / 9 sections + a ~900-word one-meaning dictionary), what it deliberately does not cover, and why its register boundary matters to any house adoption.
|
|
21
21
|
- [watermelon-flag](watermelon-flag.md) — A status that reads green on automated metrics but is red underneath on strategic alignment — and silent drift, the L4 failure mode it signals.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: Concept
|
|
3
|
+
title: "ASD-STE100 Simplified Technical English"
|
|
4
|
+
description: The controlled-language standard for technical documentation — 53 writing rules in 9 sections plus a ~900-word controlled dictionary, owned by ASD. What it is, what it constrains, what it deliberately does not cover, and why its scope boundary matters to anyone adopting it as a house standard.
|
|
5
|
+
tags: [writing, controlled-language, technical-writing, standards, ste, documentation]
|
|
6
|
+
timestamp: 2026-07-30
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# ASD-STE100 Simplified Technical English
|
|
10
|
+
|
|
11
|
+
**Situating context:** Extracted from the free official Issue 9 specification (2025-01-15) and the STEMG's own FAQ during the [ste-house-standard-spike](/planning/prd/ste-house-standard-spike.md) discovery spike, which asked whether STE should become the standard for PMOS output. This concept holds the durable half — what the standard *is*. The PMOS-specific adoption question, its scope boundary, and the enforcement design live in the spike brief, not here.
|
|
12
|
+
|
|
13
|
+
## What it is
|
|
14
|
+
|
|
15
|
+
**ASD-STE100 Simplified Technical English (STE)** is a *controlled natural language*: a restricted subset of English defined by an explicit rule set and an explicit approved vocabulary. It exists to make technical documentation unambiguous on first read — originally for aircraft maintenance manuals read by mechanics whose first language is not English.
|
|
16
|
+
|
|
17
|
+
It has exactly two parts:
|
|
18
|
+
|
|
19
|
+
| Part | Content | Size (Issue 9) |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| **Part 1 — Writing rules** | 53 numbered rules in 9 sections, plus 8 general recommendations (GR-1…GR-8) | 53 rules / 9 sections |
|
|
22
|
+
| **Part 2 — Dictionary** | Approved words, each with **one meaning and one part of speech**, plus unapproved words with their approved replacements | ≈900 approved words |
|
|
23
|
+
|
|
24
|
+
The dictionary is the expensive half and the reason STE is a *controlled* language rather than a style guide: `test` is approved as a noun only, `oil` as a noun only, and a writer who wants the verb must use the approved one. Words outside the dictionary are legal only as **technical nouns** or **technical verbs** — domain terms admitted under rules 1.5–1.13, which is how STE stays usable in a field it has never seen.
|
|
25
|
+
|
|
26
|
+
## The nine sections
|
|
27
|
+
|
|
28
|
+
Rule statements below are **paraphrased**, with rule numbers as pointers into the specification. The document is ASD copyright and is not reproduced here (see *Licensing* below).
|
|
29
|
+
|
|
30
|
+
1. **Words (1.1–1.14).** Use only approved words, each as its listed part of speech and listed meaning, in its approved verb/adjective forms (1.1–1.4). Domain terms enter as technical nouns (1.5–1.11) or technical verbs (1.12–1.13): keep them short, never use a technical noun as a verb or a technical verb as a noun, never two names for one thing, no slang/regional/jargon terms. American English spelling unless a directive says otherwise (1.14).
|
|
31
|
+
2. **Multi-word nouns (2.1–2.2).** At most three words in a noun cluster; a longer term is written in full once and then shortened or hyphenated.
|
|
32
|
+
3. **Verbs (3.1–3.7).** Only the dictionary's verb forms (3.1), and only infinitive, imperative, simple present, simple past, simple future, and past participle-as-adjective (3.2–3.3). No auxiliary stacks / complex constructions (3.4). `-ing` only inside a technical noun (3.5). **Active voice** — passive only in descriptive text when the agent is genuinely unknown (3.6). Describe an action with an approved verb, not a nominalization (3.7).
|
|
33
|
+
4. **Sentences (4.1–4.5).** Short and clear (4.1). Never drop words or use contractions to shorten (4.2). Vertical lists for complex material (4.3). Explicit connecting words between related sentences (4.4). Keep articles and demonstratives in front of nouns (4.5).
|
|
34
|
+
5. **Procedural writing (5.1–5.5).** **Maximum 20 words per sentence** (5.1). One instruction per sentence unless the actions are simultaneous (5.2). Imperative form (5.3). A precondition is stated first, then comma, then the command (5.4). Notes inform; they never instruct (5.5).
|
|
35
|
+
6. **Descriptive writing (6.1–6.6).** Information gradually (6.1); key words/phrases carry the structure (6.2); **maximum 25 words per sentence** (6.3); paragraphs group related information (6.4), **one topic each** (6.5), **at most six sentences each** (6.6). The imperative is not permitted here — description is not instruction.
|
|
36
|
+
7. **Safety instructions (7.1–7.3).** Name the risk level with the applicable word ("warning", "caution") (7.1); open with a clear command or condition (7.2); explain the risk or the consequence (7.3).
|
|
37
|
+
8. **Punctuation and word count (8.1–8.7).** All standard punctuation **except the semicolon** (8.1); hyphens join directly-related words (8.2); parentheses for references, identifiers, work steps, abbreviations (8.3). Then the counting rules that make the length limits decidable: in a vertical list a colon ends a sentence (8.4); a parenthetical counts as one word (8.5); numbers, numbers-with-units, abbreviations, alphanumeric identifiers and proper nouns count as one word each (8.6); a hyphenated word counts as one (8.7).
|
|
38
|
+
9. **Writing practices (9.1–9.4) + GR-1…GR-8.** Restructure the sentence when word-for-word replacement fails (9.1); use approved words correctly (9.2); no invented phrasal verbs (9.3); consistent terminology and style (9.4). The general recommendations cover the conjunction "that", the preposition "with", pronoun use and antecedents (GR-3/GR-4), false friends, Latin abbreviations, and — new in Issue 9 — **inclusive language** (GR-7) and possessive form (GR-8).
|
|
39
|
+
|
|
40
|
+
## What STE deliberately does not do
|
|
41
|
+
|
|
42
|
+
The specification's own FAQ is unusually explicit about its boundaries, and this is the part most adopters miss:
|
|
43
|
+
|
|
44
|
+
- **It does not regulate formatting** — typeface, numbering, lettering belong to a publications specification or style guide.
|
|
45
|
+
- **It does not regulate abbreviations or units of measurement** — projects decide.
|
|
46
|
+
- **It cannot be used alone.** In the FAQ's words: *"No. It is intended to be used with other applicable specifications for technical publications, style guides, and official directives. A high standard of professionalism is necessary to use STE correctly."*
|
|
47
|
+
- **It is not general-purpose English.** STE targets maintenance and technical documentation. The STEMG's position is that STE's *principles* — short sentences, one topic per sentence, active voice — transfer to other writing; the full rule set and dictionary do not.
|
|
48
|
+
- **No tool can certify compliance.** Checkers flag violations; they cannot convert non-STE text into STE, and the writer remains accountable.
|
|
49
|
+
|
|
50
|
+
## The one-meaning trade
|
|
51
|
+
|
|
52
|
+
STE's power and its cost are the same mechanism. Because every approved word has one meaning, ambiguity collapses — and so does nuance. The dictionary's recurring-errors list replaces `should` and `may` with `MUST`, and `shall` with `MUST`; `CAN`, `CANNOT`, `WILL` and `MUST` are approved, while `may`, `might`, `should` and `would` are not. That is correct for a maintenance manual, where a hedged instruction is a defect. It is destructive for text whose payload *is* graded confidence — a recommendation, an estimate, a risk statement — because STE's replacement converts a recommendation into an obligation and a possibility into a certainty. Adopting STE for such text does not make it clearer; it makes it more certain than the author was.
|
|
53
|
+
|
|
54
|
+
This is the boundary any adoption must draw explicitly. It is also why STE splits **procedural** (section 5) from **descriptive** (section 6) writing and gives them different rules: it already recognizes that one register's rule is another register's error. Argumentative text — a decision record, a strategy memo, an evaluation verdict — is a third register the standard never addressed.
|
|
55
|
+
|
|
56
|
+
## History, status, licensing
|
|
57
|
+
|
|
58
|
+
- Originated 1986 as the *AECMA Simplified English Guide*, requested by the European airline industry for aircraft maintenance documentation; the name honors the ATA100 publications specification.
|
|
59
|
+
- Maintained by the **Simplified Technical English Maintenance Group (STEMG)**, a working group of **ASD** (Aerospace, Security and Defence Industries Association of Europe), formed 1983.
|
|
60
|
+
- **Issue 9, 2025-01-15** is current. Free of charge to anyone on request since Issue 6 (2013).
|
|
61
|
+
- **Copyright is fully owned by ASD.** The document states that no reproduction or publication in whole or in part may be made without ASD's written authority; irrevocable free reproduction rights are granted only to named categories (ASD/AIA/AIAC/ICCAIA members and their customers, member-state Ministries of Defense, and similar). **Practical consequence:** an adopter outside those categories may apply and cite STE freely, but must not vendor the rule text or the dictionary into its own repository — reference it by rule number and link to the source.
|
|
62
|
+
- Adoption has spread well beyond aerospace (machinery, automotive, electronics, medical, IT, and language services). Most non-aerospace organizations adopt the writing rules and skip the controlled dictionary, which is a partial adoption, not compliance.
|
|
63
|
+
|
|
64
|
+
## Known limitations
|
|
65
|
+
|
|
66
|
+
- **Correct application is hard.** It demands strong English *and* domain knowledge; research on STE adoption consistently finds writers apply it incorrectly without training.
|
|
67
|
+
- **It is often misused as a substitute for a style guide** rather than a layer on top of one — the failure mode the FAQ answer above exists to prevent.
|
|
68
|
+
- **A clean check is not a correct document.** STE-compliant prose that is factually wrong reads *more* authoritative than the sloppy version — a controlled language raises the confidence a reader places in the text without touching its truth.
|
|
69
|
+
|
|
70
|
+
## Related
|
|
71
|
+
|
|
72
|
+
- [output-eval](/okf/core/concepts/output-eval.md) — the three-tier gate any writing standard is graded through; a clean lint is a Quality-tier signal, never an Acceptance-tier one.
|
|
73
|
+
- [okr-anti-optimism](/okf/core/concepts/okr-anti-optimism.md) — the reporting stance that STE's modal replacements would flatten; the reason the register boundary above is load-bearing in PMOS.
|
|
74
|
+
- Sources: [asd-ste100.org](https://www.asd-ste100.org/) (specification + FAQ, free on request), [ASD](https://www.asd-europe.org/standards-specifications/simplified-technical-english/).
|
|
@@ -6,23 +6,17 @@ timestamp: 2026-07-23
|
|
|
6
6
|
|
|
7
7
|
# SKILL-FORMAT.md — Required Format for PMOS Skills
|
|
8
8
|
|
|
9
|
-
This document defines the **required** structure for every `.skill` file in PMOS. It is the
|
|
10
|
-
authority that all seed skills (`prd`, `eval-rubric`, `okr`, `strategic-brief`, `source-to-concept`)
|
|
11
|
-
and every future skill must conform to.
|
|
9
|
+
This document defines the **required** structure for every `.skill` file in PMOS. It is the authority that all seed skills (`prd`, `eval-rubric`, `okr`, `strategic-brief`, `source-to-concept`) and every future skill must conform to.
|
|
12
10
|
|
|
13
11
|
## Why a fixed format
|
|
14
12
|
|
|
15
|
-
Skills are how PMOS gives an agent procedural competence on demand without flooding its context.
|
|
16
|
-
The format exists to make that economical: cheap to keep many skills available, expensive to load
|
|
17
|
-
only the one in use. The mechanism is **three-level progressive disclosure**.
|
|
13
|
+
Skills are how PMOS gives an agent procedural competence on demand without flooding its context. The format exists to make that economical: cheap to keep many skills available, expensive to load only the one in use. The mechanism is **three-level progressive disclosure**.
|
|
18
14
|
|
|
19
15
|
## The three levels
|
|
20
16
|
|
|
21
17
|
### Level 1 — Frontmatter (always loaded)
|
|
22
18
|
|
|
23
|
-
YAML frontmatter containing **only `name` and `description`**. This is pre-loaded for **all** skills
|
|
24
|
-
at agent startup, so it must stay small — it is the *trigger signal* the agent uses to decide
|
|
25
|
-
whether the skill is relevant.
|
|
19
|
+
YAML frontmatter containing **only `name` and `description`**. This is pre-loaded for **all** skills at agent startup, so it must stay small — it is the *trigger signal* the agent uses to decide whether the skill is relevant.
|
|
26
20
|
|
|
27
21
|
```yaml
|
|
28
22
|
---
|
|
@@ -32,189 +26,96 @@ description: Write a Product Requirements Document for an initiative. Use when a
|
|
|
32
26
|
```
|
|
33
27
|
|
|
34
28
|
Rules:
|
|
29
|
+
|
|
35
30
|
- `name` — lowercase, matches the filename stem (`prd` → `prd.skill`). **Required.**
|
|
36
|
-
- `description` — one or two sentences. State **what** the skill does and **when** to use it.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- `
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
conformant (e.g. `build-skills/evaluator.skill`); carry the registry keys on durable `skills/core/`
|
|
48
|
-
entries for consistency with their siblings.
|
|
49
|
-
- `lifecycle` — **optional**, in the same D49 registry slot. Values: `active` (the default when the
|
|
50
|
-
key is absent) | `deprecated`. A deprecated skill **stays on disk and stays in the registry** —
|
|
51
|
-
`get_skill` returns it in full with a `deprecated_notice` so a retrieving agent is *told* not to
|
|
52
|
-
start new work on it. Retirement is a state you can read; deletion is a separate act (see the
|
|
53
|
-
invariant below). Distinct from `maturity_mode`, which is about a skill not yet executable —
|
|
54
|
-
`lifecycle` is about one on its way out.
|
|
55
|
-
- **No other L1 keys.** Beyond the required `name` + `description`, the optional `maturity_mode`, and the
|
|
56
|
-
optional Phase-B registry keys above, procedural detail does not belong in L1 — it lives in the body.
|
|
57
|
-
|
|
58
|
-
### The disk ⇄ registry invariant (enforced in CI)
|
|
59
|
-
|
|
60
|
-
**Every `.skill` on disk is seeded, and every seeded skill exists on disk — exactly.** The `skills`
|
|
61
|
-
table is a *mirror*, and `get_skill` serves it to agents in other people's repos, so a mirror that
|
|
62
|
-
has quietly drifted is a wrong answer delivered confidently.
|
|
63
|
-
|
|
64
|
-
The `REGISTRY` check in [`check_okf_drift.py`](/supabase/check_okf_drift.py) fails the build on:
|
|
65
|
-
adding or renaming a `.skill` without regenerating the seed; a seeded skill whose file is gone; and
|
|
66
|
-
any registry-metadata value that disagrees with the file's own frontmatter. That last one is not
|
|
67
|
-
theoretical — a generator whose INSERT omitted the Phase-B columns silently nulled
|
|
68
|
-
`version/owner/risk/category/scope` for **all 21 skills for about three weeks** in 2026-07, and was
|
|
69
|
-
caught only by an incidental version pin in an RLS test. So:
|
|
70
|
-
|
|
71
|
-
> **When you add, rename, delete, or edit the frontmatter of a `.skill`, regenerate the seed in the
|
|
72
|
-
> same PR** ([okf-sync playbook](/okf/core/playbooks/okf-sync.md)) — and sweep `supabase/tests/` for
|
|
73
|
-
> pins on that skill's registry metadata before you do (the prd-grilling F1 rule).
|
|
31
|
+
- `description` — one or two sentences. State **what** the skill does and **when** to use it. This is the only text the agent sees for an unloaded skill, so the "when" is what makes it fire. **Required.**
|
|
32
|
+
- `maturity_mode` — **optional**. Present **only** on skills that are not yet active (e.g. `bootstrap`); omit it entirely on active skills. It lives at L1 because "is this skill executable yet?" is an execution-gating signal a loader/CI must be able to read without parsing the body. Values: `bootstrap` (specified, non-executable) → graduates to active (key removed) by a PM decision in `DECISIONS.md`.
|
|
33
|
+
- **Optional Phase-B registry metadata (D49)** — a skill may also carry `version`, `owner`, `risk`, `category`, and `scope`. These are **optional**, producer-defined registry fields that the workspace's skill library reads to group/version/scope skills. They used to be sourced into a hosted `skills` table by a resync generator; [D66](/DECISIONS.md) removed that mirror along with the backend, so the frontmatter on disk is now the only registry there is. A skill with only `name` + `description` is still fully conformant (e.g. `build-skills/evaluator.skill`); carry the registry keys on durable `skills/core/` entries for consistency with their siblings.
|
|
34
|
+
- `lifecycle` — **optional**, in the same D49 registry slot. Values: `active` (the default when the key is absent) | `deprecated`. A deprecated skill **stays on disk** — a reader gets it in full and is *told* not to start new work on it. Retirement is a state you can read; deletion is a separate act (see the invariant below). Distinct from `maturity_mode`, which is about a skill not yet executable — `lifecycle` is about one on its way out.
|
|
35
|
+
- **No other L1 keys.** Beyond the required `name` + `description`, the optional `maturity_mode`, and the optional Phase-B registry keys above, procedural detail does not belong in L1 — it lives in the body.
|
|
36
|
+
|
|
37
|
+
### The disk ⇄ registry invariant — retired with the mirror (D66)
|
|
38
|
+
|
|
39
|
+
There used to be a second copy of every skill: a hosted `skills` table that `get_skill` served to agents in other people's repos. A `REGISTRY` check in the drift gate held the two in sync, because a mirror that has quietly drifted is a wrong answer delivered confidently — and it was not theoretical. A generator whose INSERT omitted the Phase-B columns silently nulled `version/owner/risk/category/scope` for **all 21 skills for about three weeks** in 2026-07, caught only by an incidental version pin in an RLS test.
|
|
40
|
+
|
|
41
|
+
[D66](/DECISIONS.md) deleted the mirror, the generator and that check together with the hosted backend. **The file on disk is now the only copy**, which is why the class of bug above cannot recur: there is nothing left to disagree with. The cost is that skill metadata is no longer validated by CI at all — if a registry key is wrong in the frontmatter, it is simply wrong. Read the frontmatter as authoritative and keep it accurate by hand.
|
|
74
42
|
|
|
75
43
|
### Level 2 — SKILL.md body (loaded when relevant)
|
|
76
44
|
|
|
77
|
-
The body below the frontmatter holds the **full procedural detail**: steps, heuristics, required
|
|
78
|
-
fields, gate criteria, examples. The agent reads this only after Level 1 has signalled relevance.
|
|
45
|
+
The body below the frontmatter holds the **full procedural detail**: steps, heuristics, required fields, gate criteria, examples. The agent reads this only after Level 1 has signalled relevance.
|
|
79
46
|
|
|
80
|
-
This is where the actual "how to do the task" lives. Write it at optimal altitude — concrete
|
|
81
|
-
heuristics that guide judgment, not a brittle decision tree and not a vague mandate.
|
|
47
|
+
This is where the actual "how to do the task" lives. Write it at optimal altitude — concrete heuristics that guide judgment, not a brittle decision tree and not a vague mandate.
|
|
82
48
|
|
|
83
49
|
### Level 3 — Linked sub-files (loaded on demand)
|
|
84
50
|
|
|
85
|
-
Rare sub-cases, long reference tables, or edge-case procedures live in **separate files**,
|
|
86
|
-
referenced **by filename** from the Level 2 body. The agent reads them only when the body points it
|
|
87
|
-
there for the specific case in hand.
|
|
51
|
+
Rare sub-cases, long reference tables, or edge-case procedures live in **separate files**, referenced **by filename** from the Level 2 body. The agent reads them only when the body points it there for the specific case in hand.
|
|
88
52
|
|
|
89
53
|
Example reference from a body: *"For multi-product PRDs, follow `prd-multiproduct.md`."*
|
|
90
54
|
|
|
91
|
-
Use Level 3 to keep Level 2 focused. If a section applies to <20% of runs, it is a Level 3
|
|
92
|
-
candidate.
|
|
55
|
+
Use Level 3 to keep Level 2 focused. If a section applies to <20% of runs, it is a Level 3 candidate.
|
|
93
56
|
|
|
94
57
|
## Quality — what makes a skill good (not just well-formed)
|
|
95
58
|
|
|
96
|
-
The three levels are *structure*. This section is the *bar*. A skill can be perfectly structured and
|
|
97
|
-
still be junk; these are the tests that keep it worth its context.
|
|
59
|
+
The three levels are *structure*. This section is the *bar*. A skill can be perfectly structured and still be junk; these are the tests that keep it worth its context.
|
|
98
60
|
|
|
99
61
|
### Predictability is the root virtue
|
|
100
62
|
|
|
101
|
-
A skill exists to **wring determinism out of a stochastic system**: it makes the agent take the same
|
|
102
|
-
*process* every run — not produce the same *output* (an evaluator should predictably *judge*; its
|
|
103
|
-
words vary, its behavior doesn't). Every rule below serves predictability; cost and readability are
|
|
104
|
-
symptoms of it, not rival goals. When unsure whether a line belongs, ask: *does it make the agent's
|
|
105
|
-
process more repeatable?* If not, cut it.
|
|
63
|
+
A skill exists to **wring determinism out of a stochastic system**: it makes the agent take the same *process* every run — not produce the same *output* (an evaluator should predictably *judge*; its words vary, its behavior doesn't). Every rule below serves predictability; cost and readability are symptoms of it, not rival goals. When unsure whether a line belongs, ask: *does it make the agent's process more repeatable?* If not, cut it.
|
|
106
64
|
|
|
107
65
|
### Per-step completion criteria
|
|
108
66
|
|
|
109
|
-
Every procedural step ends on a **checkable done-condition** — the agent must be able to tell done
|
|
110
|
-
from not-done. Where it matters, make the criterion **exhaustive**, not vague: *"every living mirror
|
|
111
|
-
of the rule accounted for"*, not *"produce a change list"*. A fuzzy criterion invites **premature
|
|
112
|
-
completion** — the agent stops when it feels done, not when it is. The
|
|
113
|
-
[semantic-pass rule](/build-skills/evaluator.skill) ("enumerate the live-doc set, then read each for
|
|
114
|
-
meaning — a grep is evidence, never done") is the exemplar this generalizes: it exists because a
|
|
115
|
-
vague "sweep it" criterion let real stale mirrors survive five "clean" passes.
|
|
67
|
+
Every procedural step ends on a **checkable done-condition** — the agent must be able to tell done from not-done. Where it matters, make the criterion **exhaustive**, not vague: *"every living mirror of the rule accounted for"*, not *"produce a change list"*. A fuzzy criterion invites **premature completion** — the agent stops when it feels done, not when it is. The [semantic-pass rule](/build-skills/evaluator.skill) ("enumerate the live-doc set, then read each for meaning — a grep is evidence, never done") is the exemplar this generalizes: it exists because a vague "sweep it" criterion let real stale mirrors survive five "clean" passes.
|
|
116
68
|
|
|
117
69
|
### Pruning — hunt these named failure modes
|
|
118
70
|
|
|
119
71
|
A skill without a pruning discipline only ever grows. Hunt, sentence by sentence:
|
|
120
72
|
|
|
121
|
-
- **No-op** — a line the model already obeys by default, so you pay context to say nothing. Test:
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
- **
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
- **Duplication** — the same meaning in more than one place. Costs tokens and maintenance, and
|
|
129
|
-
inflates a meaning's apparent importance. Keep one source of truth.
|
|
130
|
-
- **Negation** — steering by prohibition backfires: *"don't think of an elephant"* names the
|
|
131
|
-
elephant. State the **positive** target behavior; keep a prohibition only as a hard guardrail you
|
|
132
|
-
can't phrase positively, and pair it with what to do instead.
|
|
133
|
-
|
|
134
|
-
**This is the checklist the quarterly harness-assumption review runs** (DECISIONS.md cadence): the
|
|
135
|
-
review's question — *what scaffolding can be removed because the model now handles it natively?* — is
|
|
136
|
-
the no-op and sediment hunt applied across every skill.
|
|
73
|
+
- **No-op** — a line the model already obeys by default, so you pay context to say nothing. Test: does it change behavior vs. the default? *"Be thorough"* to an already-thorough agent is a no-op; the fix is a stronger word (a leading word), not more words.
|
|
74
|
+
- **Sediment** — stale layers that settle because adding feels safe and removing feels risky. The default fate of any skill without this discipline.
|
|
75
|
+
- **Sprawl** — simply too long, even when every line is live. Cure: disclose reference to Level 3; split by branch.
|
|
76
|
+
- **Duplication** — the same meaning in more than one place. Costs tokens and maintenance, and inflates a meaning's apparent importance. Keep one source of truth.
|
|
77
|
+
- **Negation** — steering by prohibition backfires: *"don't think of an elephant"* names the elephant. State the **positive** target behavior; keep a prohibition only as a hard guardrail you can't phrase positively, and pair it with what to do instead.
|
|
78
|
+
|
|
79
|
+
**This is the checklist the quarterly harness-assumption review runs** (DECISIONS.md cadence): the review's question — *what scaffolding can be removed because the model now handles it natively?* — is the no-op and sediment hunt applied across every skill.
|
|
137
80
|
|
|
138
81
|
### Leading words
|
|
139
82
|
|
|
140
|
-
A **leading word** is a compact concept already in the model's pretraining that anchors a whole
|
|
141
|
-
region of behavior in one token — *tight* (loop), *watermelon*, *default-to-refute*, *silent drift*,
|
|
142
|
-
*Summary Gate*. Repeated across a skill, it accumulates a distributed definition and recruits priors
|
|
143
|
-
the model already holds. A triad spelled out at three sites (*"fast, deterministic, low-overhead"*)
|
|
144
|
-
is begging to **collapse** into one word (*tight*). You win twice: fewer tokens, and a sharper hook
|
|
145
|
-
the agent hangs its behavior on. Hunt every skill for restatements a leading word retires.
|
|
83
|
+
A **leading word** is a compact concept already in the model's pretraining that anchors a whole region of behavior in one token — *tight* (loop), *watermelon*, *default-to-refute*, *silent drift*, *Summary Gate*. Repeated across a skill, it accumulates a distributed definition and recruits priors the model already holds. A triad spelled out at three sites (*"fast, deterministic, low-overhead"*) is begging to **collapse** into one word (*tight*). You win twice: fewer tokens, and a sharper hook the agent hangs its behavior on. Hunt every skill for restatements a leading word retires.
|
|
146
84
|
|
|
147
85
|
### Invocation (advisory)
|
|
148
86
|
|
|
149
|
-
The Agent-Skills world splits skills by *who can invoke them* — **model-invoked** (description always
|
|
150
|
-
loaded, agent can auto-fire it, pays permanent context load) vs **user-invoked** (invisible to the
|
|
151
|
-
agent, human-only, zero context load). PMOS's model differs — skills are **retrieved on demand**
|
|
152
|
-
(see the retrieval rationale under *Ecosystem compatibility* below), so Level-1 frontmatter is the
|
|
153
|
-
always-available trigger and there is no auto-fire to gate. Treat the axis as an authoring lens —
|
|
154
|
-
*is this skill's description earning its keep as an always-available trigger?* — **not** a required
|
|
155
|
-
field. (A formal `invocation:` key is a deferred registry question, not part of this format.)
|
|
87
|
+
The Agent-Skills world splits skills by *who can invoke them* — **model-invoked** (description always loaded, agent can auto-fire it, pays permanent context load) vs **user-invoked** (invisible to the agent, human-only, zero context load). PMOS's model differs — skills are **retrieved on demand** (see the retrieval rationale under *Ecosystem compatibility* below), so Level-1 frontmatter is the always-available trigger and there is no auto-fire to gate. Treat the axis as an authoring lens — *is this skill's description earning its keep as an always-available trigger?* — **not** a required field. (A formal `invocation:` key is a deferred registry question, not part of this format.)
|
|
156
88
|
|
|
157
89
|
## Ecosystem compatibility — the Agent Skills standard
|
|
158
90
|
|
|
159
|
-
The open **Agent Skills standard** (Claude Code, Codex, and other harnesses) packages a skill as a
|
|
160
|
-
**directory** `<skill-name>/SKILL.md` with YAML frontmatter (`name`, `description`, optionally
|
|
161
|
-
`license`, `allowed-tools`) plus bundled sub-files. It **validates PMOS's three-level disclosure** —
|
|
162
|
-
same frontmatter-as-trigger, body-as-procedure, sub-files-on-demand shape.
|
|
91
|
+
The open **Agent Skills standard** (Claude Code, Codex, and other harnesses) packages a skill as a **directory** `<skill-name>/SKILL.md` with YAML frontmatter (`name`, `description`, optionally `license`, `allowed-tools`) plus bundled sub-files. It **validates PMOS's three-level disclosure** — same frontmatter-as-trigger, body-as-procedure, sub-files-on-demand shape.
|
|
163
92
|
|
|
164
|
-
PMOS **diverges** deliberately: skills are flat `<name>.skill` files, **not** `<name>/SKILL.md`
|
|
165
|
-
directories. The rationale is PMOS's retrieval model — skills are fetched on demand via `get_skill`
|
|
166
|
-
or referenced from AGENTS.md, **not** auto-discovered by a harness scanning for `SKILL.md`, so the
|
|
167
|
-
directory ceremony buys nothing here. The **mapping is lossless**, which is what keeps the divergence
|
|
168
|
-
cheap:
|
|
93
|
+
PMOS **diverges** deliberately: skills are flat `<name>.skill` files, **not** `<name>/SKILL.md` directories. The rationale is PMOS's retrieval model — skills are fetched on demand via `get_skill` or referenced from AGENTS.md, **not** auto-discovered by a harness scanning for `SKILL.md`, so the directory ceremony buys nothing here. The **mapping is lossless**, which is what keeps the divergence cheap:
|
|
169
94
|
|
|
170
95
|
- a `<name>.skill` file **≅** a standard `SKILL.md` body;
|
|
171
96
|
- PMOS's required `name` + `description` frontmatter is **already** the standard's required pair;
|
|
172
97
|
- Level-3 sub-files **≅** the standard's bundled files.
|
|
173
98
|
|
|
174
|
-
(One nuance for the follow-on below: PMOS's *optional* D49 registry keys —
|
|
175
|
-
`version`/`owner`/`risk`/`category`/`scope`/`lifecycle` — are top-level custom keys; the standard would expect
|
|
176
|
-
producer-defined extensions under a `metadata:` map. The **core** shape is lossless; relocating the
|
|
177
|
-
registry keys belongs to the native-format packaging follow-on, not this flat form.)
|
|
99
|
+
(One nuance for the follow-on below: PMOS's *optional* D49 registry keys — `version`/`owner`/`risk`/`category`/`scope`/`lifecycle` — are top-level custom keys; the standard would expect producer-defined extensions under a `metadata:` map. The **core** shape is lossless; relocating the registry keys belongs to the native-format packaging follow-on, not this flat form.)
|
|
178
100
|
|
|
179
101
|
### Kit native-format packaging (E6 — shipped)
|
|
180
102
|
|
|
181
|
-
The **kit** now ships every skill in native Agent-Skills directory form *as well as* the flat file —
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
- PMOS's D49 registry keys (`version`/`owner`/`risk`/`category`/`scope`/`lifecycle`) are relocated
|
|
189
|
-
**under a `metadata:` map with a `pmos-` prefix** — the standard's producer-extension slot — never
|
|
190
|
-
as top-level custom keys, so a conformant runtime ignores them cleanly;
|
|
191
|
-
- a **fail-closed conformance self-check** in `build-kit.sh` aborts the build on any violation
|
|
192
|
-
(name≠dirname, missing required field, or a top-level custom key), the same posture as the
|
|
193
|
-
containment check.
|
|
194
|
-
|
|
195
|
-
The flat `.skill` files remain the file-mode source of truth (the AGENTS.md state adapter references
|
|
196
|
-
`pmos/skills/<name>.skill`); the native tree is the ecosystem-portable mirror. **Still a named
|
|
197
|
-
follow-on (not built here):** wiring `create-pmos` to install the native tree into a runtime's
|
|
198
|
-
auto-discovery locations (`.claude/skills/`, `.agents/skills/`). E6 delivers the conformant
|
|
199
|
-
*packaging*; the *install location* is a separate change, revisited when native-discovery demand in
|
|
200
|
-
kit repos is proven.
|
|
103
|
+
The **kit** now ships every skill in native Agent-Skills directory form *as well as* the flat file — a lossless portability layer, generated **from** the flat `.skill` at build time (never hand-authored, so it cannot drift from its source). For each shipped skill, `kit/build-kit.sh` emits `skills-native/<name>/SKILL.md` where:
|
|
104
|
+
|
|
105
|
+
- the directory name **equals** the frontmatter `name` (the standard's hard rule), and required `name` + `description` are present;
|
|
106
|
+
- PMOS's D49 registry keys (`version`/`owner`/`risk`/`category`/`scope`/`lifecycle`) are relocated **under a `metadata:` map with a `pmos-` prefix** — the standard's producer-extension slot — never as top-level custom keys, so a conformant runtime ignores them cleanly;
|
|
107
|
+
- a **fail-closed conformance self-check** in `build-kit.sh` aborts the build on any violation (name≠dirname, missing required field, or a top-level custom key), the same posture as the containment check.
|
|
108
|
+
|
|
109
|
+
The flat `.skill` files remain the file-mode source of truth (the AGENTS.md state adapter references `pmos/skills/<name>.skill`); the native tree is the ecosystem-portable mirror. **Still a named follow-on (not built here):** wiring `create-pmos` to install the native tree into a runtime's auto-discovery locations (`.claude/skills/`, `.agents/skills/`). E6 delivers the conformant *packaging*; the *install location* is a separate change, revisited when native-discovery demand in kit repos is proven.
|
|
201
110
|
|
|
202
111
|
### Per-skill eval harness (E8 — convention shipped, benchmark deferred)
|
|
203
112
|
|
|
204
|
-
A skill may carry an **opt-in** eval file at `skills/evals/<name>.evals.json` (mapping to the
|
|
205
|
-
standard's `<name>/evals/evals.json` in native packaging), adopting the skill-creator harness shape:
|
|
113
|
+
A skill may carry an **opt-in** eval file at `skills/evals/<name>.evals.json` (mapping to the standard's `<name>/evals/evals.json` in native packaging), adopting the skill-creator harness shape:
|
|
206
114
|
|
|
207
|
-
- **`description_triggers`** — `should_fire` / `should_not_fire` prompt lists that test whether the
|
|
208
|
-
|
|
209
|
-
- **`cases`** — each a `{ name, prompt, expect, with_without }`, where `expect` is an **outcome
|
|
210
|
-
property** a grader checks (never a script) and `with_without` toggles whether the case is meant
|
|
211
|
-
for with-vs-without-the-skill benchmarking.
|
|
115
|
+
- **`description_triggers`** — `should_fire` / `should_not_fire` prompt lists that test whether the L1 description fires on the right requests and stays silent on the wrong ones (trigger-accuracy).
|
|
116
|
+
- **`cases`** — each a `{ name, prompt, expect, with_without }`, where `expect` is an **outcome property** a grader checks (never a script) and `with_without` toggles whether the case is meant for with-vs-without-the-skill benchmarking.
|
|
212
117
|
|
|
213
|
-
`scripts/check_skill_evals.py` (run in the `okf-drift` job) validates the **shape** of any present
|
|
214
|
-
eval file and that it names a real skill. It **never runs a benchmark** — actually scoring
|
|
215
|
-
with-vs-without needs labeled outcomes + compute and is **deferred** (there is no negative class
|
|
216
|
-
yet); running models in CI would make the gate nondeterministic. The convention and a worked example
|
|
217
|
-
(`skills/evals/prd.evals.json`) ship now; the verdict "this skill measurably helps" does not.
|
|
118
|
+
`scripts/check_skill_evals.py` (run in the `okf-drift` job) validates the **shape** of any present eval file and that it names a real skill. It **never runs a benchmark** — actually scoring with-vs-without needs labeled outcomes + compute and is **deferred** (there is no negative class yet); running models in CI would make the gate nondeterministic. The convention and a worked example (`skills/evals/prd.evals.json`) ship now; the verdict "this skill measurably helps" does not.
|
|
218
119
|
|
|
219
120
|
## File naming
|
|
220
121
|
|
|
@@ -232,9 +133,7 @@ yet); running models in CI would make the gate nondeterministic. The convention
|
|
|
232
133
|
|
|
233
134
|
A skill is well-formed when:
|
|
234
135
|
|
|
235
|
-
1. Level 1 frontmatter has `name` + `description` (both required), plus optionally `maturity_mode` (on
|
|
236
|
-
non-active skills) and the Phase-B registry keys `version`/`owner`/`risk`/`category`/`scope`/
|
|
237
|
-
`lifecycle` (D49); no other L1 keys.
|
|
136
|
+
1. Level 1 frontmatter has `name` + `description` (both required), plus optionally `maturity_mode` (on non-active skills) and the Phase-B registry keys `version`/`owner`/`risk`/`category`/`scope`/ `lifecycle` (D49); no other L1 keys.
|
|
238
137
|
2. `name` matches the filename stem.
|
|
239
138
|
3. `description` states both what the skill does and when to use it.
|
|
240
139
|
4. The body (Level 2) carries the full procedure and is self-sufficient for the common case.
|
|
@@ -242,13 +141,9 @@ A skill is well-formed when:
|
|
|
242
141
|
|
|
243
142
|
**Quality bar** (the "good", not just "well-formed" — see Quality above):
|
|
244
143
|
|
|
245
|
-
6. **Predictability served** — every line makes the agent's *process* more repeatable; cut what
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
exhaustive) done-condition, not a vague "do X".
|
|
249
|
-
8. **Pruned** — no no-ops, no sediment, no duplication; prohibitions phrased as positive targets;
|
|
250
|
-
sprawl disclosed to Level 3.
|
|
144
|
+
6. **Predictability served** — every line makes the agent's *process* more repeatable; cut what doesn't.
|
|
145
|
+
7. **Per-step completion criteria** — each procedural step ends on a checkable (and where it matters exhaustive) done-condition, not a vague "do X".
|
|
146
|
+
8. **Pruned** — no no-ops, no sediment, no duplication; prohibitions phrased as positive targets; sprawl disclosed to Level 3.
|
|
251
147
|
9. **Leading words** — restated qualities collapsed into pretrained tokens where one earns its keep.
|
|
252
148
|
|
|
253
|
-
All seed skills are authored against this checklist; the quarterly harness-assumption review re-runs
|
|
254
|
-
items 6–9 across every skill.
|
|
149
|
+
All seed skills are authored against this checklist; the quarterly harness-assumption review re-runs items 6–9 across every skill.
|
|
@@ -32,9 +32,11 @@ fake rubric, or escaped the record entirely.
|
|
|
32
32
|
|
|
33
33
|
## Procedure
|
|
34
34
|
|
|
35
|
-
1. **Anchor and create the initiative**
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
1. **Anchor and create the initiative** in the `discovery` lane.
|
|
36
|
+
- File mode: write `lane: discovery` in the initiative frontmatter.
|
|
37
|
+
- Do not write `type: discovery` there. `type` is D63's registry key, and its value is `Initiative`.
|
|
38
|
+
- Tool form: `create_initiative({id, title, parent_kr, type: 'discovery'})`. The argument keeps
|
|
39
|
+
its name. Read it as "record the equivalent in file-mode state" (AGENTS.md).
|
|
38
40
|
1b. **Existing surface? Understand it first.** If answering the question honestly requires reading
|
|
39
41
|
code that already exists, run an [explain-surface](/build-skills/explain-surface.skill) pass on
|
|
40
42
|
that region — in a fresh context, **before** writing the brief. A spike aimed at a system the PM
|
|
@@ -87,8 +87,9 @@ field's "agents improving their own tools" loop while staying at the **L3 ceilin
|
|
|
87
87
|
bounding decision [D47](/okf/products/pmos/adr/d47-self-refining-harness.md).
|
|
88
88
|
- The sibling detect→draft→PR loop: [okf-author](/build-skills/okf-author.skill),
|
|
89
89
|
[D42](/okf/products/pmos/adr/d42-okf-author-on-demand.md).
|
|
90
|
-
- The evidence surfaces:
|
|
91
|
-
[
|
|
90
|
+
- The evidence surfaces: recurring friction themes and self-reported context pressure, read from
|
|
91
|
+
file-mode state ([discoveries.md](/discoveries.md) and `runs.jsonl`; the hosted
|
|
92
|
+
`v_friction_recurrence` / `v_context_budget` views went with the backend in D66) plus
|
|
92
93
|
[eval-calibration.md](/planning/evals/eval-calibration.md).
|
|
93
94
|
- The cadence it serves: [D23](/okf/products/pmos/adr/d23-quarterly-cadence.md) (harness-assumption
|
|
94
95
|
review); the altitude standard: [agent-harness](/okf/core/concepts/agent-harness.md).
|
|
@@ -13,8 +13,8 @@ scope: read:tenant-repo, write:tenant-okf-drafts, write:product_repos
|
|
|
13
13
|
This skill is the **existing-repo on-ramp**: a PM arrives with a product that already ships and already
|
|
14
14
|
has a repo, and PMOS needs knowledge of it so a build agent doesn't cold-start on every run (re-deriving
|
|
15
15
|
the stack, assuming wrong, producing work the PM must heavily correct — the north-star cost). It is the
|
|
16
|
-
**inverse of
|
|
17
|
-
|
|
16
|
+
**inverse** of deriving an infrastructure spec from a PRD (PRD → what the product *needs*):
|
|
17
|
+
ingest-repo goes **code → what the product *is***. It emits a **draft** OKF
|
|
18
18
|
reference layer + a repo registration and then **stops for PM approval**.
|
|
19
19
|
|
|
20
20
|
> **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). L1
|
|
@@ -101,18 +101,19 @@ reference layer + a repo registration and then **stops for PM approval**.
|
|
|
101
101
|
- **`register_product_repo` semantics:** designed for provisioning output — here `app_surface`/
|
|
102
102
|
`backend_model` are *observed*, a usage-only difference (no schema change); note it.
|
|
103
103
|
- **B5 measurability:** the value thesis is "warm start → fewer corrections"; the first post-ingest
|
|
104
|
-
build run should retrieve these concepts
|
|
105
|
-
|
|
106
|
-
|
|
104
|
+
build run should retrieve these concepts. That real correction-delta, not the doc count, is the
|
|
105
|
+
win — measure it as corrections on the first post-ingest run versus the cold-start baseline.
|
|
106
|
+
(The hosted `v_knowledge_reuse` view that automated this count went with the backend in D66.)
|
|
107
107
|
|
|
108
108
|
## Level 3 — references
|
|
109
109
|
|
|
110
|
-
- The write path + PM gate:
|
|
110
|
+
- The write path + PM gate: write the docs into the product's own repo as drafts and let the PM
|
|
111
|
+
approve them in PR review — the file-mode form of draft→approved. (D37's database-native tenant OKF
|
|
112
|
+
and its `save_okf_doc` tool were retired by [D66](/DECISIONS.md).)
|
|
111
113
|
- The ledger method: [design-loop concept](/okf/core/concepts/design-loop.md),
|
|
112
114
|
[design-reconcile](/skills/core/design-reconcile.skill), [watermelon-flag](/okf/core/concepts/watermelon-flag.md).
|
|
113
115
|
- Extraction discipline: [source-to-concept](/skills/core/source-to-concept.skill).
|
|
114
|
-
- Scan location: [D51](/okf/products/pmos/adr/d51-scan-location.md).
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
- Sibling on-
|
|
118
|
-
[product-onboarding playbook](/okf/core/playbooks/product-onboarding.md).
|
|
116
|
+
- Scan location: [D51](/okf/products/pmos/adr/d51-scan-location.md). There is no longer a central
|
|
117
|
+
registry to register into — the hosted `product_repos` table and `register_product_repo` went with
|
|
118
|
+
the backend (D66); the product repo that carries the kit IS the registration.
|
|
119
|
+
- Sibling on-ramp: [product-onboarding playbook](/okf/core/playbooks/product-onboarding.md).
|
|
@@ -34,9 +34,11 @@ fake rubric, or escaped the record entirely.
|
|
|
34
34
|
|
|
35
35
|
## Procedure
|
|
36
36
|
|
|
37
|
-
1. **Anchor and create the initiative**
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
1. **Anchor and create the initiative** in the `discovery` lane.
|
|
38
|
+
- File mode: write `lane: discovery` in the initiative frontmatter.
|
|
39
|
+
- Do not write `type: discovery` there. `type` is D63's registry key, and its value is `Initiative`.
|
|
40
|
+
- Tool form: `create_initiative({id, title, parent_kr, type: 'discovery'})`. The argument keeps
|
|
41
|
+
its name. Read it as "record the equivalent in file-mode state" (AGENTS.md).
|
|
40
42
|
1b. **Existing surface? Understand it first.** If answering the question honestly requires reading
|
|
41
43
|
code that already exists, run an [explain-surface](/build-skills/explain-surface.skill) pass on
|
|
42
44
|
that region — in a fresh context, **before** writing the brief. A spike aimed at a system the PM
|
|
@@ -82,8 +82,9 @@ field's "agents improving their own tools" loop while staying at the **L3 ceilin
|
|
|
82
82
|
bounding decision [D47](/okf/products/pmos/adr/d47-self-refining-harness.md).
|
|
83
83
|
- The sibling detect→draft→PR loop: [okf-author](/build-skills/okf-author.skill),
|
|
84
84
|
[D42](/okf/products/pmos/adr/d42-okf-author-on-demand.md).
|
|
85
|
-
- The evidence surfaces:
|
|
86
|
-
[
|
|
85
|
+
- The evidence surfaces: recurring friction themes and self-reported context pressure, read from
|
|
86
|
+
file-mode state ([discoveries.md](/discoveries.md) and `runs.jsonl`; the hosted
|
|
87
|
+
`v_friction_recurrence` / `v_context_budget` views went with the backend in D66) plus
|
|
87
88
|
[eval-calibration.md](/planning/evals/eval-calibration.md).
|
|
88
89
|
- The cadence it serves: [D23](/okf/products/pmos/adr/d23-quarterly-cadence.md) (harness-assumption
|
|
89
90
|
review); the altitude standard: [agent-harness](/okf/core/concepts/agent-harness.md).
|
|
@@ -15,8 +15,8 @@ metadata:
|
|
|
15
15
|
This skill is the **existing-repo on-ramp**: a PM arrives with a product that already ships and already
|
|
16
16
|
has a repo, and PMOS needs knowledge of it so a build agent doesn't cold-start on every run (re-deriving
|
|
17
17
|
the stack, assuming wrong, producing work the PM must heavily correct — the north-star cost). It is the
|
|
18
|
-
**inverse of
|
|
19
|
-
|
|
18
|
+
**inverse** of deriving an infrastructure spec from a PRD (PRD → what the product *needs*):
|
|
19
|
+
ingest-repo goes **code → what the product *is***. It emits a **draft** OKF
|
|
20
20
|
reference layer + a repo registration and then **stops for PM approval**.
|
|
21
21
|
|
|
22
22
|
> **Format:** three-level progressive disclosure ([SKILL-FORMAT](/skills/core/SKILL-FORMAT.md)). L1
|
|
@@ -103,18 +103,19 @@ reference layer + a repo registration and then **stops for PM approval**.
|
|
|
103
103
|
- **`register_product_repo` semantics:** designed for provisioning output — here `app_surface`/
|
|
104
104
|
`backend_model` are *observed*, a usage-only difference (no schema change); note it.
|
|
105
105
|
- **B5 measurability:** the value thesis is "warm start → fewer corrections"; the first post-ingest
|
|
106
|
-
build run should retrieve these concepts
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
build run should retrieve these concepts. That real correction-delta, not the doc count, is the
|
|
107
|
+
win — measure it as corrections on the first post-ingest run versus the cold-start baseline.
|
|
108
|
+
(The hosted `v_knowledge_reuse` view that automated this count went with the backend in D66.)
|
|
109
109
|
|
|
110
110
|
## Level 3 — references
|
|
111
111
|
|
|
112
|
-
- The write path + PM gate:
|
|
112
|
+
- The write path + PM gate: write the docs into the product's own repo as drafts and let the PM
|
|
113
|
+
approve them in PR review — the file-mode form of draft→approved. (D37's database-native tenant OKF
|
|
114
|
+
and its `save_okf_doc` tool were retired by [D66](/DECISIONS.md).)
|
|
113
115
|
- The ledger method: [design-loop concept](/okf/core/concepts/design-loop.md),
|
|
114
116
|
[design-reconcile](/skills/core/design-reconcile.skill), [watermelon-flag](/okf/core/concepts/watermelon-flag.md).
|
|
115
117
|
- Extraction discipline: [source-to-concept](/skills/core/source-to-concept.skill).
|
|
116
|
-
- Scan location: [D51](/okf/products/pmos/adr/d51-scan-location.md).
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
- Sibling on-
|
|
120
|
-
[product-onboarding playbook](/okf/core/playbooks/product-onboarding.md).
|
|
118
|
+
- Scan location: [D51](/okf/products/pmos/adr/d51-scan-location.md). There is no longer a central
|
|
119
|
+
registry to register into — the hosted `product_repos` table and `register_product_repo` went with
|
|
120
|
+
the backend (D66); the product repo that carries the kit IS the registration.
|
|
121
|
+
- Sibling on-ramp: [product-onboarding playbook](/okf/core/playbooks/product-onboarding.md).
|
|
@@ -161,6 +161,20 @@ function endRisk(shown, quietMs) {
|
|
|
161
161
|
* Everything here is either copied off the row or derived by `endRisk`; nothing is invented. In
|
|
162
162
|
* particular `doing` is the agent's own last words as the sidebar already shows them, and it stays
|
|
163
163
|
* null when the workspace could not read them rather than becoming a cheerful placeholder.
|
|
164
|
+
*
|
|
165
|
+
* ── IT READS BOTH FIELD NAMES, AND THAT IS THE FIX, NOT A CONVENIENCE ──────────────────────────
|
|
166
|
+
* This read `s.doing` alone. The server's `describePeer` maps `lastWords -> doing` before calling
|
|
167
|
+
* here, so the PANE was correct; the browser's `treePeersNow` feeds RAW `/api/sessions` rows
|
|
168
|
+
* straight through, and a wire row has no `doing` key at all — 21 keys, `lastWords` among them,
|
|
169
|
+
* `doing` absent. So `describeTenant(wireRow).doing` was ALWAYS null and the chooser never rendered
|
|
170
|
+
* the agent's last words. An independent pass proved it end to end in a real browser with
|
|
171
|
+
* `lastWords` populated, and `npm-pkg/README.md` had been shipping that feature to adopters as a
|
|
172
|
+
* claim since 0.19.0.
|
|
173
|
+
*
|
|
174
|
+
* The fix belongs HERE, in the one function both surfaces call, not in the browser adapter.
|
|
175
|
+
* Correcting the caller would have made the two agree today and left them free to diverge again the
|
|
176
|
+
* next time a row shape moves — which is exactly how this defect was born. One function, both field
|
|
177
|
+
* names, no adapter to forget.
|
|
164
178
|
*/
|
|
165
179
|
function describeTenant(row, writerId) {
|
|
166
180
|
const s = row || {};
|
|
@@ -172,7 +186,7 @@ function describeTenant(row, writerId) {
|
|
|
172
186
|
agent: s.agent || null,
|
|
173
187
|
shown,
|
|
174
188
|
label: s.label || shown,
|
|
175
|
-
doing: s.doing || null,
|
|
189
|
+
doing: s.doing || s.lastWords || null,
|
|
176
190
|
branch: s.branch || null,
|
|
177
191
|
writer: !!(writerId && s.id === writerId),
|
|
178
192
|
risk: endRisk(shown, s.quietMs),
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pmos-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "pmos-workspace",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.33.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@xterm/addon-fit": "^0.11.0",
|
package/workspace/package.json
CHANGED