@plurnk/plurnk-meta 1.20.0 → 1.21.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/SPEC.md CHANGED
@@ -18,6 +18,11 @@ sources into a consuming package would create a second teaching owner.
18
18
  | `docs/worker.md` | Required | Deep reference prose for the reserved worker scheme | Pull-doc materialization {§schemes-directory} |
19
19
  | `skills/plurnk/SKILL.md` | Required | Standard Plurnk skill entry and chapter directory | Service-provided skill {§plurnk-skill} |
20
20
 
21
+ Every teaching source, and every package's `docs/*.md`, is written to
22
+ `TEACHING.md`, the style rule for model-facing prose: mechanism over advice,
23
+ one owner per claim, knobs by name, shapes over purposes, one home per
24
+ mechanism, no contract tags on a page.
25
+
21
26
  Required is a package-membership statement, not unconditional packet
22
27
  projection. Each source is read only at its consuming boundary; absence or an
23
28
  unrelated read failure fails that boundary with the original cause. An empty
package/docs/worker.md CHANGED
@@ -9,165 +9,125 @@ an entry rather than controlling that worker.
9
9
 
10
10
  | Address | Meaning | Model access |
11
11
  | --- | --- | --- |
12
- | `worker://reviewer` | Named worker | WORK/FORK create; SEND messages; READ collects; KILL terminates. |
13
- | `message://reviewer/ab3d5678` | Retained message | READ/FIND/COPY inspect; SEND replies. Neither EDIT nor KILL changes its source. |
14
- | `ops://reviewer/1` | What that loop said, or how it ended | READ/FIND/COPY inspect; source is immutable. |
15
- | `worker://reviewer/example.md` | Named scratch entry | Read and write from any worker in the workspace. |
12
+ | `worker://alice` | Named worker | WORK/FORK create; SEND messages; READ collects; KILL terminates. |
13
+ | `message://alice/ab3d5678` | Retained message | READ/FIND/COPY inspect; SEND replies. Neither EDIT nor KILL changes its source. |
14
+ | `ops://alice/1` | What that loop said, or how it ended | READ/FIND/COPY inspect; source is immutable. |
15
+ | `worker://alice/example.md` | Named scratch entry | Read and write from any worker in the workspace. |
16
16
  | `worker:///example.md` | Shared commons entry | Read and write. |
17
17
 
