@plurnk/plurnk-contracts 1.28.0 → 1.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/SPEC.md +18 -5
  2. package/package.json +1 -1
  3. package/plurnk.md +7 -3
package/SPEC.md CHANGED
@@ -680,7 +680,11 @@ by one ASCII space. Target and scope form one resource selection; COPY/MOVE
680
680
  repeat the complete selection/metadata group per operand. ANTLR accepts
681
681
  adjacent slots and scope/metadata permutations within a selection without
682
682
  changing ownership or making them distinct canonical forms. Each selection
683
- has at most one scope; its metadata blocks retain their authored order.
683
+ has at most one scope; its metadata blocks retain their authored order. A second scope
684
+ is refused, and the recovery reads the pair: a line number followed by its anchor
685
+ (`<91> <@abcde>`, a copied row prefix) recovers to the anchor alone, two other single
686
+ positions to one scope with both ends (`<@abcde> <-1>` to `<@abcde,-1>`), and anything
687
+ else to one operation per selection.
684
688
 
685
689
  §lifecycle-slots NOTE accepts no target, scope, or metadata. WAIT retains its
686
690
  optional target and duration under {§send-wait-scope}. Their literal bodies begin
@@ -958,7 +962,8 @@ the path and the rest is the channel (a spelling that opens with `#` names no pa
958
962
  whole), exactly as `worker:///a.html#readable` decomposes, so
959
963
  the `#channel` a READ receipt advertises (`channels: {"#readable": N}`) is addressable in the
960
964
  same bare spelling the receipt used: a model that appends the channel to the path it was just
961
- shown addresses the same entry. `raw` is therefore always the path alone; a
965
+ shown addresses the same entry, and so does one that writes it after the parenthesis,
966
+ `(page.html) #readable`, which {§naked-pattern} reads as the channel. `raw` is therefore always the path alone; a
962
967
  bare path never contains a literal `#`, and `PlurnkParser.stringify` renders the channel back.
963
968
  Without a `#` the field is absent, so an older `LocalPath` literal stays valid.
964
969
 
@@ -1825,7 +1830,11 @@ diagnostics are:
1825
1830
  scope or option block, the rest of a FIND, READ or KILL heading line is the
1826
1831
  matcher, in whichever dialect its first characters claim
1827
1832
  ({§matcher-prefix-claims}): `/re/i`, `^anchored`, `//xpath`, `$.json`, `~words`,
1828
- `&symbol`, or a sigil-less glob or literal such as `TODO` or `*.ts`. Those
1833
+ `&symbol`, or a sigil-less glob or literal such as `TODO` or `*.ts`. One
1834
+ spelling is not a matcher: `#name` alone, a `#` followed by one channel token
1835
+ and nothing else, after a target that names no channel, is that target's
1836
+ channel exactly as if written on the path ({§local-path-fragment}); a target
1837
+ that already names a channel keeps such a token as its pattern. Those
1829
1838
  matchers remain independent of owner options: a block without `pattern` never
1830
1839
  erases the heading matcher, and invalid blocks still reach the owning validator.
1831
1840
  These operations take no body, so heading-line text can mean nothing else. On EDIT only
@@ -1875,6 +1884,7 @@ diagnostics are:
1875
1884
  | `READ → sh:///x#stdout <1,50>` | the target, `READ (sh:///x#stdout) <1,50>`; COPY/MOVE take one arrow per operand | `` `→ sh:///x#stdout` is how the log shows an address; it was read as the target. Write the target in parentheses: `READ (sh:///x#stdout) <1,50>`. `` |
1876
1885
  | `READ (a.py) <1,50> · 900`, `· 320 tokens`, a bare `·` | nothing: the token charge is dropped, on the heading or after a matcher | `` `· 900` is the token charge the log shows on a heading; it is not part of an operation and was ignored. `` |
1877
1886
  | `FIND (x) /re/ · locate the sign handling` | the aside | `` `· locate the sign handling` was read as the aside; a note on an operation is written `<!-- locate the sign handling -->`. `` |
1887
+ | `FIND (x) <84,180> · no <!-- read the helpers -->` | the comment is the aside; the dot note before it is stray text, dropped | `` `· no` was ignored; the aside is `<!-- read the helpers -->`. `` |
1878
1888
 
1879
1889
  The arrow's path runs to the next space, `<` or `[`; a `·` never begins a heading matcher. In
1880
1890
  distinct recorded benchmark emissions the arrow form opened 40 headings and the charge ended 52,
@@ -1911,8 +1921,11 @@ diagnostics are:
1911
1921
  scope opener, report the offending scope (at most 64 code points, ending at
1912
1922
  `>` or the heading's line end) and its operation's constraint: FIND result
1913
1923
  positions, text coordinates, or no scope. Do not append advice for
1914
- other operations or infer why the producer supplied the value. Spacing and
1915
- boundary-loss diagnostics retain their own contracts.
1924
+ other operations or infer why the producer supplied the value. A text-coordinate
1925
+ scope that pairs an anchor with the same five characters unmarked (`<@abcde,fghij>`)
1926
+ states the anchor rule instead, with the scope marked: `` every line anchor carries
1927
+ its `@`: `<@abcde,@fghij>` ``. Spacing and boundary-loss diagnostics retain their own
1928
+ contracts.
1916
1929
  - §misplaced-aside-advisory **Aside in the body.** A READ or FIND whose
1917
1930
  body is solely an HTML comment (`<!-- … -->`) can never carry a matcher: it is
1918
1931
  the aside the model put on the line below the heading. The builder takes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-contracts",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "description": "Canonical PLURNK language contract, schemas, generated types, and runtime-neutral wire contracts",
5
5
  "keywords": [
6
6
  "plurnk",
package/plurnk.md CHANGED
@@ -28,12 +28,16 @@ body?
28
28
 
29
29
  ## Workflow Management
30
30
 
31
+ ```SEND <!-- parameterless send messages user -->
32
+ This is an example of a brief progress update for the user.
33
+ ```
34
+
31
35
  ```WAIT <60> <!-- wait up to 60 seconds -->
32
- Example explanation of delay.
36
+ This is an example of a brief progress update for the user.
33
37
  ```
34
38
 
35
39
  > [!IMPORTANT]
36
- > YOU SHOULD NOT respond before the KILL turn.
40
+ > YOU SHOULD ONLY answer the user with SEND, WAIT, or the KILL turn.
37
41
  > YOU SHOULD NOT perform a KILL turn before you have fully resolved all child workers and streams.
38
42
  > YOU MAY perform the standalone KILL turn by emitting a single parameterless KILL containing the final deliverable response.
39
43
 
@@ -62,7 +66,7 @@ This is an example of the complete, final deliverable response.
62
66
 
63
67
  * `(path)` may be a glob/extglob, permitting bulk operations.
64
68
  * Log item paths nest: `log:///1/2/3/READ` is loop/turn/item/OP.
65
- * FIND results hold one inner array per path: its channels, default first; append `#channel` to select another.
69
+ * FIND results hold one inner array per path: its channels, default first; append `#channel` to the path to select another: `(sh:///ab3d5678#stderr)`.
66
70
  * Percent-encode in paths `(` as `%28` and `)` as `%29`.
67
71
 
68
72
  ## `<scope|range>`