@plurnk/plurnk-meta 1.20.0 → 1.21.1
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 +5 -0
- package/docs/worker.md +98 -138
- package/package.json +1 -1
- package/skills/plurnk/SKILL.md +2 -2
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://
|
|
13
|
-
| `message://
|
|
14
|
-
| `ops://
|
|
15
|
-
| `worker://
|
|
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
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
74
|
-
````
|
|
53
|
+
## Lifecycle
|
|
75
54
|
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
89
|
-
answers your observed Open Messages, or your loop's original message when
|
|
90
|
-
remain open
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
What is the capital of Germany?
|
|
127
|
-
````
|
|
106
|
+
```BARE
|
|
107
|
+
A self-contained prompt.
|
|
108
|
+
```
|
|
128
109
|
|
|
129
|
-
The
|
|
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
|
-
##
|
|
114
|
+
## Turn sources
|
|
136
115
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
173
|
-
|
|
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.
|
|
3
|
+
"version": "1.21.1",
|
|
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",
|
package/skills/plurnk/SKILL.md
CHANGED
|
@@ -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,
|
|
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:
|
|
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/` |
|