18
- The packet names your worker, its parent (`null` at a root), and the loop and turn you are producing under `## Worker`, below the log. Addresses are literal and keep
19
- the same meaning when passed to another worker. All scratch belongs to the
20
- workspace; its namespace does not require a namesake worker. Generated
21
- references live under `worker:///_plurnk/`; reference
22
- refreshes may replace those generated documents. EDIT creates or changes an
23
- entry, never a worker. An unscoped EDIT creates the entry from its body;
24
- KILL with an entry path deletes that entry, not its worker.
25
-
26
- ````EDIT (worker://reviewer/scratch/greet.mjs) <!-- create the entry from the body -->
27
- export const greet = (name) => `hello ${name}`;
28
-
29
- console.log(greet("world"));
30
- ````
31
-
32
- Control addresses contain only scheme and authority: no trailing slash,
33
- userinfo, port, query, or fragment. Messages and loop outcomes have separate
34
- addresses; neither is a scratch entry or an actor control.
18
+ The packet's `## Worker` block, below the log, names your worker, its parent
19
+ (`null` at a root), and the loop and turn you are producing. Addresses are
20
+ literal and keep the same meaning when passed to another worker. Scratch
21
+ belongs to the workspace; a namespace does not require a namesake worker.
22
+ Generated references live under `worker:///_plurnk/`, and reference refreshes
23
+ may replace them. EDIT creates or changes an entry, never a worker; KILL with
24
+ an entry path deletes that entry, not its worker. A control address is scheme
25
+ and authority only: no trailing slash, userinfo, port, query, or fragment.
26
+ Messages and loop outcomes have their own addresses; neither is a scratch
27
+ entry or an actor control.
35
28
 
36
29
  An entry whose source has a readable projection (HTML, a notebook) carries it
37
30
  beside the source as `#readable`, text/markdown, in its own line coordinates;
38
- the default channel stays the source. Patterns match the channel they address:
39
- `page.html` matches the markup, `page.html#readable` the Markdown. The
40
- projection follows every source write and is never written itself.
41
-
42
- ## Turn sources
43
-
44
- | Address | Read-only source in the named worker's history |
45
- | --- | --- |
46
- | `ops://<worker>/<loop>/<turn>` | The exact submitted program, including interstitial text. |
47
- | `reasoning://<worker>/<loop>/<turn>` | Original provider reasoning when exposed, or a harness turn's authored rationale. |
48
- | `note://<worker>/<loop>/<turn>/<item>` | The literal NOTE body, from the program or exposed reasoning; the receipt gives its address. |
49
-
50
- The worker name is required. Any worker in the workspace can READ these sources;
51
- SEND an address to share a note deliberately. `log:///` remains your own context.
52
- READ brings the selected source into your log; KILL of that READ curates only
53
- its log projection, never the original evidence. No later reasoning is added
54
- automatically after initialization's example READ.
55
-
56
- A READ can retain your current turn's reasoning: the source exists when your
57
- OPs execute. The packet's `## Worker` block names the coordinate you are
58
- producing. For example, as `worker://reviewer` on `"loop":1,"turn":3`:
31
+ the default channel stays the source, and a pattern matches the channel it
32
+ addresses. The projection follows every source write and is never written
33
+ itself.
59
34
 
60
- ````READ (reasoning://reviewer/1/3) <1,-1>
61
- ````
62
-
63
- The ordinary READ receipt appears in subsequent packets. A turn that produced
64
- no reasoning reads empty; a turn that has not happened returns a missing-source
65
- result. READ never requests inference.
35
+ ## Delegation
66
36
 
67
- NOTE retains working memory without changing the loop state. Only NOTE also
68
- executes from exposed reasoning; quoted examples and other reasoned operations
69
- remain data. Notes are ordinary log items: KILL or trim their log projection
70
- when no longer useful. Their read-only sources remain searchable and
71
- READable, including after log curation or a FORK.
37
+ WORK starts a fresh log with the task body as its prompt; FORK copies your
38
+ history and named scratch into the new name, then diverges. Embedded addresses
39
+ are preserved verbatim. Both share the workspace. An omitted address allocates
40
+ a short worker name, reported in the receipt; an explicit name cannot replace
41
+ an existing worker, even after it finishes. Names match
42
+ `[A-Za-z0-9][A-Za-z0-9_-]{0,62}` and are case-sensitive. SEND to an existing
43
+ worker gives it a follow-up task. `[{"env": {...}}]` on WORK or FORK is the
44
+ child's starting environment (`env.md`).
45
+
46
+ Parents observe a direct child's mutations, messages, executor invocations, and
47
+ worker launches, including failed actions, as rows in their own log.
48
+ Exploration and context curation (NOTE, READ, FIND, BARE, WAIT, and log KILL)
49
+ stay with the child, including READs of executor output. These observations
50
+ never wake the parent; replies and child conclusions retain their ordinary
51
+ delivery and wake behavior.
72
52
 
73
- ````FIND (note://reviewer/**) /parser/
74
- ````
53
+ ## Lifecycle
75
54
 
76
- ````READ (note://reviewer/1/3/2) <1,-1>
77
- ````
55
+ Ordinary operations keep the loop working while children run; WAIT joins their
56
+ activity. With live work (a child or an open stream) the loop parks and wakes
57
+ when that work settles, when a message arrives, or on an open stream's
58
+ observation cadence; without live work it continues at once. Several WAITs in
59
+ one turn are one park, and what a WAIT names is its label; scope and metadata
60
+ decorations are ignored.
61
+
62
+ A wake ends the suspension, not its held work; a further WAIT waits again.
63
+ Waking retains the loop's messages, turn allowance, and remaining execution
64
+ time; parked time does not consume execution time. A turn containing only a
65
+ parameterless KILL requests completion: its body answers the Open Messages, or
66
+ is empty when an already-delivered answer stands. While live work remains, that
67
+ KILL joins it without cancelling it and delivers no final answer.
68
+
69
+ Each child task's conclusion wakes its waiting parent and arrives once, as an
70
+ `_plurnk` READ of `ops://alice/1` carrying what the child said: the
71
+ execution outcome, not another message, and not delivered again as a reply. A
72
+ failure retains its status and Problem. READ that address with a scope to
73
+ inspect more of the exact result, even after the child starts another task.
74
+ Bare `READ (worker://alice)` collects the current result instead, naming its
75
+ exact source in `resource`; while the child is running it returns `425`. A
76
+ result does not imply that every task in that worker has finished.
78
77
 
79
- ## Delegation
78
+ `KILL (worker://<name>)` cancels that worker and its descendants, including
79
+ queued work and unread messages. History remains readable; a later SEND can
80
+ start new work.
80
81
 
81
- Parents passively observe child mutations, messages, executor invocations, and
82
- worker launches, including failed actions. Exploration and context
83
- curation (NOTE, READ, FIND, BARE, WAIT, and log KILL) stay with the child, including
84
- READs of executor output. These observations never wake the parent; replies and
85
- child conclusions retain their ordinary delivery and wake behavior.
82
+ ## Messages
86
83
 
87
84
  Open Messages names unanswered messages; an arrival receipt's `resource` links
88
- to the same source. SEND to that address answers that message. A targetless SEND
89
- answers your observed Open Messages, or your loop's original message when none
90
- remain open. A concluding parameterless KILL uses the same reply routing for its
91
- body; no preceding SEND is needed to answer those messages. An empty targetless
92
- SEND delivers nothing. SEND to a worker control address gives it
93
- new work instead. Curation of a message's log occurrences never deletes the
94
- source or changes whether it was answered. Another worker may answer it;
95
- the assigned worker and original sender receive that reply without a new request.
96
-
97
- **WORK to delegate, FORK to branch.** WORK starts a fresh log with your task
98
- prompt; FORK copies your history and named scratch into its new name, then
99
- diverges. Embedded addresses are preserved verbatim. Both share the workspace.
100
- Omit the address to allocate a short worker name, reported in the receipt;
101
- explicit names cannot replace an existing worker, even after it finishes.
102
- Names match `[A-Za-z0-9][A-Za-z0-9_-]{0,62}` and are case-sensitive.
103
- A path outside the `worker://` scheme is the child's prompt resource, as for
104
- BARE: `WORK (specs/feature.md)` reads the file whole as the task,
105
- an inline body follows it after a blank line, and the child is auto-named.
106
- Use SEND to give an existing worker a follow-up task.
107
-
108
- SEND accepts `[{"attachments":["report.pdf","worker:///example.md"]}]`.
109
- It delivers send-time copies through ordinary resource links, not native media
110
- injection; the recipient READs what it needs. Missing sources fail before
111
- delivery. The same option works on a targetless reply.
112
-
113
- A SEND takes no scope. To deliver a message later or on a cadence, to a worker
114
- or to yourself, add a rule with the `schedule` family; it arrives as an
85
+ to the same source. SEND to that address answers that message. A targetless
86
+ SEND answers your observed Open Messages, or your loop's original message when
87
+ none remain open; a concluding parameterless KILL uses the same reply routing
88
+ for its body. An empty targetless SEND delivers nothing. SEND to a worker
89
+ control address gives it new work instead. Curation of a message's log
90
+ occurrences never deletes the source or changes whether it was answered.
91
+ Another worker may answer it; the assigned worker and original sender receive
92
+ that reply without a new request.
93
+
94
+ SEND accepts `[{"attachments":["report.pdf","worker:///example.md"]}]`:
95
+ send-time copies delivered through ordinary resource links, not native media
96
+ injection; the recipient READs what it needs, and a missing source fails before
97
+ delivery. The same option works on a targetless reply. A SEND takes no scope;
98
+ delivery later or on a cadence is the `schedule` family's, arriving as an
115
99
  ordinary message from `schedule://<alias>`.
116
100
 
117
101
  ## BARE inference
118
102
 
119
- BARE makes one isolated call to the child model, not a persistent worker.
120
- It receives no parent history or tools. Give it a prompt resource, an inline
121
- prompt, or both; resource text precedes an inline body with a blank line between.
103
+ BARE makes one isolated call to the child model, not a persistent worker. It
104
+ receives no parent history or tools. Its prompt is the fence body.
122
105
 
123
- ````BARE (worker://reviewer/question.md)
124
- ````
125
- ````BARE
126
- What is the capital of Germany?
127
- ````
106
+ ```BARE
107
+ A self-contained prompt.
108
+ ```
128
109
 
129
- The resource supplies its complete current READ text, not a preview. Neither
130
- prompt form is truncated to fit; provider capacity still applies. A failed
131
- source read returns its error without making an inference call.
110
+ The prompt is not truncated to fit; provider capacity still applies.
132
111
  Consecutive BARE calls run concurrently and settle before the turn continues.
133
112
  Their answers are ordinary BARE receipts, visible in the next packet.
134
113
 
135
- ## Lifecycle
114
+ ## Turn sources
136
115
 
137
- **Continue or wait.** Ordinary operations keep the loop working while children
138
- run; WAIT joins their activity:
139
-
140
- ````WORK (worker://capital-checker)
141
- Find the capital of France from a primary source
142
- ````
143
-
144
- ````WAIT
145
- Await capital-checker's answer.
146
- ````
147
-
148
- WAIT continues the same loop: with live work—a child or an open stream—the
149
- loop parks and wakes when that work settles, when a message arrives, or on an
150
- open stream's observation cadence; without live work it continues at once.
151
- Several WAITs in one turn are one park, and what a WAIT names is its label.
152
- Scope and metadata decorations are ignored. To wake later with nothing in flight,
153
- add a rule with the `schedule` family targeting yourself.
154
-
155
- A wake ends the suspension, not its held work. Submit WAIT to wait again. Waking
156
- retains the loop's messages, turn allowance, and remaining execution time;
157
- parked time does not consume execution time. After observing the work's results,
158
- conclude with a turn containing only parameterless KILL. Its body answers the Open
159
- Messages, or may be empty when an already-delivered answer stands. Premature
160
- completion delivers no final answer. It joins remaining live work without cancelling it.
161
-
162
- Each child task's conclusion wakes its waiting parent and arrives as an
163
- `_plurnk` READ of `ops://capital-checker/1`, carrying what the child said. This is the
164
- execution outcome, not another message, and it arrives once: an answer to the task you
165
- delegated is not delivered again as a separate reply. A failure retains its status and Problem.
166
- READ that address with a scope to inspect more of the exact result, even after
167
- the child starts another task. Bare `READ (worker://capital-checker)` collects
168
- the current result instead, naming its exact source in `resource`. While the child is running it returns
169
- `425`; ordinary operations continue and WAIT explicitly joins.
170
- A result does not imply that every task in that worker has finished.
116
+ | Address | Read-only source in the named worker's history |
117
+ | --- | --- |
118
+ | `ops://<worker>/<loop>/<turn>` | The exact submitted program, including interstitial text. |
119
+ | `reasoning://<worker>/<loop>/<turn>` | Original provider reasoning when exposed, or a harness turn's authored rationale. |
120
+ | `note://<worker>/<loop>/<turn>/<item>` | The literal NOTE body, from the program or exposed reasoning; the receipt gives its address. |
171
121
 
172
- `KILL (worker://<name>)` cancels that worker and its descendants, including
173
- queued work and unread messages. History remains readable; a later SEND can start new work.
122
+ The worker name is required. Any worker in the workspace can READ these
123
+ sources; `log:///` remains your own context. READ brings the selected source
124
+ into your log, and KILL of that READ curates only its log projection, never the
125
+ original evidence. The current turn's reasoning exists when its OPs execute, so
126
+ `READ (reasoning://alice/1/3) <1,-1>` from `worker://alice` on loop 1,
127
+ turn 3 retains it; a turn that produced no reasoning reads empty, and a turn
128
+ that has not happened returns a missing-source result. READ never requests
129
+ inference. NOTE retains working memory without changing the loop state; only
130
+ NOTE also executes from exposed reasoning, while quoted examples and other
131
+ reasoned operations remain data. Notes are ordinary log items whose read-only
132
+ sources stay searchable (`FIND (note://alice/**) /parser/`) and READable
133
+ after curation or a FORK.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-meta",
3
- "version": "1.20.0",
3
+ "version": "1.21.0",
4
4
  "description": "The plurnk metaproject layer, published: plugin-membership primitives (the ONE trust rule, scope-agnostic symlink-aware enumeration, deployment-root resolution), the project teaching corpus (personality, Recap, scheme docs), and the home for family tooling.",
5
5
  "keywords": [
6
6
  "plurnk",
@@ -9,11 +9,11 @@ description: Configure Plurnk, select and tune models, and look up its worker an
9
9
  | --- | --- |
10
10
  | Configuration cascade, persistence, permissions, skills | [Configuration](references/configuration.md) |
11
11
  | COPY/MOVE operands, source regions, destination placement | [Copy and move](references/copy-move.md) |
12
- | Model routes, reasoning, context, local endpoints | [Models](references/models.md) |
12
+ | Model routes, reasoning, output and context limits, cost | [Models](references/models.md) |
13
13
  | Every installed package's settings and defaults | [Complete .env.defaults](.env.defaults) |
14
14
  | Worker hierarchy, messaging, and delegation | [Worker reference](worker:///_plurnk/plurnk/worker.md) |
15
15
  | Which project files you can see, and why a file is missing | [Membership](worker:///_plurnk/plurnk/members.md) |
16
- | Agent Skills, MCP servers, and A2A agents: when to reach for one, how to add one | `worker:///_plurnk/plurnk/skills.md`, `mcp.md`, `a2a.md` |
16
+ | Agent Skills, MCP servers, and A2A agents: what each is and how one is added | `worker:///_plurnk/plurnk/skills.md`, `mcp.md`, `a2a.md` |
17
17
  | Running code: the shell and each interpreter's body, stdin, arguments, exit status | `worker:///_plurnk/plurnk/sh.md`, `node.md`, `python3.md`, … |
18
18
  | Enabled MCP server invocations and schemas | `worker:///_plurnk/tools/` |
19
19
  | Built-in executors and scheme references | `worker:///_plurnk/plurnk/` |