@plurnk/plurnk-service 1.14.2 → 1.16.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 (308) hide show
  1. package/.env.defaults +2 -2
  2. package/SPEC.md +243 -173
  3. package/digest-sql/curation/curation.sql +1 -1
  4. package/dist/build-info.json +1 -1
  5. package/dist/content/byte-view.d.ts +14 -0
  6. package/dist/content/byte-view.d.ts.map +1 -0
  7. package/dist/content/byte-view.js +33 -0
  8. package/dist/content/byte-view.js.map +1 -0
  9. package/dist/content/edit-receipt.d.ts.map +1 -1
  10. package/dist/content/edit-receipt.js +12 -1
  11. package/dist/content/edit-receipt.js.map +1 -1
  12. package/dist/content/line-marker.d.ts +2 -1
  13. package/dist/content/line-marker.d.ts.map +1 -1
  14. package/dist/content/line-marker.js +1 -0
  15. package/dist/content/line-marker.js.map +1 -1
  16. package/dist/content/matcher.d.ts +1 -0
  17. package/dist/content/matcher.d.ts.map +1 -1
  18. package/dist/content/matcher.js +1 -0
  19. package/dist/content/matcher.js.map +1 -1
  20. package/dist/content/read-projector.d.ts +4 -1
  21. package/dist/content/read-projector.d.ts.map +1 -1
  22. package/dist/content/read-projector.js +80 -3
  23. package/dist/content/read-projector.js.map +1 -1
  24. package/dist/core/AdmittedTurnExecutor.d.ts +43 -0
  25. package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -0
  26. package/dist/core/AdmittedTurnExecutor.js +245 -0
  27. package/dist/core/AdmittedTurnExecutor.js.map +1 -0
  28. package/dist/core/BareBatchRunner.d.ts +26 -0
  29. package/dist/core/BareBatchRunner.d.ts.map +1 -0
  30. package/dist/core/BareBatchRunner.js +104 -0
  31. package/dist/core/BareBatchRunner.js.map +1 -0
  32. package/dist/core/BudgetReadout.d.ts +1 -1
  33. package/dist/core/BudgetReadout.d.ts.map +1 -1
  34. package/dist/core/BudgetReadout.js +42 -47
  35. package/dist/core/BudgetReadout.js.map +1 -1
  36. package/dist/core/CapabilityResolver.d.ts +2 -1
  37. package/dist/core/CapabilityResolver.d.ts.map +1 -1
  38. package/dist/core/CapabilityResolver.js +8 -9
  39. package/dist/core/CapabilityResolver.js.map +1 -1
  40. package/dist/core/ChannelWrite.d.ts +1 -1
  41. package/dist/core/ChannelWrite.d.ts.map +1 -1
  42. package/dist/core/DataStatementRunner.d.ts +35 -0
  43. package/dist/core/DataStatementRunner.d.ts.map +1 -0
  44. package/dist/core/DataStatementRunner.js +252 -0
  45. package/dist/core/DataStatementRunner.js.map +1 -0
  46. package/dist/core/Dispatcher.d.ts +8 -3
  47. package/dist/core/Dispatcher.d.ts.map +1 -1
  48. package/dist/core/Dispatcher.js +88 -738
  49. package/dist/core/Dispatcher.js.map +1 -1
  50. package/dist/core/EditMutations.d.ts +39 -0
  51. package/dist/core/EditMutations.d.ts.map +1 -0
  52. package/dist/core/EditMutations.js +418 -0
  53. package/dist/core/EditMutations.js.map +1 -0
  54. package/dist/core/Engine.d.ts +2 -23
  55. package/dist/core/Engine.d.ts.map +1 -1
  56. package/dist/core/Engine.js +18 -240
  57. package/dist/core/Engine.js.map +1 -1
  58. package/dist/core/Engine.sql +24 -23
  59. package/dist/core/KillHandler.d.ts +32 -0
  60. package/dist/core/KillHandler.d.ts.map +1 -0
  61. package/dist/core/KillHandler.js +179 -0
  62. package/dist/core/KillHandler.js.map +1 -0
  63. package/dist/core/LogVisibility.d.ts +1 -1
  64. package/dist/core/LogVisibility.d.ts.map +1 -1
  65. package/dist/core/LogVisibility.js +3 -4
  66. package/dist/core/LogVisibility.js.map +1 -1
  67. package/dist/core/LogWriter.d.ts +42 -0
  68. package/dist/core/LogWriter.d.ts.map +1 -0
  69. package/dist/core/LogWriter.js +136 -0
  70. package/dist/core/LogWriter.js.map +1 -0
  71. package/dist/core/LoopDriver.d.ts +46 -0
  72. package/dist/core/LoopDriver.d.ts.map +1 -0
  73. package/dist/core/LoopDriver.js +263 -0
  74. package/dist/core/LoopDriver.js.map +1 -0
  75. package/dist/core/LoopLifecycle.d.ts +2 -1
  76. package/dist/core/LoopLifecycle.d.ts.map +1 -1
  77. package/dist/core/MembershipMaterialization.d.ts +7 -0
  78. package/dist/core/MembershipMaterialization.d.ts.map +1 -0
  79. package/dist/core/MembershipMaterialization.js +283 -0
  80. package/dist/core/MembershipMaterialization.js.map +1 -0
  81. package/dist/core/MutationEffects.d.ts +29 -0
  82. package/dist/core/MutationEffects.d.ts.map +1 -0
  83. package/dist/core/MutationEffects.js +318 -0
  84. package/dist/core/MutationEffects.js.map +1 -0
  85. package/dist/core/OverflowTurn.d.ts +4 -4
  86. package/dist/core/OverflowTurn.d.ts.map +1 -1
  87. package/dist/core/OverflowTurn.js +6 -7
  88. package/dist/core/OverflowTurn.js.map +1 -1
  89. package/dist/core/PacketBuilder.d.ts.map +1 -1
  90. package/dist/core/PacketBuilder.js +31 -9
  91. package/dist/core/PacketBuilder.js.map +1 -1
  92. package/dist/core/ResourceMutations.d.ts +12 -36
  93. package/dist/core/ResourceMutations.d.ts.map +1 -1
  94. package/dist/core/ResourceMutations.js +27 -1351
  95. package/dist/core/ResourceMutations.js.map +1 -1
  96. package/dist/core/ResourceSelector.d.ts +21 -0
  97. package/dist/core/ResourceSelector.d.ts.map +1 -0
  98. package/dist/core/ResourceSelector.js +233 -0
  99. package/dist/core/ResourceSelector.js.map +1 -0
  100. package/dist/core/ResourceTransfers.d.ts +55 -0
  101. package/dist/core/ResourceTransfers.d.ts.map +1 -0
  102. package/dist/core/ResourceTransfers.js +525 -0
  103. package/dist/core/ResourceTransfers.js.map +1 -0
  104. package/dist/core/SchemeRegistry.js +2 -2
  105. package/dist/core/SchemeRegistry.js.map +1 -1
  106. package/dist/core/SendBroadcastHandler.d.ts +40 -0
  107. package/dist/core/SendBroadcastHandler.d.ts.map +1 -0
  108. package/dist/core/SendBroadcastHandler.js +159 -0
  109. package/dist/core/SendBroadcastHandler.js.map +1 -0
  110. package/dist/core/StoredPacket.d.ts +11 -0
  111. package/dist/core/StoredPacket.d.ts.map +1 -1
  112. package/dist/core/StoredPacket.js +22 -1
  113. package/dist/core/StoredPacket.js.map +1 -1
  114. package/dist/core/StrikeRail.d.ts.map +1 -1
  115. package/dist/core/StrikeRail.js +19 -9
  116. package/dist/core/StrikeRail.js.map +1 -1
  117. package/dist/core/TokenCalibration.d.ts +16 -0
  118. package/dist/core/TokenCalibration.d.ts.map +1 -0
  119. package/dist/core/TokenCalibration.js +35 -0
  120. package/dist/core/TokenCalibration.js.map +1 -0
  121. package/dist/core/ToolResources.d.ts.map +1 -1
  122. package/dist/core/ToolResources.js +15 -12
  123. package/dist/core/ToolResources.js.map +1 -1
  124. package/dist/core/TurnMaterialization.d.ts +37 -0
  125. package/dist/core/TurnMaterialization.d.ts.map +1 -0
  126. package/dist/core/TurnMaterialization.js +296 -0
  127. package/dist/core/TurnMaterialization.js.map +1 -0
  128. package/dist/core/TurnOps.d.ts.map +1 -1
  129. package/dist/core/TurnOps.js +6 -8
  130. package/dist/core/TurnOps.js.map +1 -1
  131. package/dist/core/TurnRunner.d.ts +15 -27
  132. package/dist/core/TurnRunner.d.ts.map +1 -1
  133. package/dist/core/TurnRunner.js +76 -670
  134. package/dist/core/TurnRunner.js.map +1 -1
  135. package/dist/core/WorkerControlHandler.d.ts +15 -0
  136. package/dist/core/WorkerControlHandler.d.ts.map +1 -0
  137. package/dist/core/WorkerControlHandler.js +89 -0
  138. package/dist/core/WorkerControlHandler.js.map +1 -0
  139. package/dist/core/attachments.d.ts +14 -0
  140. package/dist/core/attachments.d.ts.map +1 -0
  141. package/dist/core/attachments.js +18 -0
  142. package/dist/core/attachments.js.map +1 -0
  143. package/dist/core/fork.d.ts.map +1 -1
  144. package/dist/core/fork.js +0 -4
  145. package/dist/core/fork.js.map +1 -1
  146. package/dist/core/fork.sql +5 -16
  147. package/dist/core/git-membership.d.ts +15 -0
  148. package/dist/core/git-membership.d.ts.map +1 -1
  149. package/dist/core/git-membership.js +4 -273
  150. package/dist/core/git-membership.js.map +1 -1
  151. package/dist/core/git-state.d.ts +2 -1
  152. package/dist/core/git-state.d.ts.map +1 -1
  153. package/dist/core/mutation-types.d.ts +102 -0
  154. package/dist/core/mutation-types.d.ts.map +1 -0
  155. package/dist/core/mutation-types.js +2 -0
  156. package/dist/core/mutation-types.js.map +1 -0
  157. package/dist/core/operation-target-groups.js +1 -1
  158. package/dist/core/operation-target-groups.js.map +1 -1
  159. package/dist/core/packet-wire.d.ts +7 -6
  160. package/dist/core/packet-wire.d.ts.map +1 -1
  161. package/dist/core/packet-wire.js +96 -68
  162. package/dist/core/packet-wire.js.map +1 -1
  163. package/dist/core/plurnk-uri.d.ts +0 -1
  164. package/dist/core/plurnk-uri.d.ts.map +1 -1
  165. package/dist/core/plurnk-uri.js +1 -1
  166. package/dist/core/plurnk-uri.js.map +1 -1
  167. package/dist/core/statement-primary.d.ts +4 -0
  168. package/dist/core/statement-primary.d.ts.map +1 -0
  169. package/dist/core/statement-primary.js +3 -0
  170. package/dist/core/statement-primary.js.map +1 -0
  171. package/dist/core/teaching-corpus.d.ts +0 -1
  172. package/dist/core/teaching-corpus.d.ts.map +1 -1
  173. package/dist/core/teaching-corpus.js +0 -9
  174. package/dist/core/teaching-corpus.js.map +1 -1
  175. package/dist/core/turn-scheduler.js +3 -3
  176. package/dist/core/turn-scheduler.js.map +1 -1
  177. package/dist/core/turn-signals.d.ts +15 -0
  178. package/dist/core/turn-signals.d.ts.map +1 -0
  179. package/dist/core/turn-signals.js +19 -0
  180. package/dist/core/turn-signals.js.map +1 -0
  181. package/dist/core/worker-settings.d.ts +0 -1
  182. package/dist/core/worker-settings.d.ts.map +1 -1
  183. package/dist/core/worker-settings.js +1 -1
  184. package/dist/core/worker-settings.js.map +1 -1
  185. package/dist/digest/Digest.d.ts +3 -16
  186. package/dist/digest/Digest.d.ts.map +1 -1
  187. package/dist/digest/Digest.js +10 -958
  188. package/dist/digest/Digest.js.map +1 -1
  189. package/dist/digest/DigestRender.d.ts +12 -0
  190. package/dist/digest/DigestRender.d.ts.map +1 -0
  191. package/dist/digest/DigestRender.js +641 -0
  192. package/dist/digest/DigestRender.js.map +1 -0
  193. package/dist/digest/DigestRequiem.d.ts +13 -0
  194. package/dist/digest/DigestRequiem.d.ts.map +1 -0
  195. package/dist/digest/DigestRequiem.js +332 -0
  196. package/dist/digest/DigestRequiem.js.map +1 -0
  197. package/dist/digest/digest-rows.d.ts +303 -0
  198. package/dist/digest/digest-rows.d.ts.map +1 -0
  199. package/dist/digest/digest-rows.js +2 -0
  200. package/dist/digest/digest-rows.js.map +1 -0
  201. package/dist/digest/digest.sql +1 -7
  202. package/dist/observe/api.d.ts +0 -2
  203. package/dist/observe/api.d.ts.map +1 -1
  204. package/dist/observe/api.js +2 -2
  205. package/dist/observe/api.js.map +1 -1
  206. package/dist/observe/metrics.d.ts +0 -1
  207. package/dist/observe/metrics.d.ts.map +1 -1
  208. package/dist/observe/metrics.js +0 -1
  209. package/dist/observe/metrics.js.map +1 -1
  210. package/dist/schemes/Exec.d.ts +4 -1
  211. package/dist/schemes/Exec.d.ts.map +1 -1
  212. package/dist/schemes/Exec.js +89 -48
  213. package/dist/schemes/Exec.js.map +1 -1
  214. package/dist/schemes/ExecOutputScheme.d.ts +2 -1
  215. package/dist/schemes/ExecOutputScheme.d.ts.map +1 -1
  216. package/dist/schemes/ExecOutputScheme.js +3 -3
  217. package/dist/schemes/ExecOutputScheme.js.map +1 -1
  218. package/dist/schemes/File.d.ts +4 -1
  219. package/dist/schemes/File.d.ts.map +1 -1
  220. package/dist/schemes/File.js +100 -13
  221. package/dist/schemes/File.js.map +1 -1
  222. package/dist/schemes/Log.d.ts +4 -5
  223. package/dist/schemes/Log.d.ts.map +1 -1
  224. package/dist/schemes/Log.js +26 -118
  225. package/dist/schemes/Log.js.map +1 -1
  226. package/dist/schemes/Log.sql +1 -66
  227. package/dist/schemes/Prompt.js +1 -1
  228. package/dist/schemes/Prompt.js.map +1 -1
  229. package/dist/schemes/Worker.d.ts.map +1 -1
  230. package/dist/schemes/Worker.js +1 -13
  231. package/dist/schemes/Worker.js.map +1 -1
  232. package/dist/schemes/_entry-crud.d.ts +3 -1
  233. package/dist/schemes/_entry-crud.d.ts.map +1 -1
  234. package/dist/schemes/_entry-crud.js +18 -3
  235. package/dist/schemes/_entry-crud.js.map +1 -1
  236. package/dist/schemes/_entry-find.d.ts +4 -2
  237. package/dist/schemes/_entry-find.d.ts.map +1 -1
  238. package/dist/schemes/_entry-find.js +79 -10
  239. package/dist/schemes/_entry-find.js.map +1 -1
  240. package/dist/schemes/_entry-manifest.d.ts +1 -2
  241. package/dist/schemes/_entry-manifest.d.ts.map +1 -1
  242. package/dist/schemes/_entry-ops.d.ts +2 -1
  243. package/dist/schemes/_entry-ops.d.ts.map +1 -1
  244. package/dist/schemes/_entry-ops.js +20 -2
  245. package/dist/schemes/_entry-ops.js.map +1 -1
  246. package/dist/schemes/_entry-semantic.d.ts +1 -0
  247. package/dist/schemes/_entry-semantic.d.ts.map +1 -1
  248. package/dist/schemes/_entry-semantic.js +3 -0
  249. package/dist/schemes/_entry-semantic.js.map +1 -1
  250. package/dist/schemes/_entry-semantic.sql +2 -2
  251. package/dist/schemes/_entry-send.d.ts +0 -1
  252. package/dist/schemes/_entry-send.d.ts.map +1 -1
  253. package/dist/schemes/_entry-send.js +5 -80
  254. package/dist/schemes/_entry-send.js.map +1 -1
  255. package/dist/schemes/exec-runtime.d.ts +7 -0
  256. package/dist/schemes/exec-runtime.d.ts.map +1 -0
  257. package/dist/schemes/exec-runtime.js +2 -0
  258. package/dist/schemes/exec-runtime.js.map +1 -0
  259. package/dist/server/ClientReads.d.ts +34 -0
  260. package/dist/server/ClientReads.d.ts.map +1 -0
  261. package/dist/server/ClientReads.js +210 -0
  262. package/dist/server/ClientReads.js.map +1 -0
  263. package/dist/server/Daemon.d.ts +12 -22
  264. package/dist/server/Daemon.d.ts.map +1 -1
  265. package/dist/server/Daemon.js +31 -362
  266. package/dist/server/Daemon.js.map +1 -1
  267. package/dist/server/DaemonModule.d.ts +6 -5
  268. package/dist/server/DaemonModule.d.ts.map +1 -1
  269. package/dist/server/DrainSupervisor.d.ts +3 -2
  270. package/dist/server/DrainSupervisor.d.ts.map +1 -1
  271. package/dist/server/DrainSupervisor.js +7 -3
  272. package/dist/server/DrainSupervisor.js.map +1 -1
  273. package/dist/server/Functionality.d.ts +0 -12
  274. package/dist/server/Functionality.d.ts.map +1 -1
  275. package/dist/server/Functionality.js.map +1 -1
  276. package/dist/server/FunctionalityManager.d.ts +0 -1
  277. package/dist/server/FunctionalityManager.d.ts.map +1 -1
  278. package/dist/server/FunctionalityManager.js +3 -3
  279. package/dist/server/FunctionalityManager.js.map +1 -1
  280. package/dist/server/MembersFunctionality.d.ts +2 -13
  281. package/dist/server/MembersFunctionality.d.ts.map +1 -1
  282. package/dist/server/MembersFunctionality.js +4 -4
  283. package/dist/server/MembersFunctionality.js.map +1 -1
  284. package/dist/server/SkillsFunctionality.d.ts +1 -7
  285. package/dist/server/SkillsFunctionality.d.ts.map +1 -1
  286. package/dist/server/SkillsFunctionality.js +3 -3
  287. package/dist/server/SkillsFunctionality.js.map +1 -1
  288. package/dist/server/WorkerModelResolver.d.ts +17 -0
  289. package/dist/server/WorkerModelResolver.d.ts.map +1 -0
  290. package/dist/server/WorkerModelResolver.js +166 -0
  291. package/dist/server/WorkerModelResolver.js.map +1 -0
  292. package/dist/server/daemon-results.d.ts +5 -0
  293. package/dist/server/daemon-results.d.ts.map +1 -0
  294. package/dist/server/daemon-results.js +7 -0
  295. package/dist/server/daemon-results.js.map +1 -0
  296. package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
  297. package/dist/server/dispatch-as-plurnk.js +4 -6
  298. package/dist/server/dispatch-as-plurnk.js.map +1 -1
  299. package/dist/server/logEntry.d.ts +0 -1
  300. package/dist/server/logEntry.d.ts.map +1 -1
  301. package/dist/server/logEntry.js +1 -13
  302. package/dist/server/logEntry.js.map +1 -1
  303. package/dist/server/logEntry.sql +1 -5
  304. package/dist/server/loopDocs.d.ts.map +1 -1
  305. package/dist/server/loopDocs.js +11 -2
  306. package/dist/server/loopDocs.js.map +1 -1
  307. package/migrations/001_schema.sql +30 -347
  308. package/package.json +30 -30
package/SPEC.md CHANGED
@@ -131,7 +131,7 @@ scored. Every recovery checkpoint broadcasts live, while the model-facing Notice
131
131
  retains only the current provider state; the next completed exchange notices
132
132
  `provider_recovered`. Recovery is bounded by `PLURNK_SERVICE_PROVIDER_RECOVERY`; when it
133
133
  is spent the turn completes as `202` and the loop parks exactly like a
134
- `## SEND0 [202]` wait ({§worker-lifecycle-wake-requeue-not-terminal}), resuming on the
134
+ `### SEND0 (WAIT)` wait ({§worker-lifecycle-wake-requeue-not-terminal}), resuming on the
135
135
  next prompt or wake with its log intact. Only a client cancel, the loop deadline
136
136
  ({§operator-config-loop-timeout}), or a non-recoverable provider Problem (refusal,
137
137
  authorization, quota, an invalid response) settles a loop on a provider failure.
@@ -392,7 +392,7 @@ file or ancestry-authorized entry through ordinary dispatch ({§worker-read-scop
392
392
  | Door | Carries | Wake behavior |
393
393
  | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
394
394
  | Environment | A direct child's durable activity to its parent, plus a successful mutation of the deliberately global `worker:///` commons to every worker. | Intermediate activity and commons never wake; a child's terminal disposition wakes its parent. |
395
- | Voice | A directed `loop.inject` or `## SEND0 (worker://name)` message. | An active worker folds it into its next turn; an idle one wakes. |
395
+ | Voice | A directed `loop.inject` or `### SEND0 (worker://name)` message. | An active worker folds it into its next turn; an idle one wakes. |
396
396
 
397
397
  §actor-boundary-lineage-attention **Addressability is workspace-wide; attention
398
398
  is lineage-scoped.** Project files, registered resources, and permitted worker
@@ -458,16 +458,16 @@ neither a hidden database write nor a kernel-owned mirror.
458
458
  §actor-boundary-catalog-preview **Catalog preview.** `PLURNK_SERVICE_FILES_ITEMS`
459
459
  foists turn-0 discovery into the worker's first turn, so a worker opens with a
460
460
  navigable map instead of blank. An enabled preview executes exactly eight baseline
461
- bodyless FIND surveys in order: Agent Skills (`## FIND0
461
+ bodyless FIND surveys in order: Agent Skills (`### FIND0
462
462
  [+init,+skills] (worker://~/_plurnk/skills/*.md) <1,-1>`), plurnk references — the
463
- executors, schemes, and family managers (`## FIND0 [+init,+plurnk]
464
- (worker://~/_plurnk/plurnk/*.md) <1,-1>`), enabled tools (`## FIND0 [+init,+tools]
465
- (worker://~/_plurnk/tools/*.md) <1,-1>`), enabled agents (`## FIND0 [+init,+agents]
463
+ executors, schemes, and family managers (`### FIND0 [+init,+plurnk]
464
+ (worker://~/_plurnk/plurnk/*.md) <1,-1>`), enabled tools (`### FIND0 [+init,+tools]
465
+ (worker://~/_plurnk/tools/*.md) <1,-1>`), enabled agents (`### FIND0 [+init,+agents]
466
466
  (worker://~/_plurnk/agents/*.md) <1,-1>`, {§a2a-agents-catalog}), enabled members
467
- (`## FIND0 [+init,+members] (worker://~/_plurnk/members/*.md) <1,-1>`,
468
- {§members-projection}), workspace files (`## FIND0 [+init] (*) <!-- workspace files -->`),
469
- workspace entries (`## FIND0 [+init] (worker:///*) <!-- workspace entries -->`), and
470
- private worker entries (`## FIND0 [+init] (worker://~/*) <!-- private worker entries -->`).
467
+ (`### FIND0 (worker://~/_plurnk/members/*.md) <1,-1>`,
468
+ {§members-projection}), workspace files (`### FIND0 (*) <!-- workspace files -->`),
469
+ workspace entries (`### FIND0 (worker:///*) <!-- workspace entries -->`), and
470
+ private worker entries (`### FIND0 (worker://~/*) <!-- private worker entries -->`).
471
471
  Only those three namespace surveys carry annotations because the bare targets do not
472
472
  name their surface; generated paths and classification tags already name every other
473
473
  survey. Naming `~` private prevents a worker from offering its own `~` address to
@@ -475,8 +475,8 @@ another worker.
475
475
  The word `skills` names Agent Skills and nothing else.
476
476
  The catalogs select every direct document independently of its authored body;
477
477
  ordinary READ supplies its examples and complete instructions on demand. Their
478
- log classifications make the opening discovery one `init` set while retaining
479
- `skills`, `tools`, or `agents` on the corresponding rows ({§log-item-tags}). A shallow
478
+ opening discovery is one `init` set, and the `skills`, `tools`, and `agents`
479
+ families are addressed by their generated paths. A shallow
480
480
  result renders direct entries normally and every deeper first-segment directory
481
481
  as an actionable `dir/**` summary with its recursive `items` and `tokens`;
482
482
  tool-family rows also carry the concise `{§scheme-catalog-summary}` that drives
@@ -491,7 +491,7 @@ direct-entry-plus-directory count; `-1` enables the ordinary markerless page;
491
491
  unset / `0` disables previews. `log://` is absent because the current worker's
492
492
  log already renders in present mode.
493
493
 
494
- §worker-initialization-entry **Model-worker initialization is a real `_plurnk` turn.** A model worker's first loop begins with one packetless `{ producer="_plurnk", kind="initialization" }` turn submitted through {§turn-ops-admission-path}. It preserves one OPEN exact `turnOps` item and dispatches the same source into ordinary PLAN, one archiving COPY, orienting READ/FIND, and terminal `SEND0 [102]` rows (authored in their {§op-mode-phases} execution order). Every orienting row is structurally classified `_plurnk` and `init`; the archiving `COPY (prompt:///<loop>/1)` onto `worker://~/prompts.md <-1>` is classified `_plurnk` and `backup` — the worked COPY specimen, showing the private space as scratch, emitted whenever the loop publishes a prompt ({§prompt-entry}). The PLAN is the canonical {§plan-value} with two entries in order: `Persist Determinations and Decisions` is `memory`, then `Discover the tooling available and survey the workspace file root.` is `in_progress`; SEND hands off with `Next: Address the prompt.` The first model request occupies the following turn and therefore begins at database/log turn sequence 2; “turn zero” is the initialization phase's model-facing label, not a zero-based database coordinate. Client and `_plurnk` administrative workers execute operation turns and do not receive model initialization.
494
+ §worker-initialization-entry **Model-worker initialization is a real `_plurnk` turn.** A model worker's first loop begins with one packetless `{ producer="_plurnk", kind="initialization" }` turn submitted through {§turn-ops-admission-path}. It preserves one visible exact `turnOps` item and dispatches the same source into ordinary PLAN, one archiving COPY, orienting READ/FIND, and terminal `SEND0 (NEXT)` rows (authored in their {§op-mode-phases} execution order). Every orienting row is structurally classified `_plurnk` and `init`; the archiving `COPY (prompt:///<loop>/1)` onto `worker://~/prompts.md <-1>` is classified `_plurnk` and `backup` — the worked COPY specimen, showing the private space as scratch, emitted whenever the loop publishes a prompt ({§prompt-entry}). The PLAN is the canonical {§plan-value} with two entries in order: the `memory` entry reads "Determinations and Decisions must be persisted as `memory` items.", then `Discover the tooling available and survey the workspace file root.` is `in_progress`; SEND hands off with `Next: Address the prompt.` The first model request occupies the following turn and therefore begins at database/log turn sequence 2; “turn zero” is the initialization phase's model-facing label, not a zero-based database coordinate. Client and `_plurnk` administrative workers execute operation turns and do not receive model initialization.
495
495
 
496
496
  ### §machine-processes The machine and its processes: workspace, worker, fork
497
497
 
@@ -534,7 +534,7 @@ terminal history.**
534
534
 
535
535
  §machine-processes-worker-is-its-log **A worker's conversational memory of
536
536
  the shared world is its log, with no hidden per-worker snapshot beside it.**
537
- OPEN/FOLD changes canonical folded body intervals on that worker's rows ({§open-fold});
537
+ A scoped KILL folds canonical body intervals on that worker's rows ({§log-kill-scope});
538
538
  lineage activity and explicit commons broadcasts arrive as attributed log
539
539
  entries ({§env-delta}). Worker-owned entries include deliberate scratch and
540
540
  other private resources; their manifest declares whether a FORK snapshots,
@@ -594,7 +594,7 @@ continues to decompose other authorities without treating them as mintable.
594
594
 
595
595
  §worker-write-scoping **Writes are own-space-and-commons only**: a model writes `worker://~/` and `worker:///` — every ancestry-readable named authority is read-only to it (403), while an unreadable name remains 404 under {§worker-read-scope}. `owner_id` is engine-stamped from the dispatch context, never model-set. Nothing worker-authored can land under another principal. The entry-copy seam (COPY/MOVE) is pathname-keyed and addresses the commons; a space's content moves via READ + EDIT. The one exception inside a writable space is the generated subtree below.
596
596
 
597
- §worker-generated-subtree **`_plurnk/` is Plurnk's generated subtree in every worker space.** Every Plurnk-generated per-Worker document lives under `worker://~/_plurnk/`: the project instructions (`_plurnk/agents.md`, with nested AGENTS.md files under `_plurnk/instructions/**` preserving their subtree paths — the standard's closest-file scope, materialized without any foisted READ or teaching), standard Agent Skills and Plurnk-generated references (`_plurnk/skills/**`), executable families (`_plurnk/tools/**`), and future family catalogs. The subtree is readable exactly like the rest of the space ({§worker-read-scope}) and writable only by the `_plurnk` writer tier: a model, client, or plugin EDIT, KILL, SEND 410, or COPY/MOVE destination whose pathname begins `/_plurnk/` is refused 403 `worker-generated-read-only`, in the commons as well as in own and named spaces. Its documents are materialized through ordinary `_plurnk` **maintenance** turns ({§actor-boundary-doc-injection}), so provenance is legible at the address and durable in the log — but a receipt answers an asker, and maintenance turns have none: their successful rows never render in the packet (failures remain visible), while READ over `log:///` recovers them exactly and the turn's self-FOLD keeps client waterfalls tidy. On FORK the subtree is never byte-copied; the child rederives it from its inherited Functionality ({§machine-processes-entry-inheritance}). A runtime's `resourcesPath` is relative to this root ({§tools-resource-materialization}). No world-readable kernel authority exists; there is no `worker://plurnk/`.
597
+ §worker-generated-subtree **`_plurnk/` is Plurnk's generated subtree in every worker space.** Every Plurnk-generated per-Worker document lives under `worker://~/_plurnk/`: the project instructions (`_plurnk/agents.md`, with nested AGENTS.md files under `_plurnk/instructions/**` preserving their subtree paths — the standard's closest-file scope, materialized without any foisted READ or teaching), standard Agent Skills and Plurnk-generated references (`_plurnk/skills/**`), executable families (`_plurnk/tools/**`), and future family catalogs. The subtree is readable exactly like the rest of the space ({§worker-read-scope}) and writable only by the `_plurnk` writer tier: a model, client, or plugin EDIT, KILL, SEND 410, or COPY/MOVE destination whose pathname begins `/_plurnk/` is refused 403 `worker-generated-read-only`, in the commons as well as in own and named spaces. Its documents are materialized through ordinary `_plurnk` **maintenance** turns ({§actor-boundary-doc-injection}), so provenance is legible at the address and durable in the log — but a receipt answers an asker, and maintenance turns have none: their successful rows never render in the packet (failures remain visible), while READ over `log:///` recovers them exactly and the turn's self-curation keeps client waterfalls tidy. On FORK the subtree is never byte-copied; the child rederives it from its inherited Functionality ({§machine-processes-entry-inheritance}). A runtime's `resourcesPath` is relative to this root ({§tools-resource-materialization}). No world-readable kernel authority exists; there is no `worker://plurnk/`.
598
598
 
599
599
  §worker-control-addressing **Only an exact authority-only address selects worker
600
600
  control.** Control is same-workspace only ({§actor-boundary}). Generic URI
@@ -622,9 +622,9 @@ literal `workers.name` value.
622
622
  | `READ` | existing literal name | Collect the named worker's deliverable. |
623
623
  | `KILL` | existing literal name, `~` | Terminate the named worker or caller. |
624
624
 
625
- - §worker-scheme-spawn **Spawn** — `## WORK0 (worker://<name>)` with a task body creates a new worker sister (empty log) and starts it with that task on its first loop. WORK/FORK are the worker-creation verbs: EDIT is file/entry only, so EDIT on the bare worker entity is a **400** steering to WORK/FORK — the entity is not an entry. A name is **frozen per worker** but **reclaimable across time** ({§machine-processes-worker-origin}): a name held only by a *terminated* sister is free to reuse — a fresh spawn takes a new row and `worker_resolve_by_name` resolves the newest, the corpse keeping its name in permanent history. A name a *live* sister still holds is a conflict — **409 `worker '<name>' is already running`**, legible at the spawn gate, never a raw store-level uniqueness error.
626
- - §worker-scheme-irc **irc** — `## SEND0 (worker://<name>)` with a message body delivers it to an existing sister, the **voice door** ({§actor-boundary-two-doors}): an active sister folds it into its next turn, an idle one wakes ({§actor-boundary-passive-wake}). A fresh receiving loop retains that worker's durable model, spawn override, and reasoning policy; the sender and daemon default do not re-select it. `## SEND0 (worker://~)` targets the caller; a literal name with no worker in the workspace is 404.
627
- - §worker-scheme-fork **Fork** — `## FORK0 (worker://<name>)` with a task body branches the
625
+ - §worker-scheme-spawn **Spawn** — `### WORK0 (worker://<name>)` with a task body creates a new worker sister (empty log) and starts it with that task on its first loop. WORK/FORK are the worker-creation verbs: EDIT is file/entry only, so EDIT on the bare worker entity is a **400** steering to WORK/FORK — the entity is not an entry. A name is **frozen per worker** but **reclaimable across time** ({§machine-processes-worker-origin}): a name held only by a *terminated* sister is free to reuse — a fresh spawn takes a new row and `worker_resolve_by_name` resolves the newest, the corpse keeping its name in permanent history. A name a *live* sister still holds is a conflict — **409 `worker '<name>' is already running`**, legible at the spawn gate, never a raw store-level uniqueness error.
626
+ - §worker-scheme-irc **irc** — `### SEND0 (worker://<name>)` with a message body delivers it to an existing sister, the **voice door** ({§actor-boundary-two-doors}): an active sister folds it into its next turn, an idle one wakes ({§actor-boundary-passive-wake}). A fresh receiving loop retains that worker's durable model, spawn override, and reasoning policy; the sender and daemon default do not re-select it. `### SEND0 (worker://~)` targets the caller; a literal name with no worker in the workspace is 404.
627
+ - §worker-scheme-fork **Fork** — `### FORK0 (worker://<name>)` with a task body branches the
628
628
  current worker into a **named** sister: its log is deep-copied
629
629
  ({§machine-processes-fork-copies-the-log}), which continues with `task`; the
630
630
  world is shared, never copied ({§machine-processes-fork-shares-the-world}).
@@ -639,18 +639,16 @@ literal `workers.name` value.
639
639
  parent's private entries — its own space deep-copied with the owner
640
640
  remapped (source → branch) — so the branch opens with the parent's notes and
641
641
  diverges on its own edits: *fork = everything-in-common-but-name*.
642
- - §worker-spawn-no-signal **WORK and FORK take no signal.** Branch delegation was
643
- removed outright (#396): a signalled spawn refuses on its own row as
644
- `400 worker-signal-invalid`, naming the signal-less form. A model manages git
645
- branches through ordinary EXEC git, taught by the git skill — never engine
646
- machinery. No batch, branch, or child comes into being from a signalled spawn.
642
+ - §worker-spawn-no-branch **WORK and FORK take a worker path and a prompt, nothing else.** Branch
643
+ delegation was removed outright (#396). A model manages git branches through ordinary
644
+ EXEC git, taught by the git skill never engine machinery.
647
645
  - §worker-delegation-inherits-policy **Delegation cannot widen authority.** WORK and FORK copy the delegating actor's complete effective capability policy into the child's immutable `capability_bound`; later widening of any parent layer cannot enlarge that child. Every fresh delegated loop carries that complete effective attenuation and the delegating loop's proposal disposition, including a loop created by SEND to an idle Worker. SEND into an active or parked loop leaves that loop's immutable policy untouched. The bound is delegation authority captured by value, not a client binding or a live parent-policy link.
648
646
  - §worker-lifecycle-wake-requeue-not-terminal **A wake re-queue is not a terminal.** A conclusion-wake resumes a 202-blocked loop by re-queueing it (202 → 100); when that lands while the loop's own live drain is between turns, the drain **re-claims and continues** (atomic 100 → 102; the injected prompt is already the next turn). The internal re-queue is never reported as an outward terminal.
649
647
 
650
648
  - §worker-scheme-collect **Collect** — a worker's loop reaching a terminal status
651
649
  surfaces to its direct parent as an ambient delta ({§env-delta}): a `SEND` from
652
650
  `worker://<name>` carrying the loop's exact terminal operation result. A
653
- **2xx deliverable is born OPEN** (its body
651
+ **2xx deliverable is born visible** (its body
654
652
  materialized into the parent's packet, not hidden behind a fold): a child's
655
653
  success must reach the parent open and awakening, never a bodyless row. An
656
654
  non-2xx result surfaces folded; a failure retains its exact status and Problem. Every death-path is stamped uniformly —
@@ -658,7 +656,7 @@ machinery. No batch, branch, or child comes into being from a signalled spawn.
658
656
  silent to its owner; collection is lineage
659
657
  supervision, never a
660
658
  verb. The **pull** side mirrors the push: a path-absent
661
- `## READ0 (worker://<name>)` collects that same result on demand for a
659
+ `### READ0 (worker://<name>)` collects that same result on demand for a
662
660
  concluded worker; a worker **still running** has not delivered, so the READ
663
661
  returns **425** (Too Early) and the turn's bare SEND signal `102` **becomes a
664
662
  parked loop (202) on the join** ({§join-blocking-collect}) until the worker
@@ -668,22 +666,22 @@ machinery. No batch, branch, or child comes into being from a signalled spawn.
668
666
  - §child-orientation **Child orientation.** Beyond the conclusion delta, every
669
667
  turn the packet's status clump surfaces the live things this worker currently
670
668
  holds — open streams (`## Child Streams`) and unconcluded child workers
671
- (`## Active Child Workers`) — as terse `* <status> <path>` pointers (the same
669
+ (`## Active Child Workers`) — as `{status, path}` JSON pointers (the same
672
670
  shape as the errors section), just above it. Folded child activity is durable
673
671
  history; this clump is the current inventory that keeps an active obligation
674
672
  visible even when no new activity arrived. Each open stream pointer carries
675
673
  its channels' sizes and growth since the last packet (`* active
676
- sh:///1/2/3 — stdout 340 lines (+2048 bytes)`) — the only thing the model
674
+ sh:///1/2/3/EXEC — stdout 340 lines (+2048 bytes)`) — the only thing the model
677
675
  learns about a stream before it closes ({§exec-stream}). It is orienting state, never
678
676
  advice: the model sees its live subtree (`* 102 worker://worker-x`, `* active
679
- sh:///1/2/3`) and reasons for itself — READ/OPEN/KILL via the path.
677
+ sh:///1/2/3/EXEC`) and reasons for itself — READ/KILL via the path.
680
678
  Empty sections are omitted, like errors.
681
679
 
682
680
  Worker control rides the daemon's inject seam (active→fold, idle→enqueue+drain), so the handler creates/branches the worker and hands off; the daemon owns provider + system prompt. FORK/WORK carry the seed task in the body and are their own ops, dispatched to worker control — never the entry-copy path.
683
681
 
684
682
  ### §worker-loop-lifecycle Worker and loop lifecycle: drain, reap, and passive wake
685
683
 
686
- - §join-blocking-collect **A `READ` on a running child is a blocking join, not a poll.** A path-absent `## READ0 (worker://<running-child>)` returns **425** (Too Early) and records a live obligation on the loop. The turn's bare SEND signal `102` is converted into an indefinite parked loop (202) instead of asking the model to poll or drive the scheduler. When the child reaches any terminal status, the same loop resumes with the result in its log. Children are bounded by their own turn and strike limits, terminal failure also wakes the parent, and the owed-wake path covers completion before the parent parks. Any `SEND` clears the per-turn arm; SEND signal `200` with a live child remains a premature-termination error. A `<seconds>` timeout-poll is the explicit polling alternative.
684
+ - §join-blocking-collect **A `READ` on a running child is a blocking join, not a poll.** A path-absent `### READ0 (worker://<running-child>)` returns **425** (Too Early) and records a live obligation on the loop. The turn's bare SEND signal `102` is converted into an indefinite parked loop (202) instead of asking the model to poll or drive the scheduler. When the child reaches any terminal status, the same loop resumes with the result in its log. Children are bounded by their own turn and strike limits, terminal failure also wakes the parent, and the owed-wake path covers completion before the parent parks. Any `SEND` clears the per-turn arm; SEND signal `200` with a live child remains a premature-termination error. A `<seconds>` timeout-poll is the explicit polling alternative.
687
685
 
688
686
  A worker is a **log plus a cancellation scope** — one `AbortController` per worker, reused while live and replaced only once aborted, so a cancel ends the worker as a unit and a later `runLoop` request is never born cancelled. A worker's queued loops are advanced by a **drain**: a single per-worker drain that claims loops atomically (status 100→102) and runs each under the worker's scope. A loop may spawn **streams** (execs) that outlive it; each is a row in the subscription registry ({§subscriptions}) — the durable record of what the worker holds open. Cancellation and conclusion are defined against these structures, never wall-clock timing.
689
687
 
@@ -816,7 +814,7 @@ observe their terminal results. No effect is replayed across an unknown
816
814
  boundary.
817
815
 
818
816
  - §worker-lifecycle-single-drain **One drain advances a worker.** At most one drain is registered for a worker at any instant: a `runLoop` request or wake on a worker with a live drain folds in (active→next-turn) or enqueues a loop that drain claims, never a second parallel drain. A drain's start and its empty-queue teardown relinquish the worker under one per-worker lock, so the teardown's re-claim cannot race a concurrent start into a double-drain. Fresh-loop sequence allocation and insertion are one mutation under that same lock; concurrent accepted prompts remain distinct ordered queue items.
819
- - §worker-lifecycle-total-reap **Cancellation is recursive and reaps every held stream.** `loop.cancel`, worker `KILL`, shutdown, and a worker's SEND signal `499` terminalize every unresolved loop in the cancelled worker subtree and iterate each worker's durable open-subscription rows, invoking each exact callable owner from the process-local live registry. The durable rows answer *what is held*; the live registry answers *how this process tears it down*; the abort signal is a fast-path optimization. There is no implicit detachment. Before shutdown awaits drains, it cancels every process-local proposal waiter through {§proposal-cancel-aborts} with outcome `daemon_stopping`, so a stopped-world dispatch cannot hold teardown open. A stream that is running, mid-spawn (its row written before it is killable), or spawned after the cancel is reaped alike. The teardown abort is bounded: the executor sends a polite signal then SIGKILL after a consumer-set grace (`PLURNK_SERVICE_EXEC_KILL_GRACE_MS`). A model `## KILL0 [code]` on one live stream instead delivers exactly that signal once (bare KILL uses the executor's SIGHUP default; `## KILL0 [9]` uses SIGKILL).
817
+ - §worker-lifecycle-total-reap **Cancellation is recursive and reaps every held stream.** `loop.cancel`, worker `KILL`, shutdown, and a worker's SEND signal `499` terminalize every unresolved loop in the cancelled worker subtree and iterate each worker's durable open-subscription rows, invoking each exact callable owner from the process-local live registry. The durable rows answer *what is held*; the live registry answers *how this process tears it down*; the abort signal is a fast-path optimization. There is no implicit detachment. Before shutdown awaits drains, it cancels every process-local proposal waiter through {§proposal-cancel-aborts} with outcome `daemon_stopping`, so a stopped-world dispatch cannot hold teardown open. A stream that is running, mid-spawn (its row written before it is killable), or spawned after the cancel is reaped alike. The teardown abort is bounded: the executor sends a polite signal then SIGKILL after a consumer-set grace (`PLURNK_SERVICE_EXEC_KILL_GRACE_MS`). A model `### KILL0 [code]` on one live stream instead delivers exactly that signal once (bare KILL uses the executor's SIGHUP default; `### KILL0 [9]` uses SIGKILL).
820
818
  - §worker-lifecycle-exec-epoch-bound **A stream's kill binds to the scope it captured at spawn.** A stream captures the worker's cancellation scope as it registers and wires its kill to it, re-checking `aborted` AFTER wiring — no check-then-listen gap can drop an abort that lands mid-registration. Because the scope is replaced only once aborted, a captured-then-replaced scope is necessarily already aborted, so replacement never strands a live stream.
821
819
  - §worker-lifecycle-no-resurrection **A cancelled worker is not resurrected by its own torn-down work.** A stream conclusion delivered to a cancelled, idle worker starts no fresh drain: an aborted (499) conclusion is skipped, and a straggler that concluded cleanly surfaces its deliverable as an environment delta ({§env-delta}), never a revived loop. The cancel was deliberate; only an explicit `runLoop` request resumes the worker.
822
820
  - §worker-lifecycle-wake-liveness **A stream conclusion always reaches its worker.** The stream first persists its terminal state. A worker **blocked on a 202 wait** for that stream ({§wait-obligation-matrix}) then **awakens that loop in place** — the blocked loop *is* the continuation, so there is no fresh loop and no summary-as-prompt fiction. An already-active worker needs no injected prompt or second wake because its next packet reads the durable terminal state. A concluded worker receives no synthetic loop from ambient stream closure. The result remains available in the stream's own state under every case.
@@ -875,13 +873,13 @@ latest context gauge.
875
873
 
876
874
  ### §emission-admission Provider emission admission
877
875
 
878
- A completed provider exchange is an **emission attempt**, not necessarily an engine turn. The provider transports and observes the model's bytes; ANTLR is the admission authority only after provider completion. Admission requires at least one parsed source operation, no `unparsedTail`, and a trustworthy effective envelope. Canonical source begins with PLAN and ends with a terminal SEND. If no valid leading PLAN or terminal SEND was parsed, the parser supplies an empty PLAN or bodyless `SEND [102]`, records its exact hard diagnostic, and Core admits the useful operations instead of resampling. Both diagnostics participate in one ordinary struck turn, never one strike apiece. An authored PLAN or terminal SEND remains a real boundary, so an error outside either authored edge, post-terminal content, a boundary-destroying tail, or no source operation rejects the entire exchange regardless of `finishReason`; no recovered prefix dispatches. Parser warnings remain admissible. `finish=length` is forensic evidence of likely truncation, not an independent rejection rule. A provider-declared resource interruption never reaches admission, even when its partial bytes form a complete-looking frame ({§provider-interrupted-attempt}). The accepted packet retains the provider's source bytes exactly in response evidence and `turnOps`; synthetic envelope statements exist only in the normalized operation program and its durable rows.
876
+ A completed provider exchange is an **emission attempt**, not necessarily an engine turn. The provider transports and observes the model's bytes; ANTLR is the admission authority only after provider completion. Admission requires at least one parsed source operation, no `unparsedTail`, and a trustworthy effective envelope. Canonical source begins with PLAN and ends with a terminal SEND. If no valid leading PLAN or terminal SEND was parsed, the parser supplies a bodyless `### SEND0 (NEXT)`, records its exact hard diagnostic, and Core admits the useful operations instead of resampling. Both diagnostics participate in one ordinary struck turn, never one strike apiece. An authored PLAN or terminal SEND remains a real boundary, so an error outside either authored edge, post-terminal content, a boundary-destroying tail, or no source operation rejects the entire exchange regardless of `finishReason`; no recovered prefix dispatches. Parser warnings remain admissible. `finish=length` is forensic evidence of likely truncation, not an independent rejection rule. A provider-declared resource interruption never reaches admission, even when its partial bytes form a complete-looking frame ({§provider-interrupted-attempt}). The accepted packet retains the provider's source bytes exactly in response evidence and `turnOps`; synthetic envelope statements exist only in the normalized operation program and its durable rows.
879
877
 
880
- §safe-uri-target-groups After source and authored-command admission, Core tolerates one target group on READ, FOLD, OPEN, or KILL only when splitting its raw target at top-level comma or whitespace separators produces at least two members and every member independently parses as an explicit `scheme://` URI. Request-metadata blocks are opaque to this split. Each member becomes one ordinary statement with an independent dispatch outcome and log row, in authored member order; scheduling may still move the complete operation class under {§op-mode-phases}. Otherwise the target remains exactly singular, including local filenames containing spaces or commas. The stored `turnOps` and authored command count remain unexpanded, and no other operation admits target groups.
878
+ §safe-uri-target-groups After source and authored-command admission, Core tolerates one target group on READ or KILL only when splitting its raw target at top-level comma or whitespace separators produces at least two members and every member independently parses as an explicit `scheme://` URI. Request-metadata blocks are opaque to this split. Each member becomes one ordinary statement with an independent dispatch outcome and log row, in authored member order; scheduling may still move the complete operation class under {§op-mode-phases}. Otherwise the target remains exactly singular, including local filenames containing spaces or commas. The stored `turnOps` and authored command count remain unexpanded, and no other operation admits target groups.
881
879
 
882
880
  Core retries a rejected emission against the exact same packet beneath the same engine turn, up to `PLURNK_SERVICE_EMISSION_ATTEMPTS`. Rejected bytes never dispatch or reach the engine strike rail. Before each `generate`, Core opens one durable logical `inference_calls` row with its `model_calls` specialization and emission-specific `turn_attempts` admission row. A call that ends without response evidence leaves that admission row unclassified (`accepted IS NULL`) and does not consume the emission-attempt ceiling. Beneath the logical call, every provider observer invocation opens one cardinal `provider_requests` occurrence immediately before physical I/O and settles it as response or error. Adapter retries and capacity failover append requests in issue order; a response-less failure therefore remains an accounted occurrence rather than disappearing. Normalized response evidence is durable before parser classification and does not duplicate the separately owned accounting. The accepted exchange alone extends `turns.packet` with response evidence; every physical request remains in turn and loop accounting, while the context gauge reads the latest settled emission request on the latest turn. Digest exposes rejected response evidence as `packetNNN.attemptNNN.rejected.*` and every physical request in its machine-readable ledger.
883
881
 
884
- The first exhaustion in a consecutive sequence closes that unadmitted turn as a continue and opens exactly one ordinary recovery turn. Its packet projects the latest rejected response OPEN from a durably FOLDED emission-attempt item under {§rejected-emission-entry} and carries one transient `invalid_emission` Notice: `Response rejected before dispatch; no operations were performed.` followed by `Parser: <the latest attempt's first diagnostic>` with its `content-offset` position — the model sees why, at which line, against its own projected text. The Notice states only observed admission facts; it does not classify the response as unrecoverable, infer why generation ended, or prescribe intent beyond the parser-owned diagnostic. Attempt count and rail state never become model-facing. The recovery turn has its own honestly stored packet and its configured private same-packet attempts. The packet-local projection never changes the row's curation state, so no later packet repeats the malformed body unless the model explicitly OPENs it. Admission clears the recovery state; exhausting the informed turn terminates instead of opening another.
882
+ The first exhaustion in a consecutive sequence closes that unadmitted turn as a continue and opens exactly one ordinary recovery turn. Its packet projects the latest rejected response visibly from a durably folded emission-attempt item under {§rejected-emission-entry} and carries one transient `invalid_emission` Notice: `Response rejected before dispatch; no operations were performed.` followed by `Parser: <the latest attempt's first diagnostic>` with its `content-offset` position — the model sees why, at which line, against its own projected text. The Notice states only observed admission facts; it does not classify the response as unrecoverable, infer why generation ended, or prescribe intent beyond the parser-owned diagnostic. Attempt count and rail state never become model-facing. The recovery turn has its own honestly stored packet and its configured private same-packet attempts. The packet-local projection never changes the row's curation state, so no later packet repeats the malformed body unless the model explicitly OPENs it. Admission clears the recovery state; exhausting the informed turn terminates instead of opening another.
885
883
 
886
884
  An admitted program may contain bounded malformed statements or recovered
887
885
  envelope defaults. Parsed operations still dispatch; each hard parser diagnostic
@@ -1137,6 +1135,8 @@ Every fact names the canonical key, never the host root or an echo of the
1137
1135
  model's spelling. These classes let a caller distinguish a wrong address, an
1138
1136
  invalid range, read-only authority, and occupied hidden state without guessing.
1139
1137
 
1138
+ §membership-read-refusal **A READ miss that is really a non-member is refused, not denied.** An exact-path READ of an in-root path that exists on disk but is not a member returns 404 `entry-not-member` — `'<key>' exists on disk but is not a member of this workspace.` — with a recovery naming the door (`### EXEC0 [members] (add)` with a `{"glob": "<path>"}` body); it never claims absence. Occupancy surfaces, content does not ({§membership}).
1139
+
1140
1140
  §fs-world-state **The world-state harness — coverage that closes the class.** Op-outcome tests check what an op returned; the harness checks the resulting world. `WorldState.check(db)` asserts, pure-db and read-only: identity uniqueness in practice (no tuple holds two rows), the canonical fixpoint on every file-class key, channel orphan-freedom, the closed admission set (every file row's origin is Git or constraint), and sig-coherence. Generated-pick incorporation and lifecycle require filesystem/Git evidence and are covered by the composed creation matrix rather than a false pure-database proxy. The harness runs as a lifecycle-test epilogue and at every soak turn boundary, where the delta half applies: an idle turn grows the entries table by ZERO. A violation names its law and its row.
1141
1141
 
1142
1142
  ### §scheme-manifest Manifest
@@ -1156,7 +1156,7 @@ There is no fictional cross-scheme SQL transaction.
1156
1156
  §op-methods-op-dispatch Engine operation ownership follows the public scheme contract:
1157
1157
 
1158
1158
  - EDIT resource batches dispatch through `editBatch`.
1159
- - OPEN and FOLD dispatch only to the core-owned log curation handler ({§open-fold}); defining same-named methods cannot extend an entry scheme.
1159
+ - A log KILL dispatches only to the core-owned log curation handler ({§log-kill-scope}); an entry scheme's `kill` method never sees a `log:///` target.
1160
1160
  - Other delegated operations use the corresponding lowercase `SchemeHandler` method, with standard FIND supplied for a data scheme that omits a custom implementation.
1161
1161
  - COPY and MOVE are engine-owned compositions over CRUD primitives ({§copy}/{§move}).
1162
1162
 
@@ -1168,9 +1168,9 @@ Registration precedes loop affinity:
1168
1168
  | Registered but inactive under flag | The flag gate returns `403 scheme-unavailable`. |
1169
1169
  | Registered and active | Dispatch continues to the operation owner. |
1170
1170
 
1171
- - §op-mode-phases **A continuing turn executes in MODE phases.** A model turn describes intended effects and requested observations; it is not an imperative program whose later statements can consume invisible same-turn results. The engine therefore performs four stable phases: **Mutate** (`EDIT`, `COPY`, `MOVE`, `KILL`, `FOLD`), **Observe** (`FIND`, `READ`, `OPEN`, `BARE`), **Do** (all remaining non-terminal actions, including `EXEC`, `WORK`, `FORK`, and directed `SEND`), then **End** (the terminal `SEND`). `PLAN` remains the turn anchor and is recorded before those phases. Authored order is preserved within each phase. A result still lands in the next packet; phasing makes that result describe settled state instead of an accidental intermediate state.
1171
+ - §op-mode-phases **A continuing turn executes in MODE phases.** A model turn describes intended effects and requested observations; it is not an imperative program whose later statements can consume invisible same-turn results. The engine therefore performs four stable phases: **Mutate** (`EDIT`, `COPY`, `MOVE`, `KILL`), **Observe** (`FIND`, `READ`, `BARE`), **Do** (all remaining non-terminal actions, including `EXEC`, `WORK`, `FORK`, and directed `SEND`), then **End** (the terminal `SEND`). `PLAN` remains the turn anchor and is recorded before those phases. Authored order is preserved within each phase. A result still lands in the next packet; phasing makes that result describe settled state instead of an accidental intermediate state.
1172
1172
 
1173
- §bare-inference **BARE is isolated, synchronous retrieval over the durable child-provider policy.** Its body is the complete prompt and becomes the sole user message; Core supplies no PLURNK system packet, log context, tools, GBNF, parser, target, worker, or persistent child state. The selected provider is exactly the loop's WORK/FORK child provider, falling back to the parent provider when the durable policy is inherit. All BARE statements in one admitted turn receive logical model-call identities in authored order and launch concurrently under the loop cancellation signal. Core awaits the batch, isolates a provider failure to that operation, then records results and notifications in authored order regardless of completion order. Accounting or persistence failure is internal and fails hard. Each response is unseen retrieval work: the canonical disposition is `SEND[102]`, and same-turn `SEND[200]` is refused until the next packet presents it.
1173
+ §bare-inference **BARE is isolated, synchronous retrieval over the durable child-provider policy.** Its body is the complete prompt and becomes the sole user message; Core supplies no PLURNK system packet, log context, tools, GBNF, parser, target, worker, or persistent child state. The selected provider is exactly the loop's WORK/FORK child provider, falling back to the parent provider when the durable policy is inherit. All BARE statements in one admitted turn receive logical model-call identities in authored order and launch concurrently under the loop cancellation signal. Core awaits the batch, isolates a provider failure to that operation, then records results and notifications in authored order regardless of completion order. Accounting or persistence failure is internal and fails hard. Each response is unseen retrieval work: the canonical label is `### SEND0 (NEXT)`, and a same-turn `(TERM)` is refused until the next packet presents it.
1174
1174
 
1175
1175
  - §op-synchronous **Decisive operations settle before the next scheduled operation.** The dispatcher `await`s every decisive operation. Work remains in flight only when the operation's contract deliberately creates concurrency: `FORK`, `WORK`, stream-producing `EXEC`, and a streaming `READ` after its scheme-specific acquisition boundary. Such a READ first establishes its durable subscription, returns `102`, and then retains only its `StreamSubscription`; a later scheduled operation may address that live owner. MODE changes scheduling, not completion semantics. This is why a same-turn KILL followed by SEND signal `200` concludes ({§send-premature-terminate}): KILL synchronously flips the worker's live loops terminal (`engine_terminate_worker_live_loops`) before the End phase judges the pending set, while the physical scope reap rides `cancelWorker` asynchronously and invisibly.
1176
1176
 
@@ -1204,23 +1204,21 @@ snapshot. Cross-resource MOVE is ordered destination-then-source and cannot be
1204
1204
  globally atomic; if source removal fails after destination success, its Problem
1205
1205
  Details state `destinationWritten: true` and identify the destination.
1206
1206
 
1207
- ### §send-dispatch SEND dispatch (status-code-as-verb)
1208
-
1209
- Directed SEND (non-null path) routes to scheme's `send`. Status = intent:
1207
+ ### §send-dispatch SEND dispatch (a message to a recipient)
1210
1208
 
1211
- - `## SEND0 [200] (path)` — write body into resource (WS message, exec stdin).
1212
- - `## SEND0 [499] (path)`cancel active subscription ({§stream}).
1209
+ A recipient SEND (non-null path, `status` null {§send-label}) routes to the scheme's
1210
+ `send`: the body is the message a WebSocket frame, exec stdin, an HTTP POST, an A2A
1211
+ message, a worker's next prompt. A label SEND never reaches a scheme: it concludes the
1212
+ turn ({§send}). Cancelling a stream and deleting an entry are KILL ({§stream}, {§move}).
1213
1213
 
1214
- - §log-uniform-query **Log speaks the universal query contract** — `## FIND0 (log://…)` works like every scheme's FIND. Candidates are worker rows scoped by the coordinate hierarchy ({§log-coordinate-hierarchy}) and projected exactly as READ shows them. Content dialects use `Matcher.matchCandidates`; `~semantic` and `&graph` use the same persistent derivation artifacts and candidate rankers as entries. Broad results are one-channel catalog groups whose `[0].path` is `log:///loop/turn/seq/OP`; exact matcher results are flat locations ({§find-result-projection}). A FIND signal classifies the FIND result row and never changes this candidate set ({§log-item-tags}). Log remains the core event ledger rather than duplicating rows into `entries`; its core-private storage adapter supplies one complete channel representation to the same READ projector. That adapter is not a plugin seam and grants no protocol scheme an alternate READ path.
1214
+ - §log-uniform-query **Log speaks the universal query contract** — `### FIND0 (log://…)` works like every scheme's FIND. Candidates are worker rows scoped by the coordinate hierarchy ({§log-coordinate-hierarchy}) and projected exactly as READ shows them. Content dialects use `Matcher.matchCandidates`; `~semantic` and `&graph` use the same persistent derivation artifacts and candidate rankers as entries. Broad results are one-channel catalog groups whose `[0].path` is `log:///loop/turn/seq/OP`; exact matcher results are flat locations ({§find-result-projection}). Log remains the core event ledger rather than duplicating rows into `entries`; its core-private storage adapter supplies one complete channel representation to the same READ projector. That adapter is not a plugin seam and grants no protocol scheme an alternate READ path.
1215
1215
  - §find-source-agnostic **The content matcher is source-agnostic** — `Matcher.matchCandidates(body, candidates, mimetypes)` applies a content matcher (regex/jsonpath/xpath/glob) to candidates from ANY source, keyed by the caller's own identity (a pathname for entries, a `loop/turn/seq` coordinate for log). The matcher never cares what table the content came from, so FIND works uniformly across schemes by construction: `EntryFind` and `Log.find` run the one shared primitive rather than re-implementing it per scheme. Log stays its own event stream, but its rows are candidates the shared matcher covers like any entry's content.
1216
1216
  - §find-candidate-containment **One candidate's crash is that candidate's problem** — arbitrary member content can crash a mimetype handler mid-match (an unbalanced template partial crashed Readability and killed a 1,916-file FIND as a blank 500, #449). `Matcher.matchCandidates` contains a per-candidate handler throw: the candidate drops out exactly like unsupported content, the cause goes to daemon stderr, and only a FIND whose every candidate crashed reports a 415 whose Problem names the first crashing member and handler. The operation's other candidates always answer.
1217
1217
  - §channel-selection-visibility **Channel selection is decision-time information, not a guess** — every multi-channel resource presents its channels with extents wherever FIND presents the resource: broad results list each channel's path, mimetype, tokens, and lines (default channel first), and matcher locations name the channel their line coordinates address. The packet never presents channels as equal and indistinguishable; extents derive from the stored channels by construction. Budget enforcement stays with {§overflow-turn} — this is information, not a second guard.
1218
1218
 
1219
1219
  - §matcher-selection-signal **Matching carries navigation evidence** - a matcher is a boolean resource predicate. Internally, each selected resource carries `matches: MatchEvidence[]`, where `MatchEvidence` is `{channel?,locator?,region?}`; `channel` names the entry channel the finding was located in and is absent for channel-less resources such as log rows, so line coordinates cannot be mis-attributed across channels of the same resource ({§channel-selection-visibility}). `locator` preserves a structural address without overloading the resource row's `path`; `region` is a complete four-coordinate `TextRegion` only when the finding maps honestly into the exact text the model can READ. Exact duplicate evidence deduplicates. Relation findings map their indexed source spans through the same readable text coordinate index. FIND alone decides whether that grouped selection projects as resource rows or flat locations ({§find-result-projection}); the engine never fabricates a region or guesses which surgical READ the model wants.
1220
1220
 
1221
- `## SEND0 [410] (path[#fragment])` also deletes the target entry/channel — an implemented side-effect, NOT taught to the model and with no live/demo surface. The model-facing delete idiom is KILL ({§move}).
1222
-
1223
- §send-dispatch-entry-schemes-501-on-non-410 Other status codes return 501 from entry-bearing schemes by default.
1221
+ §send-dispatch-entry-schemes-501 An entry-bearing scheme carries no messages: a recipient SEND aimed at one returns 501.
1224
1222
 
1225
1223
  Null-path SEND is broadcast ({§send}), engine-handled.
1226
1224
 
@@ -1458,7 +1456,7 @@ A published default channel renders under the entry's ordinary fragmentless addr
1458
1456
 
1459
1457
  ### §no-visibility Entries carry no visibility
1460
1458
 
1461
- Every entry is uniformly listed in the catalog (`## FIND0 (scheme:///**)`, {§packet}) and READable — entries have no per-worker open/folded state. Context curation is the model's, on the **log** (via OPEN/FOLD, {§open-fold}), never on entries.
1459
+ Every entry is uniformly listed in the catalog (`### FIND0 (scheme:///**)`, {§packet}) and READable — entries have no per-worker open/folded state. Context curation is the model's, on the **log** (via KILL, {§log-kill-scope}), never on entries.
1462
1460
 
1463
1461
  ### §channel-mimetype Mimetype is a (scheme, channel) property — never a default
1464
1462
 
@@ -1480,8 +1478,8 @@ Rules:
1480
1478
  | URI | Channel |
1481
1479
  | ------------------------------------ | ------------------------------------ |
1482
1480
  | `worker:///france/capital` | body (default) |
1483
- | `sh:///1/1/2#stdout` | stdout |
1484
- | `sh:///1/1/2#stderr` | stderr |
1481
+ | `sh:///1/1/2/EXEC#stdout` | stdout |
1482
+ | `sh:///1/1/2/EXEC#stderr` | stderr |
1485
1483
  | `https://feed.example/y#body` | body |
1486
1484
  | `log:///N/T/A` | (no channel concept; atomic log row) |
1487
1485
 
@@ -1490,7 +1488,7 @@ Op implications:
1490
1488
  - EDIT to undeclared channel → 400; read-only channel → 405.
1491
1489
  - COPY/MOVE source and destination fragments independently select channels.
1492
1490
 
1493
- Client-interface target parameters carry fragments inline (`{ target: "sh:///1/1/2#stderr" }`).
1491
+ Client-interface target parameters carry fragments inline (`{ target: "sh:///1/1/2/EXEC#stderr" }`).
1494
1492
 
1495
1493
  **Wire rendering: default channel is path-only.** A rendered target omits `#channel` when channel matches `defaultChannel`. Single-channel entries render path-only; multi-channel entries render the default path-only and only non-default carries `#name`.
1496
1494
 
@@ -1562,7 +1560,7 @@ AST: `{ op: "EDIT", target, body: string | null, signal: tags | null, lineMarker
1562
1560
  - §edit-null-clears Writes the body; `body: null` clears it.
1563
1561
  - §edit-status-201-200 Returns `{ status: 201, entryId }` for a new entry and
1564
1562
  `{ status: 200, entryId }` for a content update.
1565
- - §edit-noop-304 A write that changes nothing — identical content — returns `{ status: 304, entryId }`, mirroring OPEN/FOLD's idempotence ({§open-fold}). Its terse detail states the observed equality and the valid empty-body deletion shape; it never presumes that repetition or retrieval is the intended recovery. The operation's log classification remains independent ({§log-item-tags}).
1563
+ - §edit-noop-304 A write that changes nothing — identical content — returns `{ status: 304, entryId }`, mirroring a scoped KILL's idempotence ({§log-kill-scope}). Its terse detail states the observed equality and the valid empty-body deletion shape; it never presumes that repetition or retrieval is the intended recovery.
1566
1564
  - §edit-marker-required-on-existing **A markerless EDIT is CREATE-ONLY — there is no easy-clobber path on an existing entry.** A `<L>` marker scopes an EDIT to a range; without one, the body becomes the entry's WHOLE content — legitimate and required for a fresh entry (nothing exists to scope into), but on an EXISTING entry a missing marker is refused **400**, never a silent full replace. A deliberate full rewrite states that intent explicitly: `<1,-1>` resolves through the ordinary marker math to the same whole-content replacement, so the capability is available but cannot be selected by omission.
1567
1565
  - §edit-line-anchors An anchored EDIT resolves under {§line-anchors} and carries
1568
1566
  its endpoint checks as a core-private mutation precondition. Otherwise-valid
@@ -1600,52 +1598,107 @@ selection or fan-out path.
1600
1598
 
1601
1599
  - §read-read-content Returns channel content and mimetype.
1602
1600
  - §read-read-404 Returns 404 when the channel is absent.
1601
+ - §read-content-wins A channel that delivered content reads as that content (200); the
1602
+ producer's failure projects onto the READ only when there is nothing to read, so a
1603
+ failed command's stdout and stderr stay readable.
1603
1604
  - §read-selection-projection READ applies `lineMarker` as text coordinates to one
1604
1605
  exact target under {§read-exact-target}. Markerless READ synthesizes
1605
1606
  `<1,16>`; `<1,-1>` explicitly selects all text. Successful positional reads
1606
1607
  carry the compact requested/returned extent and available total
1607
1608
  ({§range-extent}). Anchors resolve under {§line-anchors} before selection. An
1608
1609
  invalid text region is 416.
1609
-
1610
- §log-item-tags **Tags classify durable log items.** Under {§log-tag-signal}, FIND, READ, EDIT, COPY,
1611
- and MOVE strip any leading `+` from every signal term and add the resulting tag
1612
- to the one log row created for that operation. The row receives its complete
1613
- deduplicated set even when the operation fails or has no body; the signal never
1614
- filters candidates, changes a resource, or persists on an entry. OPEN and FOLD
1615
- use every unsigned signal term as an ALL-tags filter over existing log rows;
1616
- their optional target and matcher intersect that set. They then strip and add
1617
- each `+tag` and strip and remove each `-tag` on the exact selected rows while
1618
- applying the requested visibility. Signed terms never select: a curation
1619
- operation requires a target, matcher, or unsigned tag. Add and remove terms for
1620
- the same tag conflict. Successful visibility and classification changes land as
1621
- one curation event whose exact per-row deltas are durable. Engine policy may
1622
- apply its separately specified diagnostic classifications, such as `overflow`.
1623
- Every classification lives once in `log_tags`, remains forensic evidence when
1624
- KILL retires its row's projection, and is copied with log history on fork.
1610
+ - §read-bytes A binary channel with no readable projection, and the `#bytes` view of
1611
+ any resource whose scheme supplies bytes, reads as the source bytes one hexadecimal
1612
+ octet per line: coordinate = line = byte, so `<a,b>` selects bytes, the markerless
1613
+ default is the same `<1,16>`, `<1,-1>` is the whole resource, and the extent carries
1614
+ `unit: "byte"`. The result keeps the source mimetype and names `projection: "hex"`;
1615
+ anchors do not exist there (400). Bytes are read from the source at READ time, sized
1616
+ then windowed, never stored: `file:` supplies them from the member on disk, and a
1617
+ scheme that keeps no bytes answers 501 `bytes-unavailable` for `#bytes` and 415 for a
1618
+ binary channel, as before. An EXEC whose target is a file member already runs the
1619
+ bytes on disk.
1620
+ - §find-bytes A FIND over a binary channel without a readable projection matches the
1621
+ source bytes one character each (Latin-1): a text pattern finds strings, `\xNN`
1622
+ escapes find byte sequences, and every hit is reported in byte coordinates that paste
1623
+ into a byte READ (`region` spans the hexadecimal lines of the matched bytes; `matched`
1624
+ is their hex). The load is bounded by the mimetypes binary input ceiling; a larger
1625
+ resource fails 413 `bytes-too-large` by name rather than being skipped.
1626
+ - §binary-parity A binary member is not a second-class resource. It behaves exactly as a text
1627
+ member does for existence, FIND by path, KILL/delete, mimetype, weight, and membership; it
1628
+ READs whole as its byte projection ({§read-bytes}) or as a native attachment ({§packet-attachment-parts}),
1629
+ READs and FINDs by byte range and byte pattern ({§read-bytes}/{§find-bytes}); and COPY or MOVE transfers
1630
+ its bytes exactly, between file members and into or out of a DB-backed `worker://` entry alike. A
1631
+ whole-resource transfer writes the source's bytes ({§read-bytes} `ByteSource`) verbatim to the
1632
+ destination through the ordinary proposal gate, the receipt reporting the byte count rather than a text
1633
+ line diff; "whole-resource" is the markerless selection or `<1,-1>` ({§move-canonical-whole-source}),
1634
+ and a MOVE deletes the source after the destination lands. A **byte range** `<a,b>` transfers exactly
1635
+ those source bytes (coordinate = byte, 1-indexed inclusive). A transfer **into** a destination byte
1636
+ range is a splice: `<c,d>` replaces exactly the destination bytes c..d with the source bytes and a
1637
+ single position `<c>` inserts the source bytes before byte c (`<-1>` appends); every byte outside the
1638
+ window is preserved, and the whole spliced result is re-written through the proposal gate. A binary
1639
+ **lives in a DB entry** as its bytes base64 in the channel's TEXT content; the same READ, byte range,
1640
+ and COPY/MOVE recover them through a byte source synthesized from that content, so a File member and a
1641
+ `worker://` entry hold and yield a binary identically. This supersedes the older blanket refusal (#140)
1642
+ for both the file and the entry case. Two projections stay with the materialized File member, drawn from
1643
+ its source-projection facts: the native image/PDF **attachment** ({§packet-attachment-parts}) and its
1644
+ dimensions; a `worker://` entry binary reads as its byte projection. The exceptions are narrow and
1645
+ defined, each a clear receipt rather than a dead end: a binary region addressed by a **textual anchor**
1646
+ rather than a numeric byte coordinate has no meaning (416 — bytes are not lines), **authoring** binary
1647
+ content from a text EDIT body is impossible (a text emission cannot type bytes), and a scheme that keeps
1648
+ no bytes for a binary channel — no disk file, no stored content — has nothing to transfer and says so
1649
+ (415). None is the entry-storage dead end the older text named; that cell is filled.
1625
1650
 
1626
1651
  ### §log-history-projection Durable history and active projection
1627
1652
 
1628
1653
  | Layer | Owner | Curation contract |
1629
1654
  |---|---|---|
1630
1655
  | Durable event | `log_entries` | One chronological execution fact. Ordinary Plurnk operations never erase it; its original body and initial folded state remain available to the client journal, digest, and fork forensics. Containing turn, worker, or workspace teardown may cascade the history. |
1631
- | Active projection | `log_entry_projections` | One current worker-facing state per event. OPEN/FOLD change folded body intervals while active. Log-KILL atomically changes active to inactive and cannot be reversed; inactive rows are absent from packet rendering, log READ/FIND, failure pointers, semantic discovery, token accounting, and later curation. |
1656
+ | Active projection | `log_entry_projections` | One current worker-facing state per event. A scoped KILL changes folded body intervals while active. Log-KILL atomically changes active to inactive and cannot be reversed; inactive rows are absent from packet rendering, log READ/FIND, failure pointers, semantic discovery, token accounting, and later curation. |
1632
1657
 
1633
1658
  The successful curation operation and every exact target transition are durable
1634
1659
  in the same commit. KILL against another scheme retains that scheme's ordinary
1635
1660
  resource or process semantics; this projection contract is specific to
1636
1661
  `log:///`.
1637
1662
 
1638
- ### §open-fold OPEN / FOLD
1663
+ ### §log-kill-scope KILL on the log: whole items and scoped bodies
1639
1664
 
1640
- AST: `{ op: "OPEN"|"FOLD", target, body: MatcherBody | null, signal: tags | null, lineMarker: TextLineMarker | null }`.
1665
+ AST: `{ op: "KILL", target, body: MatcherBody | null, lineMarker: TextLineMarker | null }` ({§kill-scope} in the contracts SPEC owns the grammar).
1641
1666
 
1642
- OPEN/FOLD operate on the **log** (`log:///`) - the model's context-curation surface ({§packet}). Without a scope, FOLD hides and OPEN reveals the whole canonical log body. With a one-line or inclusive two-line scope, each operation changes only that body's intersecting body-relative physical lines. An anchor may be one already published on that immutable body or one returned by READing its `log:///` identity; numeric lines outside a selected body and absent or ambiguous anchors are successful per-body no-ops. Both select rows by target, matcher, and the symmetric ALL-tags filter before independently applying the scope and tag changes to each selected row. Folded intervals are durable, sorted, disjoint, and compositional; `[]` is wholly open and `[[1,-1]]` wholly folded. An active row's canonical body remains complete through log READ/FIND regardless of folded visibility. Rows and bodies persist, and classification changes still land when visibility is a no-op. Malformed targets, unsupported coordinate arity, and nonexistent exact coordinates fail at their owning boundary. Entries carry no visibility ({§no-visibility}), so OPEN/FOLD against an entry scheme returns 501.
1667
+ KILL is the model's one context-curation verb on the **log** (`log:///`, {§packet}). Without a scope it retires the selected rows from the active projection ({§log-history-projection}). With a one-line or inclusive two-line scope it folds only that body's intersecting body-relative physical lines away from the packet projection, and the row stays. An anchor may be one already published on that immutable body or one returned by READing its `log:///` coordinate ({§line-anchors}); a stale anchor is 412 and an unrelated one is 422. Scoped KILL is one-way: intervals accumulate under the one-way interval algebra and nothing reopens them the durable body is untouched, and the model re-READs the source when it needs the text again. A scoped KILL on a bodyless row is a friendly 200 no-op with `matched` reported. A KILL that addresses no row is 404 on an exact coordinate and 204 on a sweep ({§log-curation-folder-idiom}). Selection composes target/glob with an optional matcher body ({§log-curation-set-selection}); a targetless KILL is 400.
1643
1668
 
1644
- ### §jsonplurnk The Log's wire format
1669
+ ### §log-wire-format The Log's wire format
1645
1670
 
1646
- The `## Log` section renders as a fixed three-backtick `jsonplurnk` fence - a JSON array of entry objects, otherwise-valid JSON with **exactly one** deviation: an open, nonempty `body` is a raw multiline string. Its opening JSON quote is followed by a physical newline, every visible content line retains its canonical numeric `N:` or anchored `@hash N:` coordinate, and its closing quote appears at column zero before either the object close or a following member. Source quotes, braces, fences, and headings cannot collide with either boundary because source text never occupies column zero after projection; source backticks therefore cannot form a CommonMark closing fence. The fixed opener keeps the packet prefix stable across content changes. The carve-out is localized to `body`, so the strip-parser recognizes `"body":"` followed by a newline, consumes one or more coordinate-prefixed lines, and replaces the raw multiline value with an escaped JSON string while preserving following members to recover strict JSON. The three body states are self-describing through field presence alone: a `body` field means open, `tokensBody` without `body` means folded (the value prices the OPEN), and neither means no canonical body; no `display` label exists. Two defaults are likewise field absence: `origin` is omitted for the worker's own model authorship (exactly as `source` absence means the owning worker), and `status` is omitted for a routine 200 on an ordinary row. SEND always carries its submit code, KILL keeps an explicit 200 so destructive completion is decisive, and every non-200 stays explicit. A partially hidden open row also carries `"folded":["<scope>",...]`; coordinate gaps in its body make the omission explicit without renumbering later lines. `path` is the complete model-facing log identity: when a projected operation exists it ends in `/OP`, and no separate `op` field duplicates it. It leads each entry object; the remaining members follow in stable alphabetical order. A present authored operation annotation appears as `annotation`; its absence omits the field. Nonempty `tags` is the row's complete deduplicated, sorted folksonomy; an untagged row omits it. When an automatic bounded projection differs from the visibility-selected body, it appends `"chunk":"showing <selected> of <complete>"` after `body`; otherwise it omits `chunk`. Complete-line extents use inclusive two-coordinate line regions. A cut inside a line uses four-coordinate, start-inclusive and end-exclusive regions with 1-based Unicode code-point columns. The row's `path` remains the canonical READ target. The block is data only - no prose leads the fence. Every row's accounting: {§packet-token-accounting}.
1671
+ The `## Log` section is a sequence of ordinary Markdown records separated by one blank line:
1647
1672
 
1648
- - §packet-token-accounting Every row reports its real weight so the packet self-reconciles against the budget: `tokensBody` is the projected body's nonzero weight whenever a canonical body would render (never `0` — a priceless OPEN is field absence), and `tokensActive` is the complete row's weight in the packet right now. The metadata share is derivable (`tokensActive − tokensBody` when open; `tokensActive` otherwise) and is never serialized — it feeds no curation decision. Thus FOLD removes the rendered body's weight while KILL removes `tokensActive`; on a folded row `tokensBody` previews the body share an OPEN would activate. The completed row, including its accounting field and framing, is measured to a fixed point. A FIND's nonzero `itemsTokenTotal` weighs the complete matched set; a nonzero `returnedItemsTokenTotal` appears only when the returned page has a different weight. These are curation weights, not dollars. The invariants bind regardless of shape ({§packet}): addressability (`path`/`target`/`#channel`/coordinate-prefixed bodies), weighability (per-item `tokens`), honesty (every 4xx/5xx row and the exact body state). {§jsonplurnk} {§packet-jsonplurnk-exception}
1673
+ ```text
1674
+ ### log:///<loop>/<turn>/<item>/<leaf>
1675
+ {"oneLine":"strict JSON metadata"}
1676
+ <coordinate-prefixed body lines when open>
1677
+ ```
1678
+
1679
+ The H3 is the row's complete model-facing identity and canonical READ target; metadata never duplicates `path` or `op`. The following line is one strict JSON object whose members use stable alphabetical order. Every physical body line retains its canonical numeric `N:` or anchored `@hash N:` coordinate, so source text cannot create a record boundary. The section contains records only, with no leading prose or enclosing fence.
1680
+
1681
+ The three body states are self-describing: coordinate lines mean open, `tokensBody` without coordinate lines means folded, and neither means no canonical body. A partially hidden open row carries `"folded":["<scope>",...]`; coordinate gaps expose the omissions without renumbering. A bounded projection carries `"chunk":"showing <selected> of <complete>"` in metadata. Complete-line extents use inclusive two-coordinate regions; a cut inside a line uses four-coordinate, start-inclusive and end-exclusive regions with 1-based Unicode code-point columns.
1682
+
1683
+ Field absence carries defaults: `origin` is omitted for the owning model, `source` for the owning worker, and `status` for a routine 200. SEND always carries its submit code, KILL keeps an explicit 200, and every non-200 stays explicit. A present authored annotation appears as `annotation`. Every row's accounting follows {§packet-token-accounting}.
1684
+
1685
+ - §packet-attachment-parts A READ of an attachable member carries its facts from the member's projection
1686
+ ({§mimetype-projection-facts}): an image ({§mimetype-image}) as `image: { mimetype, width, height, bytes }`,
1687
+ a PDF ({§mimetype-pdf-facts}) as `document: { mimetype, pages, bytes }`. Its open row weighs the attachment
1688
+ (`tokensAttachment`, inside `tokensActive`) at `ceil(width × height / 750)` for a picture and
1689
+ `pages × 1500` for a document, and the packet lists it as an attachment of that kind. The kinds live in
1690
+ one table (`attachments.ts`): a kind exists only once a handler projects its facts and a scheme still holds
1691
+ its bytes. On a route whose provider declares the kind's modality ({§provider-input-modalities}) the wire
1692
+ form carries the user slot as parts, the text then one native part per accepted attachment read from the
1693
+ scheme's bytes at request time, a picture as an image part and a document as a file part; an attachment of
1694
+ a kind the route does not accept, and every attachment on a route that accepts none, reaches the model as
1695
+ its text projection alone. An attachment follows visibility exactly: a folded or killed row sends nothing.
1696
+ The weights are estimates; the provider's reported usage corrects the readout as it does for text.
1697
+ - §attachment-teaching The system slot teaches attachments only where they apply: an `Attachments` section,
1698
+ rendered between the definition and the policy, carries one `example`-fenced READ line per kind the
1699
+ route accepts and the daemon can attach, from the same table; a route that accepts no attachable kind has
1700
+ no section, so no model is told of a capability its route lacks (#497).
1701
+ - §packet-token-accounting Every row reports its real weight so the packet self-reconciles against the budget: `tokensBody` is the projected body's nonzero weight whenever a canonical body would render (never `0` — a priceless visible body is field absence), and `tokensActive` is the complete row's weight in the packet right now. The metadata share is derivable (`tokensActive − tokensBody` when open; `tokensActive` otherwise) and is never serialized — it feeds no curation decision. Thus a scoped KILL removes the rendered body's weight while a whole KILL removes `tokensActive`; on a folded row `tokensBody` previews the body share the fold reclaimed. The completed record, including its H3, metadata, and body, is measured to a fixed point. A FIND's nonzero `itemsTokenTotal` weighs the complete matched set; a nonzero `returnedItemsTokenTotal` appears only when the returned page has a different weight. These are curation weights, not dollars. The invariants bind regardless of shape ({§packet}): addressability (record H3/`target`/`#channel`/coordinate-prefixed bodies), weighability (per-item `tokens`), honesty (every 4xx/5xx row and the exact body state). {§log-wire-format} {§packet-log-records}
1649
1702
 
1650
1703
  ### §retrieval-packet-metadata READ/FIND packet metadata
1651
1704
 
@@ -1672,22 +1725,22 @@ and its internally resolved whole-line region. Exact READ retains only its
1672
1725
  region. A failed retrieval's Problem owns its range extension rather than
1673
1726
  repeating it at top level. Generic `tokens` always weighs the rendered body;
1674
1727
  generic body `lines` remains available on READ-shaped materialization notices
1675
- that have no retrieval extent. FIND content weights follow {§jsonplurnk};
1728
+ that have no retrieval extent. FIND content weights follow {§log-wire-format};
1676
1729
  ordinary bounded bodies expose their displayed and complete chunk extents there.
1677
1730
 
1678
1731
  ### §turn-ops-entry The admitted turn program
1679
1732
 
1680
- §turn-ops-log-curation A source-backed turn preserves its **exact admitted Plurnk program** as an actionless log item in addition to the ordinary result row for every dispatched statement. `op` is null, `attrs.kind="turnOps"` identifies the durable type, `origin` is the turn producer, no target exists, `tx` is empty, and the source lives in `rx.content`, typed `text/vnd.plurnk`. Its canonical model-facing address appends the lowercase `/ops` leaf to its three-part coordinate. The packet does not duplicate that identity as `kind` metadata. It is line-numbered and READ/FIND/OPEN/FOLD/KILL-able like any active log body. The worker-initialization `turnOps` is born OPEN because it is the worked orientation example; every other `turnOps`, including model inference and overflow recovery, is born FOLDED and remains available on demand. Log-KILL clears the `writableBy` gate for a model-authored item and retires only its active projection under {§log-history-projection}; the exact program remains forensic history. Log's handler surface keeps every other mutating op at 501. The shared executor writes exactly one after every admitted source-backed turn.
1733
+ §turn-ops-log-curation A source-backed turn preserves its **exact admitted Plurnk program** as an actionless log item in addition to the ordinary result row for every dispatched statement. `op` is null, `attrs.kind="turnOps"` identifies the durable type, `origin` is the turn producer, no target exists, `tx` is empty, and the source lives in `rx.content`, typed `text/vnd.plurnk`. Its canonical model-facing address appends the lowercase `/ops` leaf to its three-part coordinate. The packet does not duplicate that identity as `kind` metadata. It is line-numbered and READ/FIND/KILL-able like any active log body. The worker-initialization `turnOps` is born visible because it is the worked orientation example; every other `turnOps`, including model inference and overflow recovery, is born FOLDED and remains available on demand. Log-KILL clears the `writableBy` gate for a model-authored item and retires only its active projection under {§log-history-projection}; the exact program remains forensic history. Log's handler surface keeps every other mutating op at 501. The shared executor writes exactly one after every admitted source-backed turn.
1681
1734
 
1682
- §rejected-emission-entry A rejected provider response is not `turnOps`: it never became an admitted turn program. The one bounded invalid-emission recovery item under {§emission-admission} has `attrs.kind="emissionAttempt"`, `origin="model"`, the canonical model-facing `/attempt` leaf, and the exact latest rejected response. The packet does not duplicate that identity as `kind` metadata. It is born durably FOLDED and projected OPEN only in the informed recovery packet; every other rejected attempt remains forensic-only.
1735
+ §rejected-emission-entry A rejected provider response is not `turnOps`: it never became an admitted turn program. The one bounded invalid-emission recovery item under {§emission-admission} has `attrs.kind="emissionAttempt"`, `origin="model"`, the canonical model-facing `/attempt` leaf, and the exact latest rejected response. The packet does not duplicate that identity as `kind` metadata. It is born durably folded and projected visibly only in the informed recovery packet; every other rejected attempt remains forensic-only.
1683
1736
 
1684
- - §log-coordinate-hierarchy **Log coordinates are a hierarchical prefix; the trailing slash is optional** — a coordinate is `loop/turn/sequence`, and a PARTIAL coordinate selects its descendants: `log:///1` = loop 1's rows, `log:///1/2` = turn 1/2's rows, `log:///1/2/3` = the one row. A full coordinate is always three parts, so a one- or two-part path is unambiguously a prefix — the trailing slash is an optional alias (`log:///1/2` ≡ `log:///1/2/`), uniform with `## READ0 (worker:///docs/)`. A complete `[start-end]` segment in any numeric coordinate slot selects that inclusive decimal interval; brackets elsewhere retain ordinary path-glob meaning. Every rendered row appends one canonical model-facing leaf: `/OP` for an operation, `/ops` for an admitted turn program, or `/attempt` for a rejected emission. The leaf names identity rather than adding a resource level. Exact consumers tolerate the unsuffixed three-part shorthand; when supplied, the case-insensitive leaf is authoritative and a disagreement resolves 404. Typed entry materialization therefore resolves as `/READ` while retaining its durable `EDIT` event ({§exec-entry-sink}). `log:///1/2/*` still selects the turn's item rows, while `log:///**/READ`, `log:///**/ops`, and `log:///**/attempt` deliberately filter canonical leaves.
1685
- - §log-curation-folder-idiom **Log curation speaks the folder idiom; a zero-match sweep is a no-op success** — OPEN/FOLD/KILL take a concrete coordinate or a path-glob, and a **trailing slash or a partial coordinate means "the contents"** ({§log-coordinate-hierarchy}), like a folder-scoped FIND: `## FOLD0 (log:///1/2)` folds turn 1/2's rows. OPEN and FOLD may instead take only a tag filter ({§log-item-tags}). A **well-formed selection that matches nothing is 204 with `matched: 0`**; a successful sweep's rx carries `matched: N`. A targetless operation without tags or a matcher is 400.
1686
- - §log-curation-set-selection **Row selection and body scope are independent** — target/glob, optional body matcher, and optional ALL-tags filter compose by intersection into the affected row set. An optional `<L>` or `<SL,EL>` then intersects each selected canonical body; it never paginates or changes the selected set. Thus `## FOLD0 (log:///**/READ) <17,-1>` may change long READs and no-op on short ones while reporting every selected row in `matched`.
1737
+ - §log-coordinate-hierarchy **Log coordinates are a hierarchical prefix; the trailing slash is optional** — a coordinate is `loop/turn/sequence`, and a PARTIAL coordinate selects its descendants: `log:///1` = loop 1's rows, `log:///1/2` = turn 1/2's rows, `log:///1/2/3` = the one row. A full coordinate is always three parts, so a one- or two-part path is unambiguously a prefix — the trailing slash is an optional alias (`log:///1/2` ≡ `log:///1/2/`), uniform with `### READ0 (worker:///docs/)`. A complete `[start-end]` segment in any numeric coordinate slot selects that inclusive decimal interval; brackets elsewhere retain ordinary path-glob meaning. Every rendered row appends one canonical model-facing leaf: `/OP` for an operation, `/ops` for an admitted turn program, or `/attempt` for a rejected emission. The leaf names identity rather than adding a resource level. Exact consumers tolerate the unsuffixed three-part shorthand; when supplied, the case-insensitive leaf is authoritative and a disagreement resolves 404. Typed entry materialization therefore resolves as `/READ` while retaining its durable `EDIT` event ({§exec-entry-sink}). `log:///1/2/*` still selects the turn's item rows, while `log:///**/READ`, `log:///**/ops`, and `log:///**/attempt` deliberately filter canonical leaves. An EXEC's output stream lives at that same item address under its runtime tag — `sh:///1/2/3/EXEC#stdout` — so one `loop/turn/item/OP` schema addresses every item, log rows and streams alike.
1738
+ - §log-curation-folder-idiom **Log curation speaks the folder idiom; a zero-match sweep is a no-op success** — KILL takes a concrete coordinate or a path-glob, and a **trailing slash or a partial coordinate means "the contents"** ({§log-coordinate-hierarchy}), like a folder-scoped FIND: `### KILL0 (log:///1/2) <1,-1>` folds turn 1/2's bodies. A **well-formed selection that matches nothing is 204 with `matched: 0`**; a successful sweep's rx carries `matched: N`. A targetless KILL is 400.
1739
+ - §log-curation-set-selection **Row selection and body scope are independent** — target/glob and an optional body matcher compose by intersection into the affected row set. An optional `<L>` or `<SL,EL>` then intersects each selected canonical body; it never paginates or changes the selected set. Thus `### KILL0 (log:///**/READ) <17,-1>` may change long READs and no-op on short ones while reporting every selected row in `matched`.
1687
1740
 
1688
- §fold-open-meta-operations **OPEN and FOLD are meta-operations — log-curation directives, not world actions.** They change log visibility and classifications, never the underlying resources. A **successful** OPEN/FOLD **is recorded in the log** and **renders exactly once** — in the packet after its turn, as its path, target, and status — then dissolves from the projection ({§curation-receipt-dissolves}): the actor sees its `200` or `204` at the one moment it decides whether to conclude or repeat, the row exists for forensics (a curation act with NO trace is how a weak model folding its own task frame stayed invisible until a database dig, and how a model that deferred its confirmation re-issued a KILL into the turn ceiling), and the log never accumulates housekeeping — a permanent receipt row would be a crumb that itself needs sweeping. Its exact selected target set, each target's active/folded state before and after, and the classifications actually added and removed persist with that event; `matched: N` and the authored selector are not the database's sole effect evidence. The operation row, projection changes, tag changes, and landed effects commit in one database statement with each before state as a collision guard. The authored program also survives verbatim in its `turnOps` item. A **failed** OPEN/FOLD (bad target, matcher, or tag signal) renders normally with its status — errors are signals. The idle-turn gate reads the *emitted statements*, so a pure-curation turn is work, never idleness.
1741
+ §log-kill-meta-operation **A log KILL is a meta-operationa log-curation directive, not a world action.** It changes log visibility, never the underlying resources. A **successful** log KILL **is recorded in the log** and **renders exactly once** — in the packet after its turn, as its path, target, and status — then dissolves from the projection ({§curation-receipt-dissolves}): the actor sees its `200` or `204` at the one moment it decides whether to conclude or repeat, and the row exists for forensics (a curation act with NO trace is how a weak model folding its own task frame stayed invisible until a database dig).
1689
1742
 
1690
- §curation-receipt-dissolves **Successful log-curation receipts dissolve.** A model-authored OPEN, FOLD, or KILL of a log item renders in exactly the packet immediately after its turn — path, target, and status, no body — and leaves the active projection once a later model turn has rows; history keeps the row, the exact active/folded transition for every target, and the authored `turnOps`. Nothing is left to curate: a receipt that dissolves is not a log item to sweep. A KILL of a log item retires the selected rows from the worker's active projection under {§log-history-projection}; it does not delete their execution history. The dissolving is **scoped to log targets**: a `KILL` of a `worker://` note, an `sh://` stream, or another stored artifact retains its scheme-owned world or process semantics and stays visible. A killed exact coordinate resolves 404 in ordinary log operations; a well-formed broad selection with no active matches remains the 204 no-op of {§log-curation-folder-idiom}, and that 204 renders once like any dissolving receipt. Failed OPEN/FOLD/KILL render like every operation error and persist.
1743
+ §curation-receipt-dissolves **Successful log-curation receipts dissolve.** A model-authored KILL of a log item, whole or scoped, renders in exactly the packet immediately after its turn — path, target, and status, no body — and leaves the active projection once a later model turn has rows; history keeps the row, the exact active/folded transition for every target, and the authored `turnOps`. Nothing is left to curate: a receipt that dissolves is not a log item to sweep. A KILL of a log item retires the selected rows from the worker's active projection under {§log-history-projection}; it does not delete their execution history. The dissolving is **scoped to log targets**: a `KILL` of a `worker://` note, an `sh://` stream, or another stored artifact retains its scheme-owned world or process semantics and stays visible. A killed exact coordinate resolves 404 in ordinary log operations; a well-formed broad selection with no active matches remains the 204 no-op of {§log-curation-folder-idiom}, and that 204 renders once like any dissolving receipt. Failed KILLs render like every operation error and persist.
1691
1744
 
1692
1745
  ### §log-sensitive-request-evidence Durable request evidence
1693
1746
 
@@ -1725,8 +1778,6 @@ body: ResourceSelection (destination), signal: tags | null }`.
1725
1778
  channels survive.
1726
1779
  - §copy-conflict-409 Different content in that channel is 409.
1727
1780
  - §copy-noop-304 Identical content is 304.
1728
- 5. The signal classifies the COPY log item and never changes either resource
1729
- ({§log-item-tags}).
1730
1781
 
1731
1782
  §copy-cross-scheme-copy The result is 201 for a new entry, 200 for a write, 304 for an exact no-op, or
1732
1783
  202 when the owning scheme requires proposal review. Same- and cross-scheme
@@ -1773,7 +1824,7 @@ AST: `{ op: "FIND", target (scope), body: MatcherBody | null (predicate), signal
1773
1824
  `(https, example.com, /page)`, never an empty-authority row at `/page`.
1774
1825
  - §find-channel-selection The target selects a channel under {§channel-selection}. That channel controls candidate eligibility, every matcher dialect's content or derivation, match-evidence coordinates, and exact producer-result composition. A selected channel absent from an exact entry is 404; a broad scope simply excludes entries lacking it. Successful resource-mode results remain complete default-first channel groups, so sibling channels are navigable catalog metadata rather than additional matches.
1775
1826
  - §find-glob-filter-on-content `body` matcher operates on the addressed entry channel (glob/regex/jsonpath/xpath), per `plurnk.md` "Pattern Filtering"; the path-glob lives in the (target), not the body.
1776
- - §find-semantic-selection Every matcher operates only over the candidate set selected by `(target)`; relation matchers do not bypass that selection. Semantic ranking is exhaustive within that candidate set, then applies the ordinary FIND result scope. Markerless semantic FIND therefore uses the same `<1,16>` default as every other matcher. Integers retain FIND's positional contract: `<N>` selects result N and `<N,M>` selects the inclusive range. A leading decimal first applies a minimum cosine-similarity threshold; following integers select positions within that ranked threshold set. Thus `<0.7,10,20>` means threshold 0.7 followed by results 10 through 20, while `<0.7>` applies the threshold and the ordinary first-16 page.
1827
+ - §find-semantic-selection Every matcher operates only over the candidate set selected by `(target)`; relation matchers do not bypass that selection. Semantic ranking is exhaustive within that candidate set, then applies the ordinary FIND result scope. Markerless semantic FIND therefore uses the same `<1,16>` default as every other matcher. Integers retain FIND's positional contract: `<N>` selects result N and `<N,M>` selects the inclusive range. A leading decimal first applies a minimum cosine-similarity threshold; following integers select positions within that ranked threshold set. Thus `<0.7,10,20>` means threshold 0.7 followed by results 10 through 20, while `<0.7>` applies the threshold and the ordinary first-16 page. Each semantic match carries its best-chunk cosine as `score`, and each ranked resource row surfaces it as `similarity` (three decimals), so a ranked page states why it is ordered; the lexical fallback ranks by BM25 and carries neither.
1777
1828
  - §find-scoped-isolation Workspace + scheme scoped — no cross-workspace/cross-scheme leakage.
1778
1829
  - §find-result-projection **The authored target shape determines the result unit; result cardinality never changes it** ({§find-result-unit}). Returns `FindResult { status, content, mimetype, results, range, matchingPathCount, matchLocationCount, itemsWeightTotal, returnedItemsWeightTotal }`:
1779
1830
 
@@ -1847,9 +1898,9 @@ AST: `{ op: "SEND", target: ParsedPath | null, body: SendBody | null, signal: nu
1847
1898
  |---|---|---|---|
1848
1899
  | **102** continue | next turn | next turn | next turn |
1849
1900
  | **200** done | **resolved** — terminal, loop ends | **refused** — Premature-Terminate (KILL to abandon, or wait) | **refused** — forced next turn to see the result |
1850
- | **202** wait | **resolves like 200**, unless this turn successfully FOLDed — an empty wait is satisfied, while FOLD continues into the curated next packet | **block on the join** — the loop sleeps (`<T>`/`<-1>` bound it, `<P>` polls); its work's conclusion **reawakens the same loop**, prompt intact ({§worker-lifecycle-child-wake}, {§worker-lifecycle-wake-liveness}) | resolves next turn (≈ continue) |
1901
+ | **202** wait | **resolves like 200**, unless this turn successfully scoped a KILL — an empty wait is satisfied, while curation continues into the curated next packet | **block on the join** — the loop sleeps (`<T>`/`<-1>` bound it, `<P>` polls); its work's conclusion **reawakens the same loop**, prompt intact ({§worker-lifecycle-child-wake}, {§worker-lifecycle-wake-liveness}) | resolves next turn (≈ continue) |
1851
1902
 
1852
- §wait-obligation-matrix **499** gives up regardless of obligations and cancels the unresolved descendant scope — the model's one self-decided failure ({§state-terms}). The surface is small on purpose. The **one** non-obvious cell is **200 with an obligation in flight** — a contradiction (you claimed done while you owe work), which the engine holds you to via Premature-Terminate below. A child join is bounded by the child's terminal transition; an external stream may carry an explicit `<T,P>` policy. A successful same-turn FOLD is synchronous housekeeping, so it does not block an explicit `200`; with `202`, it instead continues as `102` because its context effect is useful only in the curated next packet.
1903
+ §wait-obligation-matrix **499** gives up regardless of obligations and cancels the unresolved descendant scope — the model's one self-decided failure ({§state-terms}). The surface is small on purpose. The **one** non-obvious cell is **200 with an obligation in flight** — a contradiction (you claimed done while you owe work), which the engine holds you to via Premature-Terminate below. A child join is bounded by the child's terminal transition; an external stream may carry an explicit `<T,P>` policy. A successful same-turn scoped KILL is synchronous housekeeping, so it does not block an explicit `200`; with `202`, it instead continues as `102` because its context effect is useful only in the curated next packet.
1853
1904
 
1854
1905
  §loop-terminal-authorship **Terminal authorship is explicit when external.**
1855
1906
 
@@ -1877,20 +1928,19 @@ violations (a missing PLAN or terminal SEND, an operation dropped by a parse
1877
1928
  failure) do strike: six in a row is a degenerated run.
1878
1929
 
1879
1930
  - §send-target-recipient **A SEND target is a recipient.** A model's directed SEND
1880
- addresses a worker (`## SEND0 (worker://<name>)`), an outbound agent (`a2a://`),
1881
- or a scheme that implements SEND (an `https://` POST); with `[410]` it names a
1882
- resource to delete. A SEND to a scheme the model may not write (the prompt, the
1931
+ addresses a worker (`### SEND0 (worker://<name>)`), an outbound agent (`a2a://`),
1932
+ or a scheme that implements SEND (an `https://` POST). A SEND to a scheme the model may not write (the prompt, the
1883
1933
  log) is refused 400 `send-target-not-a-recipient`, never the unrelated writer
1884
1934
  rule. The detail states only that the addressed scheme is not a recipient;
1885
1935
  neutral recovery distinguishes targetless replies from directed SEND without
1886
1936
  guessing which one was intended. A scheme that does not implement SEND
1887
1937
  answers its ordinary factual 501 without grafting a guessed recovery onto it.
1888
- - §send-idle-turn **Idle turn** — a continuing turn (102) whose ops are only PLAN/SEND — no work op. The model continued with nothing to do. The steer, verbatim: *"If your work is done, conclude with `## SEND0 [200]`. If you're waiting on a child or stream you spawned, use `## SEND0 [202]` to block on it — a 202 with nothing to wait on simply concludes."* A successful same-turn FOLD is the exception: its `202` continues without a strike so the curated packet can support the next reasoning turn. **An empty `[102]` while the worker holds a live stream or child is a mis-spelled wait, not idleness**: the engine parks the turn as `[202]` — the same live-work predicate the `[200]` gate uses, so the shift never disagrees with the orientation the model reads — records the SEND as `202` with the correction in that row's annotation (a park drops transient notices; the row survives the wake); no strike. With nothing in flight the idle-turn 409 stands — it is the deterministic recovery for that case.
1938
+ - §send-idle-turn **Idle turn** — a continuing turn (102) whose ops are only PLAN/SEND — no work op. The model continued with nothing to do. The steer, verbatim: *"If your work is done, conclude with `### SEND0 (TERM)`. If you're waiting on a child or stream you spawned, use `### SEND0 (WAIT)` to block on it — a 202 with nothing to wait on simply concludes."* A successful same-turn scoped KILL is the exception: its `202` continues without a strike so the curated packet can support the next reasoning turn. **An empty `(NEXT)` while the worker holds a live stream or child is a mis-spelled wait, not idleness**: the engine parks the turn as `(WAIT)` — the same live-work predicate the `(TERM)` gate uses, so the shift never disagrees with the orientation the model reads — records the SEND as `202` with the correction in that row's annotation (a park drops transient notices; the row survives the wake); no strike. With nothing in flight the idle-turn 409 stands — it is the deterministic recovery for that case.
1889
1939
  - §send-premature-terminate **Premature terminate — the pending set.**
1890
1940
  A model's completion claim is gated by one rule: *nothing pending may be silently
1891
1941
  discarded*. Pending work has two states: **live obligations** (open
1892
1942
  streams/spawns and live child workers) and **completed-but-unobserved
1893
- results** (same-turn READ/FIND/OPEN results, failed operations, failed
1943
+ results** (same-turn READ/FIND results, failed operations, failed
1894
1944
  terminal stream output (close status ≥ 400) without a terminal foisted
1895
1945
  READ, and child results queued for the next packet). A stream that closed
1896
1946
  successfully is banked, not pending: its output stays in the Log and `[200]`
@@ -1902,7 +1952,7 @@ failure) do strike: six in a row is a degenerated run.
1902
1952
  `streams`, `workers`, `receipts`, `failed-stream-results`, and
1903
1953
  `worker-results`; it never embeds commands, stream handles, result bodies, or
1904
1954
  a presumed recovery. The pending kind changes the factual Problem class, not
1905
- rail accounting. `[499]` deliberately abandons regardless.
1955
+ rail accounting. `(FAIL)` deliberately abandons regardless.
1906
1956
  - §send-administrative-terminal **An administrative terminal closes its own
1907
1957
  transaction.** A client, plugin, or `_plurnk` operation program runs in its
1908
1958
  own administrative loop. Its SEND signal `200` concludes exactly that loop;
@@ -1912,7 +1962,7 @@ failure) do strike: six in a row is a degenerated run.
1912
1962
  observed only after crossing a packet boundary. SEND signal `202` parks only on
1913
1963
  live obligations. If work has completed but is unobserved, it continues
1914
1964
  directly to the next packet because the wake edge has already fired; only a
1915
- genuinely empty set with no successful same-turn FOLD resolves immediately like `[200]`.
1965
+ genuinely empty set with no successful same-turn scoped KILL resolves immediately like `(TERM)`.
1916
1966
 
1917
1967
  ### §exec EXEC
1918
1968
 
@@ -1923,17 +1973,17 @@ resolves the runtime first, selects its static {§executor-invocation} or exact
1923
1973
  {§executor-tool-registry} entry, and enforces that declaration before effect
1924
1974
  admission. Core owns target
1925
1975
  realization; neither filesystem type nor body presence may invent a target role
1926
- the selected runtime did not declare. With no declared directory override,
1927
- `cwd` is the workspace's `project_root`, where the File scheme writes never
1928
- the daemon's own cwd. A runtime that routes a directory target to `cwd` resolves
1929
- a relative target against the directory the command would run in the project
1930
- root, or the shell's own cwd when the workspace has none and inspects it
1931
- before anything spawns: a directory becomes the working directory, a file is the
1932
- script; anything else is refused `400 target-not-found`, naming that directory
1933
- and giving the applicable accepted form without inferring what the model meant.
1934
- When the target is a registered tool of another runtime, recovery gives that
1935
- tool's exact runtime-qualified invocation; otherwise it distinguishes an existing
1936
- directory/script target from a targetless shell-command body. A non-file resource
1976
+ the selected runtime did not declare. `cwd` is the workspace's `project_root`, where the File scheme writes — never the
1977
+ daemon's own cwd unless the heading carries a `{cwd=<directory>}` block
1978
+ ({§exec-executor-slot}): core resolves that directory against the project root, or the
1979
+ shell's own cwd when the workspace has none, and refuses `400 cwd-not-found` when it is
1980
+ not an existing directory; any other metadata block on a local program is refused
1981
+ `400 metadata-unsupported`. A `script`-kind target ({§executor-invocation}) is the program: core inspects it before
1982
+ anything spawns — a file is the script; a directory is refused `400 target-not-a-program`,
1983
+ pointing at `{cwd=…}`; an absent path is refused `400 target-not-found`, giving the
1984
+ applicable accepted form without inferring what the model meant. When the target is a
1985
+ registered tool of another executor, recovery gives that tool's exact bracketed
1986
+ invocation; otherwise it points at an existing script or a bare shell-command body. A non-file resource
1937
1987
  target that cannot be read keeps the owning READ's failure identity (#163) and states
1938
1988
  the slot contract in its recovery — the resource is the program and the body its stdin;
1939
1989
  a command belongs beneath a targetless heading — without guessing which was meant (#425). The started receipt always
@@ -1941,11 +1991,9 @@ names the working directory only when it is not the project root, and then in th
1941
1991
  model's own project-relative form ({§fs-namespace}: the root is the model's `/`, so it
1942
1992
  is never rendered, and no receipt or Problem carries a host-absolute path — the
1943
1993
  batch of 2026-08-29 showed the absolute `cwd` copied back into the target slot as
1944
- `(cwd: /host/path)`). The EXEC `(path)` is one of cwd, script, or tool
1945
- namethe runtime's declaration decides which (interpreters: cwd or script;
1946
- tool families: tool name) and a command is never a target. The default shell
1947
- is taught as targetless bare `EXEC`; `[sh]` remains the explicit form, and an
1948
- authored directory target remains an optional cwd override.
1994
+ `(cwd: /host/path)`). The EXEC `(path)` is a program a script for an interpreter, a tool name for a tool
1995
+ familyand neither a command nor a working directory is ever a target. The default
1996
+ shell is taught as targetless bare `EXEC`; `[sh]` remains the explicit form.
1949
1997
 
1950
1998
  | Declared target kind | Authored target | Canonical effect target | Executor realization |
1951
1999
  | -------------------- | --------------------------------------- | ----------------------- | --------------------------------------------------------- |
@@ -2028,21 +2076,27 @@ dispatch admission, and pull-document materialization. Core performs no
2028
2076
  protocol discovery while building a packet and has no alternate tool
2029
2077
  catalogue.
2030
2078
 
2031
- Per-tool programs such as `go`, `cargo`, `make`, and `npm` do not earn executor tags merely because they are executables; they are complete shell commands under `## EXEC0` or `## EXEC0 [sh]`. Registered tags exist only for tools that own a distinct body, target, or output contract. {§exec-registry-resolves}
2079
+ Per-tool programs such as `go`, `cargo`, `make`, and `npm` do not earn executor tags merely because they are executables; they are complete shell commands under `### EXEC0` or `### EXEC0 (sh)`. Registered tags exist only for tools that own a distinct body, target, or output contract. {§exec-registry-resolves}
2032
2080
 
2033
2081
  **Timeout and poll — `<T,P>` on the `<L>` slot (grammar 0.74.20).** EXEC
2034
2082
  repurposes the line-marker slot as `<timeout, poll>` in **minutes** — agentic
2035
2083
  latencies make a sub-minute horizon a trap — converted at the parse boundary to the
2036
- catalog's internal `stream.seconds`. The SEND `[202] <T>` wait horizon is minutes too.
2084
+ catalog's internal `stream.seconds`. The `### SEND0 (WAIT) <T>` wait horizon is minutes too.
2037
2085
 
2038
2086
  §exec-timeout `T` (`mark[0]`) caps the spawn's lifetime. At `T>0` the service
2039
2087
  aborts it — a bounded reap, polite signal then SIGKILL after
2040
2088
  `PLURNK_SERVICE_EXEC_KILL_GRACE_MS` — and stamps the stream **504**, distinct
2041
- from a deliberate kill (499) or a clean exit (200). `-1` or absent is unbounded
2042
- (loop-life bounded), the background-stream behavior. **`0` is turn-scoped**:
2089
+ from a deliberate kill (499) or a clean exit (200). Absent is unbounded but
2090
+ loop-life bounded reaped on every loop terminal except 202 — the
2091
+ background-stream behavior. **`-1` is unbounded and detached**: the spawn
2092
+ outlives its loop's terminal, 200 included. It never binds to the loop's
2093
+ teardown and is nobody's obligation — a TERM is not gated by it, a WAIT does
2094
+ not park on it, optimistic settlement looks past it — and it ends only by KILL,
2095
+ the worker's total reap, or daemon shutdown; its late conclusion surfaces
2096
+ without opening a loop. **`0` is turn-scoped**:
2043
2097
  the stream is reaped at the worker's next pre-turn via the registry abort,
2044
2098
  before the turn's own spawns, so it never survives into the subsequent turn;
2045
- its terminal output surfaces born-OPEN like any close ({§exec-stream}).
2099
+ its terminal output surfaces born visible like any close ({§exec-stream}).
2046
2100
 
2047
2101
  §exec-poll `P` (`mark[1]`) is the **poll cadence**, stored on the subscription.
2048
2102
  While the loop is blocked on a SEND signal `202` wait for that stream, the daemon arms
@@ -2102,7 +2156,7 @@ two states and no others:
2102
2156
  | state | what the model receives |
2103
2157
  |---|---|
2104
2158
  | active | nothing in the Log. The `## Child Streams` pointer names the stream with each channel's size and its growth since the last packet ({§child-orientation}); the model READs any range it wants. |
2105
- | terminal | ONE `origin=_plurnk` READ at `<runtime>:///<coord>#<channel>`, born OPEN, that is exactly a markerless READ of the channel — its first page ({§read-selection-projection}: lines 1–16, the whole channel when it fits, the channel's own mimetype), the `range` extent, terminal status and Problem, `terminal: true`, any producer-supplied integer `exitCode`, and `source: log:///<coord>/EXEC` linking the causal invocation. The packet renders that address under `stream`, exactly as the invocation row links its output, never under `target`: a stream is observed, not a slot to author. |
2159
+ | terminal | ONE `origin=_plurnk` READ at `<runtime>:///<coord>#<channel>`, born visible, that is exactly a markerless READ of the channel — its first page ({§read-selection-projection}: lines 1–16, the whole channel when it fits, the channel's own mimetype), the `range` extent, terminal status and Problem, `terminal: true`, any producer-supplied integer `exitCode`, and `source: log:///<coord>/EXEC` linking the causal invocation. The packet renders that address under `stream`, exactly as the invocation row links its output, never under `target`: a stream is observed, not a slot to author. |
2106
2160
 
2107
2161
  §exec-concurrency **Bounded admission per workspace (#389).** At most
2108
2162
  `PLURNK_SERVICE_EXEC_CONCURRENCY` executions run at once in one workspace (shipped `12`;
@@ -2122,7 +2176,7 @@ service's ({§operator-config}), fail-hard on any other value.
2122
2176
  §exec-stream-page **An unrequested delivery never exceeds the retrieval page.** The
2123
2177
  terminal observation is the same page a markerless READ returns, whatever the
2124
2178
  mimetype and however many turns the stream ran: the channel keeps every line for a
2125
- scoped READ (`## READ0 (<runtime>:///<coord>#<channel>) <L,M>`), and the extent
2179
+ scoped READ (`### READ0 (<runtime>:///<coord>#<channel>) <L,M>`), and the extent
2126
2180
  tells the model the total. Only the active user prompt and the generated project
2127
2181
  instructions are delivered without this bound; the model receives more than a page
2128
2182
  only by asking.
@@ -2133,7 +2187,7 @@ observation at close — so the pointer can state growth and no partial document
2133
2187
  or record ever reaches the model. The terminal observation and its cursor
2134
2188
  transition commit atomically; a terminal state with an empty channel still
2135
2189
  produces one bodyless conclusion row whose terminal fact, causal EXEC link, and
2136
- available exit code make completion explicit without invented narration. OPEN, FOLD, or KILL may curate
2190
+ available exit code make completion explicit without invented narration. KILL may curate
2137
2191
  that log row without rewinding the cursor or publishing the terminal result
2138
2192
  again; the exact terminal result and channel content remain READable at the
2139
2193
  stream address. Every READ then obeys {§body-projection} and therefore renders
@@ -2141,7 +2195,7 @@ its selected result complete. A stream that closes before a same-turn wait
2141
2195
  remains pending until every selected channel's terminal READ crosses the next
2142
2196
  packet boundary. The EXEC row separately records the authored invocation.
2143
2197
 
2144
- `## KILL0 (<runtime>:///<loop>/<turn>/<seq>)` cancels an active subprocess via
2198
+ `### KILL0 (<runtime>:///<loop>/<turn>/<seq>/EXEC)` cancels an active subprocess via
2145
2199
  the subscription registry's stored controller. A terminal stream is immutable:
2146
2200
  499 returns 410 (already killed), every other terminal status returns an RFC
2147
2201
  9457 409 Problem carrying `terminalStatus`, and an unknown address returns 404.
@@ -2151,7 +2205,7 @@ stream cannot fall through an internal `exec`-only query. {§stream-control}
2151
2205
  §exec-env-scoped **Scoped environment.** An EXEC subprocess inherits the *project's* environment — its `.env`, the standard shell vars — so the model's commands run as the project expects; but never plurnk's own secrets: the provider API keys and `PLURNK_*` config are stripped before the spawn, so a model-executed command can't `printenv` the engine's keys. The service owns the scoping policy (the denylist); the executor spawns with the env it is handed.
2152
2206
 
2153
2207
  - §exec-hold-until-concluded **The turn-hold exception** — for runtimes in `PLURNK_SERVICE_EXEC_HOLD` (a decision-table env, shipped listing the search family), an in-flight stream **pauses the cycle**: the next packet does not assemble until the stream concludes, so the model never burns a turn asking "are we there yet" about a result the engine controls end-to-end. This exception is limited to seconds-bounded runtimes whose final result the engine controls end-to-end. Bounded by `PLURNK_SERVICE_EXEC_HOLD_MS` and **fail-open**: at the cap the standard cycle resumes untouched (waits, wakes, polls). Zero grammar or teaching surface — the model emits EXEC followed by SEND signal `102` as ever; the wake-shaped world simply arrives one packet sooner. It extends selected runtimes beyond the ordinary {§worker-optimistic-settlement} cap before the next packet assembles. A bare entry holds ALL of a runtime's spawns; a `<runtime>:<effect>` suffix (`github:read`) holds only that effect-class — an MCP server is one runtime whose tools split (a `read` `get_issue` is instant; a `host` `run_migration` is a slow mutation), so an operator opts the known-fast read-class in without parking on the mutation. Conservative stays default: an arbitrary third-party server's latency never parks the engine unless a suffix opts a class in.
2154
- - §exec-entry-sink **The entry() sink** — an executor may *request* entry materialization (execs SPEC §2.6: every sink is a consumer-implemented callback; the executor owns zero substrate). The service implements it in exec dispatch: `entry(path, content: string | null, {tags, mimetype?})` upserts the entry, then records ONE typed `EDIT` row in the reserved `plurnk` worker's log — the fs-fiction pattern, `source` = the calling worker, `weight` = the canonical resulting span's curation weight, and `attrs.kind="entry_materialized"`. The requested tags classify that log row under {§log-item-tags}; they never become resource metadata or duplicate into attrs. Durable replay and clients retain that exact creation event. The model packet projects the typed event as a folded system `READ` of the resulting ordinary resource: its relevant truth is readable state now available in the environment, not an agent-authored mutation. **The executor owns no fetcher:** a `content: null` is a *declaration* — the service acquires the page through schemes-http's checked WebFetcher and accepts its model-facing body and available source/evidence channels {§html-materialization}. Generic public HTML follows the same origin-Markdown, configured materializer, and local-projection routes as exact HTTP acquisition ({§http-materializer-plugins}). A failed acquisition, body-production failure, materialization exception, or absent final projection rejects the sink and produces no HTTP entry, but does not invalidate a search runtime's upstream discovery row; materialization exceptions retain their cause in daemon diagnostics. A non-null `content` is the materialize-given-body path (the caller already holds the bytes and states their mimetype) and grants no provider authority. **No page body ever rides a packet**; the announcement is the folded row's path, weight, and log classifications, and the model READs/~queries what it chooses. Parallel `entry()` calls serialize on a per-spawn chain; a rejected call leaves the chain healthy. The spawn tail settles that complete chain before unregistering, so executor idleness and shutdown are barriers over its materialization writes. The narration context (one plurnk-worker turn) is lazy per spawn, not per entry.
2208
+ - §exec-entry-sink **The entry() sink** — an executor may *request* entry materialization (execs SPEC §2.6: every sink is a consumer-implemented callback; the executor owns zero substrate). The service implements it in exec dispatch: `entry(path, content: string | null, {mimetype?})` upserts the entry, then records ONE typed `EDIT` row in the reserved `plurnk` worker's log — the fs-fiction pattern, `source` = the calling worker, `weight` = the canonical resulting span's curation weight, and `attrs.kind="entry_materialized"`. Durable replay and clients retain that exact creation event. The model packet projects the typed event as a folded system `READ` of the resulting ordinary resource: its relevant truth is readable state now available in the environment, not an agent-authored mutation. **The executor owns no fetcher:** a `content: null` is a *declaration* — the service acquires the page through schemes-http's checked WebFetcher and accepts its model-facing body and available source/evidence channels {§html-materialization}. Generic public HTML follows the same origin-Markdown, configured materializer, and local-projection routes as exact HTTP acquisition ({§http-materializer-plugins}). A failed acquisition, body-production failure, materialization exception, or absent final projection rejects the sink and produces no HTTP entry, but does not invalidate a search runtime's upstream discovery row; materialization exceptions retain their cause in daemon diagnostics. A non-null `content` is the materialize-given-body path (the caller already holds the bytes and states their mimetype) and grants no provider authority. **No page body ever rides a packet**; the announcement is the folded row's path and weight, and the model READs/~queries what it chooses. Parallel `entry()` calls serialize on a per-spawn chain; a rejected call leaves the chain healthy. The spawn tail settles that complete chain before unregistering, so executor idleness and shutdown are barriers over its materialization writes. The narration context (one plurnk-worker turn) is lazy per spawn, not per entry.
2155
2209
 
2156
2210
  ### §proposal The proposal lifecycle
2157
2211
 
@@ -2236,7 +2290,7 @@ settles it as interruption (`500`) and errors active channels before evaluating
2236
2290
  loops ({§worker-lifecycle-restart-recovery}); it never reports cancellation (`499`) or
2237
2291
  pretends to reconstruct an opaque plugin connection.
2238
2292
 
2239
- §subscriptions-fold-keeps-subscription FOLD/OPEN changes a log row's folded body intervals ({§open-fold}), never the subscription registry. Curation of a streaming entry's log body leaves the live stream running: visibility is render-only, never cancellation.
2293
+ §subscriptions-fold-keeps-subscription A scoped KILL changes a log row's folded body intervals ({§log-kill-scope}), never the subscription registry. Curation of a streaming entry's log body leaves the live stream running: visibility is render-only, never cancellation.
2240
2294
 
2241
2295
  ### §chunk-accumulation Chunk accumulation
2242
2296
 
@@ -2250,14 +2304,14 @@ Model sees lifecycle events in the `log` section per turn.
2250
2304
 
2251
2305
  ### §deep-slices Deep slices on demand
2252
2306
 
2253
- `## READ0 (https://feed.example/x#body) <N-M>` pulls a slice into a log row when the model wants a specific line-range of an SSE stream.
2307
+ `### READ0 (https://feed.example/x#body) <N-M>` pulls a slice into a log row when the model wants a specific line-range of an SSE stream.
2254
2308
 
2255
2309
  ### §stream-control Stream control and writes
2256
2310
 
2257
- - **Cancel:** `## SEND0 [499] (https://feed.example/x)` — the service invokes the handle registered by `subscriptions.open()` and aborts the composed subscription signal.
2258
- - **Kill:** `## KILL0 (sh:///1/2/3)` — the model terminates its own runtime stream. This is stream control, not a write: the output scheme's `writableBy` never gates it, `Exec.kill` scopes the address to the caller ({§stream-owner-scoped}), and a finished stream answers 410 under its own tag. A queued execution ({§exec-concurrency}) is cancelled the same way and never enters its executor.
2259
- - **WebSocket write:** `## EDIT0 (wss://feed/x)` or `## SEND0 [200] (wss://feed/x)` with a body sends one whole text frame through the active owner. SEND can follow the opening READ in the same turn; EDIT runs before READ ({§op-mode-phases}) and therefore addresses an owner already open at turn start.
2260
- - **Other stream write:** `## SEND0 [200] (…)` remains scheme-defined, including exec stdin.
2311
+ - **Cancel:** `### KILL0 (https://feed.example/x)` — the service invokes the handle registered by `subscriptions.open()` and aborts the composed subscription signal.
2312
+ - **Kill:** `### KILL0 (sh:///1/2/3/EXEC)` — the model terminates its own runtime stream. This is stream control, not a write: the output scheme's `writableBy` never gates it, `Exec.kill` scopes the address to the caller ({§stream-owner-scoped}), and a finished stream answers 410 under its own tag. A queued execution ({§exec-concurrency}) is cancelled the same way and never enters its executor.
2313
+ - **WebSocket write:** `### EDIT0 (wss://feed/x)` or `### SEND0 (wss://feed/x)` with a body sends one whole text frame through the active owner. SEND can follow the opening READ in the same turn; EDIT runs before READ ({§op-mode-phases}) and therefore addresses an owner already open at turn start.
2314
+ - **Other stream write:** `### SEND0 [200] (…)` remains scheme-defined, including exec stdin.
2261
2315
 
2262
2316
  ### §stream-constraints Engine constraints
2263
2317
 
@@ -2398,7 +2452,7 @@ scheme. External schemes are discovered through
2398
2452
  dispatcher contract.
2399
2453
 
2400
2454
  The executor registry discovers installed runtimes, probes availability, and
2401
- routes `## EXEC0 [<runtime>]`; core contributes orchestration and the output-scheme
2455
+ routes `### EXEC0 [<runtime>]`; core contributes orchestration and the output-scheme
2402
2456
  adapter, not runtime implementations. Optional and third-party leaves extend
2403
2457
  each family by installation and discovery; they never require a framework or
2404
2458
  service manifest edit.
@@ -2420,8 +2474,8 @@ service manifest edit.
2420
2474
 
2421
2475
  - Channel state (`static`/`active`/`closed`/`errored`) — persisted channel metadata owned by core and exposed through the schemes capability contract ({§channel-state}).
2422
2476
  - Backpressure caps — none ({§stream-constraints}).
2423
- - Stream cancel — SEND signal `499` ({§stream-control}).
2424
- - Delete — `KILL` (entry-KILL, the canonical delete, {§move}); SEND signal `410` also deletes as a side-effect ({§send-dispatch}).
2477
+ - Stream cancel — `KILL` of the stream address ({§stream-control}).
2478
+ - Delete — `KILL` (entry-KILL, the canonical delete, {§move}); a scoped entry KILL deletes one span through the EDIT path ({§kill-scope-entry}).
2425
2479
  - §loop-policy-effective-read Per-loop policy — `loops.policy` persists one complete immutable `LoopPolicy`; every runtime policy read validates that snapshot before use. Missing rows or invalid values fail with the owning loop coordinate and cause. Raw archival copies and forensic rendering do not interpret policy.
2426
2480
  - Default-channel wire rendering — {§channel-selection}.
2427
2481
 
@@ -2960,8 +3014,8 @@ mutation of its source; resource-backed EXEC demands its runtime plus source
2960
3014
  observation. Unknown schemes, runtimes,
2961
3015
  and tools continue to their ordinary resolver so capability policy cannot turn
2962
3016
  absence into a misleading restriction. The same resolver shapes generated
2963
- resource examples, worker tool documents, and Turn0 surveys. PLAN, OPEN, FOLD,
2964
- log KILL, and targetless SEND are log/program control rather than routed
3017
+ resource examples, worker tool documents, and Turn0 surveys. PLAN, log KILL,
3018
+ and label or targetless SEND are log/program control rather than routed
2965
3019
  external demands and therefore remain outside capability selectors.
2966
3020
 
2967
3021
  §worker-settings **The worker carries its own behavioral rules.** The
@@ -3243,14 +3297,14 @@ time of measurement.
3243
3297
 
3244
3298
  | Fact | Owner and unit | Time | Contract |
3245
3299
  |:-----|:---------------|:-----|:---------|
3246
- | Core curation weight | `contentWeight = ceil(chars/2)` over channel content, canonical log bodies, and rendered packet slots | Write/build | Stable, model-independent pressure and OPEN/FOLD savings; never a tokenizer claim. |
3300
+ | Core curation weight | `contentWeight = ceil(chars/2)` over channel content, canonical log bodies, and rendered packet slots | Write/build | Stable, model-independent pressure and curation savings; never a tokenizer claim. |
3247
3301
  | §tokenomics-context-envelope-admission Provider input capacity | Provider model limits and configured total output envelope, in provider tokens | Before every logical request | `min(maxInputTokens, contextWindow - outputBudget)` over the known terms. The provider alone measures the complete request and admits, defers, or rejects it. |
3248
3302
  | Provider generation envelope | Provider total output budget and optional reasoning subset, in provider tokens | Before every logical request | One total output budget includes hidden reasoning. A reasoning budget is a strict subset, never an additive reserve. |
3249
3303
  | Provider usage and cost | Provider-reported input/output/cache/reasoning tokens and monetary evidence | After every physical request | Durable physical-request forensics under {§provider-usage}; never curation state or a preflight estimate. |
3250
3304
 
3251
3305
  - §tokenomics-weight-stored-at-write **Curation weight, stored at write.** `entry_channels.weight` weighs the complete channel content. `log_entries.weight` weighs the complete canonical `LogBody` content before coordinate and packet presentation; persistence `tx`/`rx` envelopes contribute nothing merely by existing, and proposal settlement recomputes the value when the canonical result changes. Bodyless rows therefore weigh zero. The stored number is a stable content-depth measurement, not a provider-token prediction.
3252
3306
  - §tokenomics-render-weight-budget **Packet curation budget.** `tokensActiveTotal` measures the *complete assembled packet* after section transforms and readout substitution; it is not a sum of log-row `tokensActive` fields. Core measures minimum-width probes, monotonically expands fields that do not fit, then right-aligns final values into those widths; final substitution is length-invariant and the displayed total equals the stored request weight. `tokensActiveMax` is the provider-derived curation calibration. A `SUM` of stored content weights measures a different artifact and cannot substitute for packet render weight.
3253
- - §tokenomics-context-percent **Curation percent.** `tokensActiveTotal` carries packet weight as a percentage of `tokensActiveMax`. It reads the capacity already resolved by the provider; no extra provider call.
3307
+ - §tokenomics-calibrated-readout **The readout is calibrated to the answering model.** The model-independent ruler overstates what a tokenizer charges by a model-specific ratio (1.3–1.6× on Qwen3.8 packets, measured 2026-09-02, which fired the pressure mandate at half the real ceiling). Before rendering the readout, Core takes this model's last five settled emission responses that pair a measured packet weight with a provider-reported prompt count and scales `tokensActiveTotal`, the pressure-inventory figures, and the overflow admission by reported ÷ measured. Fewer than three samples leave the factor at 1. Samples are keyed by the model name the provider reports, so a model change starts from 1 again; stored weights and the client gauge stay in the model-independent ruler ({§tokenomics-agnostic-ruler}).
3254
3308
  - §tokenomics-window-partition **One capacity derivation; no service-side token budget.** The provider owns model limits and the configured total output envelope. Its resolved `inputCapacity` is the numeric curation-budget calibration as well as the physical denominator exposed to clients. That reuse is policy, not a unit conversion: Core compares stable curation weight with it only to shape context, while provider request-shaped evidence alone admits or rejects I/O. `PLURNK_SERVICE_PROMPT_BUDGET`, `PLURNK_SERVICE_SAFETY`, and the additive reasoning/completion reserve knobs are retired; local and custom deployments tune context window, total output budget, optional reasoning subset, and prompt-projection percentage at their owning layers.
3255
3309
  - §tokenomics-prompt-projection-share **Prompt projection is stable packet policy.**
3256
3310
  `PLURNK_SERVICE_PROMPT_PROJECTION` is a required alias-scoped percentage in
@@ -3266,11 +3320,11 @@ time of measurement.
3266
3320
  - **Derivation is exhaustive and demand-led.** Explicit searchable-resource changes may start one coalesced warm. Passive creation and attachment do not. The first model turn starts or joins that warm; later turns derive intervening changes before dispatch. No model operation observes partial graph or vector coverage. A semantic query ranks every eligible candidate in scope, so lexical overlap never gates vector recall. With no embedder, readable-content FTS is the explicit keyword fallback. Progress notices make the wait visible; latency is never hidden by partial semantics. {§derivation-exhaustive}
3267
3321
  - §membership-binary-sniff **Binary truth beats the label; no entry dominates the corpus.** A tracked member whose HEAD bytes contain NUL enters {§membership-source-projection} as `application/octet-stream` **regardless of what extension-based detection claims**; byte-level evidence outranks a default label. Every eligible text is tiled losslessly to the embedder window and every tile is embedded before its derivation attaches; semantic ranking max-pools the best chunk per candidate.
3268
3322
  - §tokenomics-agnostic-ruler **One model-agnostic curation ruler.** The daemon runs workers on different models in one workspace concurrently, while catalog and log accounting are workspace-wide. `contentWeight = ceil(chars/2)` therefore gives one content one stable number without per-model workspace state or recount passes. It controls curation only; every provider call independently measures the complete request as well as it can.
3269
- - §tokenomics-neutral-telemetry **Curation telemetry is state, not response allowance.** The model-facing `Context Token Budget` section begins with exactly two fields on separate lines: `tokensActiveTotal: N (P%)` and `tokensActiveMax: M`. It never presents their difference as free response tokens. The protocol definition directly requires FOLD, KILL, or trimming of irrelevant log items to keep the next packet within the maximum. Per-entry weights remain on log rows where they describe OPEN cost and FOLD savings. Generic packet composition and physical-token speculation are absent.
3270
- - §tokenomics-pressure-inventory **Pressure identifies its reclaimable concentration.** When the ordinary two-field packet measurement reaches 80% of `tokensActiveMax`, the budget section may append `YOU MUST FOLD, KILL, or trim superseded, stale, or irrelevant log content.` followed by `Largest Log Items`: at most five currently OPEN, addressed log bodies, ordered by `tokensActive` descending and then `log:///` path. Each item repeats only that row's `tokensBody` and `tokensActive`. Folded and bodyless rows cannot enter the list because FOLD would reclaim no body from them. The largest prefix that fits may be shown; this conditional block never pushes an otherwise admissible packet over its maximum. Its own weight participates in the final fixed-point `tokensActiveTotal`.
3323
+ - §tokenomics-neutral-telemetry **Curation telemetry is state, not response allowance.** The model-facing `Context Token Budget` section is one JSON object carrying `tokensActiveTotal` and `tokensActiveMax` (and `tokensResponseMax` when an output floor is disclosed), so the block opens as a JSON payload like `## PLAN0`. It never presents their difference as free response tokens. The protocol definition directly requires KILL of irrelevant log items and ranges to keep the next packet within the maximum. Per-entry weights remain on log rows where they describe visible cost and curation savings. Generic packet composition and physical-token speculation are absent.
3324
+ - §tokenomics-pressure-inventory **Pressure identifies its reclaimable concentration.** When the ordinary two-field packet measurement reaches 80% of `tokensActiveMax`, the JSON object gains a `tokensActiveLargest` array at most five currently visible, addressed log bodies, each a flat `{path, tokensBody, tokensActive}` object ordered by `tokensActive` descending and then `log:///` path and the `YOU MUST KILL superseded, stale, or irrelevant log items and ranges.` mandate follows the object, naming the targets it lists. Folded and bodyless rows cannot enter the list because a scoped KILL would reclaim no body from them. The largest prefix that fits may be shown; this conditional block never pushes an otherwise admissible packet over its maximum. Its own weight participates in the final fixed-point `tokensActiveTotal`.
3271
3325
  - §tokenomics-content-hash-identity **Content identity, not per-tokenizer counts.** Static channel writes stamp `content_hash` (SHA-256) as stable content identity. `weight` is stored beside that content and is never keyed or recomputed by model.
3272
- - §tokenomics-provider-usage **Provider accounting is physical-request evidence, not curation state.** Every issued physical request has one durable pre-I/O `provider_requests` identity beneath the normalized {§inference-ledger} and settles once as response or error. Each record preserves conventional {§provider-usage} quantities and required {§provider-cost} evidence; an unreported quantity remains absent, including on response-less failures, and is never replaced by zero. `model_calls` and `embedding_calls` own domain response/failure evidence, `turn_attempts` specialize emission admission, and `provider_requests` are the sole durable accounting representation. Emissions, BARE calls, embeddings, rejected responses, retries, failovers, and errors therefore remain cardinal and ordered. Turn, loop, worker, workspace, digest, and protocol accounting are derived from those records through the shared {§provider-accounting} projection; only emission calls contribute the latest-packet context gauge. The baseline stores no floating-point money, denormalized totals, or rollup triggers. A documented direct charge becomes `charged`; otherwise the provider may compute an exact-decimal USD `estimated` amount from complete usage and the exact model's Models.dev rates; insufficient evidence becomes `unknown`. Derived `costUsd` sums every USD-expressible request and is `null` only when no request is expressible; a response-less failure or an uncataloged model is skipped, never allowed to erase the expressible evidence. Each derived aggregate usage field independently sums its reported quantity, so heterogeneous detail coverage remains partial rather than becoming fictitiously complete. This is operational request accounting, not invoice reconciliation. Output and reasoning are quantities the model cannot FOLD, so they never alter the model-facing Budget ledger.
3273
- - §tokenomics-negative-pressure **Negative curation pressure is honest but never submitted.** The provisional readout may report `tokensActiveTotal` and its percentage above `tokensActiveMax`. Crossing the maximum diverts that would-be model turn into {§overflow-turn}; no over-ceiling packet reaches `provider.generate`. Automatic recovery does not create a strike or consume a model-turn allowance.
3326
+ - §tokenomics-provider-usage **Provider accounting is physical-request evidence, not curation state.** Every issued physical request has one durable pre-I/O `provider_requests` identity beneath the normalized {§inference-ledger} and settles once as response or error. Each record preserves conventional {§provider-usage} quantities and required {§provider-cost} evidence; an unreported quantity remains absent, including on response-less failures, and is never replaced by zero. `model_calls` and `embedding_calls` own domain response/failure evidence, `turn_attempts` specialize emission admission, and `provider_requests` are the sole durable accounting representation. Emissions, BARE calls, embeddings, rejected responses, retries, failovers, and errors therefore remain cardinal and ordered. Turn, loop, worker, workspace, digest, and protocol accounting are derived from those records through the shared {§provider-accounting} projection; only emission calls contribute the latest-packet context gauge. The baseline stores no floating-point money, denormalized totals, or rollup triggers. A documented direct charge becomes `charged`; otherwise the provider may compute an exact-decimal USD `estimated` amount from complete usage and the exact model's Models.dev rates; insufficient evidence becomes `unknown`. Derived `costUsd` sums every USD-expressible request and is `null` only when no request is expressible; a response-less failure or an uncataloged model is skipped, never allowed to erase the expressible evidence. Each derived aggregate usage field independently sums its reported quantity, so heterogeneous detail coverage remains partial rather than becoming fictitiously complete. This is operational request accounting, not invoice reconciliation. Output and reasoning are quantities the model cannot KILL, so they never alter the model-facing Budget ledger.
3327
+ - §tokenomics-negative-pressure **Negative curation pressure is honest but never submitted.** The provisional readout may report `tokensActiveTotal` above `tokensActiveMax`. Crossing the maximum diverts that would-be model turn into {§overflow-turn}; no over-ceiling packet reaches `provider.generate`. Automatic recovery does not create a strike or consume a model-turn allowance.
3274
3328
 
3275
3329
  ### §membership Workspace identity, membership, disk co-location
3276
3330
 
@@ -3308,7 +3362,7 @@ query is the absolute identity ({§scheme-address-network}); the sanitized
3308
3362
  readable projection is the fragmentless default, while faithful DOM, origin
3309
3363
  media type, and projection identity remain explicit auxiliary evidence. A
3310
3364
  normal
3311
- `## READ0 (https://host/path?query)` therefore publishes only the sanitized body
3365
+ `### READ0 (https://host/path?query)` therefore publishes only the sanitized body
3312
3366
  under that exact URL—never raw HTML, response headers, or a channel-selection
3313
3367
  lesson. FIND and embeddings consume the addressed stored channel representation
3314
3368
  and never re-fetch a match.
@@ -3361,7 +3415,7 @@ and never re-fetch a match.
3361
3415
  - §membership-git-hermetic Native Git runs with ambient `GIT_*` and
3362
3416
  global/system config scrubbed, so repository identity follows `project_root`,
3363
3417
  never the daemon's launch environment.
3364
- - §membership-edit-membership-gate **Membership-gated edits.** EDIT is bounded by membership exactly as READ is. An existing **member**'s baseline is its entry snapshot — the body channel the model READ, not a fresh disk read — so the diff is naive against the view the model saw, never empty (the write-side CAS, {§membership-edit-write-cas}, prevents the silent overwrite of out-of-band drift). An existing **non-member** is refused (403) *before* any read or write: the model never reads a file it can't see (no leak into the proposal) and never overwrites one (no wiping a gitignored `.env` it never added). A **new path** crosses the creation matrix in {§fs-write-surface}; proposal acceptance cannot bypass its scope, exclusion, or incorporation rules. Reaching past membership is `## EXEC0 [sh]`'s job, not the file scheme's.
3418
+ - §membership-edit-membership-gate **Membership-gated edits.** EDIT is bounded by membership exactly as READ is. An existing **member**'s baseline is its entry snapshot — the body channel the model READ, not a fresh disk read — so the diff is naive against the view the model saw, never empty (the write-side CAS, {§membership-edit-write-cas}, prevents the silent overwrite of out-of-band drift). An existing **non-member** is refused (403) *before* any read or write: the model never reads a file it can't see (no leak into the proposal) and never overwrites one (no wiping a gitignored `.env` it never added). A **new path** crosses the creation matrix in {§fs-write-surface}; proposal acceptance cannot bypass its scope, exclusion, or incorporation rules. Reaching past membership is `### EXEC0 (sh)`'s job, not the file scheme's.
3365
3419
  - §membership-create-parents **Parent-complete creation.** An accepted File creation—whether authored as EDIT or as a COPY/MOVE destination—recursively creates missing parent directories before writing and registering the new member.
3366
3420
 
3367
3421
  **The overlay — `include | exclude`.** `workspace_constraints` holds the `members` family's projected definitions and the engine's creation records ({§members-projection}). Resolved membership is `(project repository files ∪ include) − exclude`.
@@ -3438,7 +3492,7 @@ The CAS is the **hard backstop**, at the moment of writing, on every accept path
3438
3492
 
3439
3493
  §membership-git-flags **Permission flags.** Service-wide Git admission comes from {§operator-config-git-ceiling}. `PLURNK_SERVICE_GIT_AUTO=1` (default) includes the repository containing `project_root`; `=0` disables automatic Git membership, leaving member definitions as the only membership source. `ALLOWED` gates `AUTO`.
3440
3494
 
3441
- **Rationale.** Workspace is the right scope unit and the containing Git repository is its ordinary development boundary. Membership curation is tiered: Git bounds it by tracking, the client supersedes by overlay, and the model curates its render by READ/FOLD. Supporting several independent repositories as one world would require Plurnk-owned topology, synchronization, and model teaching that Git already solves cleanly by treating them as separate workspaces.
3495
+ **Rationale.** Workspace is the right scope unit and the containing Git repository is its ordinary development boundary. Membership curation is tiered: Git bounds it by tracking, the client supersedes by overlay, and the model curates its render by READ/KILL. Supporting several independent repositories as one world would require Plurnk-owned topology, synchronization, and model teaching that Git already solves cleanly by treating them as separate workspaces.
3442
3496
 
3443
3497
  **Schema.** The version-1 baseline stores the normalized {§inference-ledger},
3444
3498
  its generation or embedding specialization, emission admission, and cardinal
@@ -3458,7 +3512,7 @@ flowchart TD
3458
3512
  assemble["Assemble and measure<br/>candidate request"] --> budget{"Weight ≤ curation ceiling?"}
3459
3513
  budget -->|yes| generate["Provider generate"]
3460
3514
  budget -->|no| recover["Keep turn packetless<br/>reclassify as `_plurnk` overflow"]
3461
- recover --> fold["Dispatch PLAN, whole-body FOLD ops,<br/>and SEND through ordinary dispatch"]
3515
+ recover --> fold["Dispatch PLAN, whole-body scoped KILL ops,<br/>and SEND through ordinary dispatch"]
3462
3516
  fold --> verify{"Rebuilt request fits?"}
3463
3517
  verify -->|yes| next["Next model turn"]
3464
3518
  verify -->|no| stop["Terminal 413"]
@@ -3484,19 +3538,19 @@ at its first overflow because four embedding calls were counted as history). Pac
3484
3538
  remain ordinary turn chronology but do not consume `maxTurns`, model-call,
3485
3539
  emission-attempt, usage, or cost accounting.
3486
3540
 
3487
- - §overflow-turn-script **Recovery is one ordinary admitted `_plurnk` program.** Its canonical {§plan-value} has one `medium`, `in_progress` entry whose content is `Automatically FOLD log bodies newly active at token-budget overflow.`, followed by every causal whole-body FOLD and terminal `SEND0 [102]` with body `Next: YOU MUST ONLY FOLD, KILL, or trim ALL superseded, stale, or irrelevant log content in bulk.` The final sentence requires the successor's substantive operations to be one dedicated, comprehensive bulk-curation program. Core authors this internal program with canonical PLAN and SEND framing. Its exact `turnOps` is born FOLDED; successful FOLD rows follow {§fold-open-meta-operations} and therefore remain durable but packet-suppressed. Every recovery row carries `_plurnk` and `overflow`; no model call, synthetic receipt, or parallel explanation exists.
3488
- - §overflow-turn-curation **The preceding turn owns the pressure it introduced.** Core deterministically selects every body already created in the packetless candidate turn, every body created by the immediately preceding completed turn in that worker's chronology, and every older body whose visibility that preceding turn's successful OPEN increased. Every selected body is FOLDed whole (`<1,-1>`) through ordinary dispatch. Already-wholly-folded and bodyless rows require no operation. Core performs no relevance judgment, exempts no operation or resource kind, reconstructs no interval delta, re-runs no authored selector, and chooses no unrelated older history.
3489
- - §overflow-turn-hard-413 **Recovery fails hard when the causal fold cannot fit.** After the ordinary FOLDs land, Core rebuilds and remeasures once. If the plan changes no visibility or the rebuilt request still exceeds the ceiling, the loop terminalizes with an exact `engine/context/token-budget-overflow` 413 Problem; Core neither submits excess bytes nor chooses unrelated older history. Separately, every `provider.generate` assesses physical capacity under {§provider-surface-capacity}. Core may retry a provider capacity rejection only after withholding automatic prompt-body projection when that changes the request. If it cannot produce changed bytes or the changed request is still rejected, the request-only model turn and provider-owned Problem terminalize at **413 Content Too Large**.
3541
+ - §overflow-turn-script **Recovery is one ordinary admitted `_plurnk` program.** Its canonical {§plan-value} has one `medium`, `in_progress` entry whose content is `Automatically KILL log bodies newly active at token-budget overflow.`, followed by every causal whole-body scoped KILL and terminal `### SEND0 (NEXT)` with body `Next: YOU MUST ONLY KILL superseded, stale, or irrelevant log content in bulk.` The final sentence requires the successor's substantive operations to be one dedicated, comprehensive bulk-curation program. Core authors this internal program with canonical PLAN and SEND framing. Its exact `turnOps` is born folded; successful KILL rows follow {§log-kill-meta-operation} and therefore remain durable but packet-suppressed. Every recovery row carries `_plurnk` and `overflow`; no model call, synthetic receipt, or parallel explanation exists.
3542
+ - §overflow-turn-curation **The preceding turn owns the pressure it introduced.** Core deterministically selects every body already created in the packetless candidate turn, every body created by the immediately preceding completed turn in that worker's chronology, Every selected body is KILLed whole (`<1,-1>`) through ordinary dispatch. Already-wholly-folded and bodyless rows require no operation. Core performs no relevance judgment, exempts no operation or resource kind, reconstructs no interval delta, re-runs no authored selector, and chooses no unrelated older history.
3543
+ - §overflow-turn-hard-413 **Recovery fails hard when the causal fold cannot fit.** After the ordinary scoped KILLs land, Core rebuilds and remeasures once. If the plan changes no visibility or the rebuilt request still exceeds the ceiling, the loop terminalizes with an exact `engine/context/token-budget-overflow` 413 Problem; Core neither submits excess bytes nor chooses unrelated older history. Separately, every `provider.generate` assesses physical capacity under {§provider-surface-capacity}. Core may retry a provider capacity rejection only after withholding automatic prompt-body projection when that changes the request. If it cannot produce changed bytes or the changed request is still rejected, the request-only model turn and provider-owned Problem terminalize at **413 Content Too Large**.
3490
3544
 
3491
3545
  - §tokenomics-fetch-fits-free **A retrieval larger than the available packet room remains addressable.** Its complete row lands in the model turn that requested it. If the following candidate packet exceeds the curation ceiling, {§overflow-turn-curation} FOLDs the new body and classifies it `_plurnk` and `overflow`; the exact body remains durable and selectively re-OPENable.
3492
3546
 
3493
- - §loop-terminals **Engine-imposed terminals are HTTP-precise** — the loop-status vocabulary, one meaning each: `200` concluded (the model's SEND signal `200`) · `499` model-abandoned (signal `499`, or a cancel) · `429` maxTurns exhausted · `413` token-ceiling recovery failure or provider input-capacity failure after changed-request recovery · `500` strike threshold or invalid-emission exhaustion (distinct Problem types; `508` when the crossing strike was a detected cycle) · `504` loop timeout / exec-timeout restamp · `202` the bounded wait — a loop blocked on a live obligation (the model's `## SEND0 [202] <T,P>`, {§wait-obligation-matrix}); a wait on nothing resolves to `200` unless a successful same-turn FOLD requires the curated next packet · `100`/`102` queued/running. Never a catch-all, never a new value without changing the owning schema.
3547
+ - §loop-terminals **Engine-imposed terminals are HTTP-precise** — the loop-status vocabulary, one meaning each: `200` concluded (the model's SEND signal `200`) · `499` model-abandoned (signal `499`, or a cancel) · `429` maxTurns exhausted · `413` token-ceiling recovery failure or provider input-capacity failure after changed-request recovery · `500` strike threshold or invalid-emission exhaustion (distinct Problem types; `508` when the crossing strike was a detected cycle) · `504` loop timeout / exec-timeout restamp · `202` the bounded wait — a loop blocked on a live obligation (the model's `### SEND0 (WAIT) <T,P>`, {§wait-obligation-matrix}); a wait on nothing resolves to `200` unless a successful same-turn scoped KILL requires the curated next packet · `100`/`102` queued/running. Never a catch-all, never a new value without changing the owning schema.
3494
3548
 
3495
3549
  §overflow-turn-surface **The packet is the resulting state, not an account of it.**
3496
3550
  The first request after recovery is assembled by the ordinary packet path from
3497
3551
  the actual durable log after the recovery turn. It therefore carries the prior
3498
- causal rows genuinely FOLDED, the recovery PLAN and SEND genuinely OPEN, and
3499
- the recovery `turnOps` genuinely FOLDED. Successful recovery FOLD receipts are
3552
+ causal rows genuinely folded, the recovery PLAN and SEND genuinely visible, and
3553
+ the recovery `turnOps` genuinely folded. Successful recovery KILL receipts are
3500
3554
  absent under the universal curation rule. No notice, reconstruction, auto-open,
3501
3555
  or overflow-specific projection simulates what `_plurnk` did; OPENing the exact
3502
3556
  `turnOps` reveals the program that did it. The model retains complete authority
@@ -3517,14 +3571,14 @@ flowchart LR
3517
3571
  parent --> pull["Pre-turn lossless pull<br/>(cursor, captured high-water]"]
3518
3572
  global --> pull
3519
3573
  pull --> log["Observer's self-contained log<br/>origin=_plurnk"]
3520
- log --> packet["Packet lists coordinate;<br/>OPEN recalls exact body"]
3574
+ log --> packet["Packet lists coordinate;<br/>READ recalls exact body"]
3521
3575
  ```
3522
3576
 
3523
3577
  §env-delta-log-pull **Pull the event record, never a world snapshot.** At
3524
3578
  pre-turn, a worker materializes only occurrences whose structural audience
3525
3579
  includes that worker. The set is exhaustive, unranked, and exactly once; the
3526
3580
  engine makes no relevance decision. Each copied event retains the operation,
3527
- result, typed attributes, and initial log classifications ({§log-item-tags}).
3581
+ result, and typed attributes.
3528
3582
  Every producer appends to one workspace-scoped occurrence journal with a
3529
3583
  monotonic identity. A pull captures one closed `(worker cursor, high-water]`
3530
3584
  interval, materializes each addressed identity idempotently, then advances the
@@ -3598,6 +3652,8 @@ flowchart LR
3598
3652
  body --> recall["READ log:///…<br/>recalls canonical body"]
3599
3653
  ```
3600
3654
 
3655
+ §edit-receipt-removed-text **A pure deletion's receipt quotes what it removed.** An applied effect that inserted nothing and removed at least one line carries `removedText` — the removed text, first 40 lines — projected on the wire as `removed`; an effect that inserted anything carries no such field, its resulting context shows the change.
3656
+
3601
3657
  §edit-receipt-anchored-context **An applied EDIT's resulting context carries anchors.** The bounded resulting context each effect renders (`PLURNK_SERVICE_EDIT_RECEIPT_CONTEXT_LINES` around and inside the landed region) is rendered exactly as a READ renders — `@xxxxx L:text`, hashed with the resource's READ identity ({§line-anchors}) — so the next batch cites the landed lines by anchor without a READ; both requiems of 2026-08-29 asked for this. A scheme that supplies no identity keeps the line-numbered form.
3602
3658
 
3603
3659
  §edit-result-receipt-projection **EDIT projects the scheme-owned batch
@@ -3614,7 +3670,8 @@ the aggregate remains dispatch coordination state.
3614
3670
  | `unit`, `before`, `after` | `extent` | Whole-line batches use line counts. A batch containing any exact four-coordinate edit uses Unicode code-point counts. |
3615
3671
  | `parseIssues.before`, `parseIssues.after` | `parseIssues` as `before→after` | Parser-recovery counts for complete source and landed revisions; omitted when both are clean or either is unavailable. |
3616
3672
  | `effect.requested`, `source`, `result` | `range` | The admitted marker and its normalized mapping from the common source snapshot into the landed body. |
3617
- | `effect.removed`, `inserted` | `change` | Removed and inserted counts in the receipt unit. |
3673
+ | `effect.removed`, `inserted` | `change` | Removed and inserted counts in the receipt unit. |
3674
+ | `effect.removedText` | `removed` | {§edit-receipt-removed-text}: a pure deletion's removed text, first 40 lines; absent when the edit inserted anything. |
3618
3675
  | `effect.context` | Canonical row body | Numbered physical lines at each landed boundary, bounded symmetrically by `PLURNK_SERVICE_EDIT_RECEIPT_CONTEXT_LINES`. |
3619
3676
  | `disposition`, `requested` | `disposition`, `requested` | A reviewer-replaced batch preserves the authored marker while stating that its attributed effect was superseded. |
3620
3677
  | `replacement` | `replacement`, `change`, canonical proposal-owner body | The one whole-resource effect actually applied by the reviewer replacement; never duplicated across authored rows. |
@@ -3764,7 +3821,7 @@ of section weights for the rendered request weight.
3764
3821
  |--------------------------|------|
3765
3822
  | Operator, wire, storage | Use the applicable industry term. Provider quantities follow the OpenAI vocabulary where it is standard: `contextWindow`, `reasoning`, `completion`, `finish_reason`, and usage nouns. |
3766
3823
  | Core lifecycle | Use the exact Workspace → Worker → Loop → Turn → Op hierarchy in {§lifecycle-terms}. An AG-UI Run or thread is always protocol-qualified. |
3767
- | Model-facing packet | Use the model's training distribution: operations mirror HTTP and shell, `display` mirrors CSS, and jsonplurnk remains JSON. Renaming this vocabulary to internal API terminology would discard useful resonance for a standard the model never sees. |
3824
+ | Model-facing packet | Use the model's training distribution: operations mirror HTTP and shell, while log records use ordinary Markdown headings, strict JSON metadata, and text coordinates. Renaming this vocabulary to internal API terminology would discard useful resonance for a standard the model never sees. |
3768
3825
 
3769
3826
  | PLURNK-native term | Why it remains |
3770
3827
  |--------------------------------|----------------|
@@ -3789,22 +3846,22 @@ evidence when a downstream standard cannot represent the complete list.
3789
3846
 
3790
3847
  §body-projection **One full body, one packet projection.** Every durable log row has one canonical full body resolved from its stored tx/rx envelope by `LogBody`. READ and FIND over `log:///`, persistent search derivation, and packet rendering all consume that same meaning. Only packet rendering may project it:
3791
3848
 
3792
- | row producer | ordinary OPEN projection |
3849
+ | row producer | ordinary visible projection |
3793
3850
  |---|---|
3794
3851
  | any `READ` or `FIND` | complete selected operation result |
3795
3852
  | any `PLAN` | complete canonical Plurnk Plan JSON {§plan-value} |
3796
3853
  | actionless lowercase `prompt` | budgeted head under {§prompt-projection} |
3797
3854
  | structured `EDIT` receipt or textual `COPY`/`MOVE` effects | complete receipt-owned join context |
3798
3855
  | every other nonempty body | head bounded independently by `PLURNK_SERVICE_PREVIEW_LINES` and `PLURNK_SERVICE_PREVIEW_CHARS` |
3799
- | bodyless row | `"display":"none","body":""` |
3856
+ | bodyless row | metadata only; no coordinate lines or `tokensBody` |
3800
3857
 
3801
- READ and FIND own their range or pagination before packet rendering; the packet never applies a second hidden substring bound to their selected result. PLAN is likewise complete while OPEN: it is the model's explicit persistent reasoning inventory, serialized once as compact JSON rather than clipped or reparsed from source text. Prompt rows follow their separate adaptive projection contract. Structured mutation contexts already carry the receipt-owned bound in {§edit-result-receipt-truth}, so packet rendering does not preview them again. Actionless source artifacts, SEND/WORK/FORK bodies, EXEC commands, environment-delta EDIT spans, and extension-produced bodies use the ordinary fixed bound. When an OPEN projection differs from its canonical body, `chunk` follows the displayed `body` with the exact selected and complete extents defined by {§jsonplurnk}; complete and FOLDED bodies omit it. `## READ0 (log:///<coordinate>/<OP>)` applies its default or explicit text range to the canonical body; the unsuffixed exact shorthand and authoritative suffix behavior are defined by {§log-coordinate-hierarchy}. `## FIND0 (log:///...)` and search match that same full body. FOLD hides the ordinary projection, and OPEN restores the producer's projection without changing its bound. System/policy sections are not log bodies. Notices are transient non-log observations; they share the ordinary line/character bounds but have no durable body or recovery URI.
3858
+ READ and FIND own their range or pagination before packet rendering; the packet never applies a second hidden substring bound to their selected result. PLAN is likewise complete while visible: it is the model's explicit persistent reasoning inventory, serialized once as compact JSON rather than clipped or reparsed from source text. Prompt rows follow their separate adaptive projection contract. Structured mutation contexts already carry the receipt-owned bound in {§edit-result-receipt-truth}, so packet rendering does not preview them again. Actionless source artifacts, SEND/WORK/FORK bodies, EXEC commands, environment-delta EDIT spans, and extension-produced bodies use the ordinary fixed bound. When a visible projection differs from its canonical body, metadata carries `chunk` with the exact selected and complete extents defined by {§log-wire-format}; complete and FOLDED bodies omit it. `### READ0 (log:///<coordinate>/<OP>)` applies its default or explicit text range to the canonical body; the unsuffixed exact shorthand and authoritative suffix behavior are defined by {§log-coordinate-hierarchy}. `### FIND0 (log:///...)` and search match that same full body. A scoped KILL hides the ordinary projection without changing its bound. System/policy sections are not log bodies. Notices are transient non-log observations; they share the ordinary line/character bounds but have no durable body or recovery URI.
3802
3859
 
3803
- §prompt-entry **Prompt as a first-class entry and log row.** Each prompt is stored once at `prompt:///<loop>/<N>` as an owner-keyed text/markdown entry — written before any turn of its loop executes, so the initialization COPY ({§worker-initialization-entry}) archives a real source — then published to its first model turn as one actionless lowercase `prompt` log row; that row, not the entry, records publication. No synthetic EDIT or READ operation is invented. The row is born OPEN and obeys {§body-projection}. The **Active User Prompts** section closes the user-slot status clump as a paths-only list (`* prompt:///<loop>/<N>`), so every frame remains directly READable even after its log row is folded or killed.
3860
+ §prompt-entry **Prompt as a first-class entry and log row.** Each prompt is stored once at `prompt:///<loop>/<N>` as an owner-keyed text/markdown entry — written before any turn of its loop executes, so the initialization COPY ({§worker-initialization-entry}) archives a real source — then published to its first model turn as one actionless lowercase `prompt` log row; that row, not the entry, records publication. No synthetic EDIT or READ operation is invented. The row is born visible and obeys {§body-projection}. The **Active User Prompts** section closes the user-slot status clump as a paths-only list (`* prompt:///<loop>/<N>`), so every frame remains directly READable even after its log row is folded or killed.
3804
3861
 
3805
3862
  §prompt-causal-source **Prompt authorship and delivery are distinct facts.** The harness publishes every prompt row with `origin="_plurnk"`; the row's existing `source` carries the canonical address of a different causal actor. Native WORK, FORK, and directed worker SEND derive `worker://<sender>` from the authenticated sender worker ID. A trusted exterior adapter may supply its own canonical actor address through {§methods-loop-run}. An absent source means the owning worker itself. Attribution persists with the prompt frame through active delivery, parking, orphan recovery, restart, and later log projection; model syntax cannot author it.
3806
3863
 
3807
- §prompt-projection **Prompt storage is unbounded by model context; automatic materialization is not.** Core persists every accepted prompt completely before packet assembly. The selected provider's derived `inputCapacity` and the alias-resolved percentage from `PLURNK_SERVICE_PROMPT_PROJECTION` derive one aggregate curation-weight allowance for OPEN prompt bodies. Complete prompt bodies render when their aggregate weight fits. Otherwise all OPEN prompt rows share the allowance: full bodies consume only their required share, unused shares are redistributed, and partial bodies render the largest leading complete-line region that fits their share or an exact character-bound prefix when the first physical line alone is larger. The sum of their rendered body weights never exceeds the allowance. Every partial body carries its exact `chunk` after `body`; the canonical `prompt:///` entry and `log:///` body remain complete and READ/FIND-addressable. When provider input capacity is unknown the percentage is underivable, so prompt rows retain the ordinary bounded projection rather than inventing capacity. This policy never rejects, summarizes, or discards a prompt because it exceeds a context window.
3864
+ §prompt-projection **Prompt storage is unbounded by model context; automatic materialization is not.** Core persists every accepted prompt completely before packet assembly. The selected provider's derived `inputCapacity` and the alias-resolved percentage from `PLURNK_SERVICE_PROMPT_PROJECTION` derive one aggregate curation-weight allowance for visible prompt bodies. Complete prompt bodies render when their aggregate weight fits. Otherwise all visible prompt rows share the allowance: full bodies consume only their required share, unused shares are redistributed, and partial bodies render the largest leading complete-line region that fits their share or an exact character-bound prefix when the first physical line alone is larger. The sum of their rendered body weights never exceeds the allowance. Every partial body carries its exact `chunk` metadata; the canonical `prompt:///` entry and `log:///` body remain complete and READ/FIND-addressable. When provider input capacity is unknown the percentage is underivable, so prompt rows retain the ordinary bounded projection rather than inventing capacity. This policy never rejects, summarizes, or discards a prompt because it exceeds a context window.
3808
3865
 
3809
3866
  §prompt-self-only The frame is self-only and owner-keyed:
3810
3867
  `entries.owner_id` carries worker identity while the address carries only the
@@ -3843,8 +3900,8 @@ retain distinct contracts and lifetimes.
3843
3900
  `status_rx ≥ 400` and an RFC 9457 Problem Details operation result in `rx`.
3844
3901
  There is no per-category handling or bespoke ephemeral relationship. The
3845
3902
  `errors` section is a derived index over those rows from the current and
3846
- immediately prior turn: one terse `<status> log:///<coord>` link per row,
3847
- nothing else. The Problem lives on the foldable row, READ via the link.
3903
+ immediately prior turn: one `{status, path}` JSON object per row,
3904
+ nothing else. The Problem lives on the foldable row, READ via the path.
3848
3905
  - §log-row-self-explains **Every ≥400 pointer names a record that states its
3849
3906
  why.** A model-operation failure is the model's own operation result; its
3850
3907
  Problem Details `instance` is that row's `log:///` URI and packet wire renders
@@ -3901,7 +3958,7 @@ retain distinct contracts and lifetimes.
3901
3958
 
3902
3959
  §digest-wire-line **Wire health aggregated.** Each worker summary renders a `Wire:` line — total physical provider requests, error-outcome count, and the error percentage when nonzero. Provider-level failures are absorbed by retries below the packet stream, so without this aggregate a rate-limit storm is invisible in every summary while the model's experience stays clean.
3903
3960
 
3904
- §digest-forensic-fidelity **Forensic fidelity and cardinality.** The digest's machine-readable JSON preserves every log event with its initial and current projection, causal `source`, tags, and structured `attrs`; every exact OPEN/FOLD/log-KILL target effect; the exact Problem on every failed row; each loop's exact terminal result; and every ordered physical provider request. KILLed `turnOps` still produce their chronological `assistant.md` artifacts because curation cannot rewrite what a producer submitted. Each stored packet validates independently: one malformed historical packet remains exact raw evidence with its complete validation error chain and never prevents healthy turns from being projected. Accounting on broader rows is the shared exact derivation from that ledger, never a second stored fact. A worker's Cost line names how many settled requests carry no usage at all (errored or aborted exchanges) — their server-side spend is unrecorded rather than silently priced as zero. The reasoning chronology distinguishes readable reasoning content from provider-reported reasoning usage: when tokens were reported but no readable content was returned, it states both facts instead of implying that no reasoning occurred. The human Markdown waterfall shows a present causal source and may preview only the Problem detail because it remains a triage projection, not the machine record. Targets reconstruct the model-visible address, including hostname, port, serialized query, and fragment; an authority-bearing URL must never degrade from `https://host/path` to `https:///path`, and durable resource coordinates render back to their authority form. Its human Markdown waterfall groups identical per-turn op outcomes and typed `entry_materialized` narrations, reporting the exact count and sequence span (`xN (seq A-B)`). Grouping keys include source and the complete target, so distinct causes, authorities, or channels never collapse. Thus amplification is conspicuous without making the diagnostic artifact itself pathological; valid packet files remain byte-identical records of what the model saw.
3961
+ §digest-forensic-fidelity **Forensic fidelity and cardinality.** The digest's machine-readable JSON preserves every log event with its initial and current projection, causal `source`, tags, and structured `attrs`; every exact log-KILL target effect; the exact Problem on every failed row; each loop's exact terminal result; and every ordered physical provider request. KILLed `turnOps` still produce their chronological `assistant.md` artifacts because curation cannot rewrite what a producer submitted. Each stored packet validates independently: one malformed historical packet remains exact raw evidence with its complete validation error chain and never prevents healthy turns from being projected. Accounting on broader rows is the shared exact derivation from that ledger, never a second stored fact. A worker's Cost line names how many settled requests carry no usage at all (errored or aborted exchanges) — their server-side spend is unrecorded rather than silently priced as zero. The reasoning chronology distinguishes readable reasoning content from provider-reported reasoning usage: when tokens were reported but no readable content was returned, it states both facts instead of implying that no reasoning occurred. The human Markdown waterfall shows a present causal source and may preview only the Problem detail because it remains a triage projection, not the machine record. Targets reconstruct the model-visible address, including hostname, port, serialized query, and fragment; an authority-bearing URL must never degrade from `https://host/path` to `https:///path`, and durable resource coordinates render back to their authority form. Its human Markdown waterfall groups identical per-turn op outcomes and typed `entry_materialized` narrations, reporting the exact count and sequence span (`xN (seq A-B)`). Grouping keys include source and the complete target, so distinct causes, authorities, or channels never collapse. Thus amplification is conspicuous without making the diagnostic artifact itself pathological; valid packet files remain byte-identical records of what the model saw.
3905
3962
 
3906
3963
  §digest-executor-evidence **A red command is work, not a defect.** Engine-materialized
3907
3964
  completion rows for a failed command carry the executor's problem identity
@@ -3952,7 +4009,7 @@ document contains its {§executor-tool-document}; a runtime with an exact
3952
4009
  {§executor-tool-registry} materializes the same single document — per-target
3953
4010
  child documents do not exist, shown or stored. The family document summarizes
3954
4011
  the server or runtime, lists every enabled target as a directly copyable
3955
- `## EXEC0` heading with its input signature ({§operation-annotation} carries the
4012
+ `### EXEC0` heading with its input signature ({§operation-annotation} carries the
3956
4013
  target one-liner; no invocation dispatch would reject is ever advertised), and
3957
4014
  carries each detailed target's richer input-side contract as a
3958
4015
  `## <target>` section of the same document, that target's own headings demoted
@@ -3979,12 +4036,12 @@ shared by discovery and dispatch. A runtime declaration may carry
3979
4036
  subtree ({§worker-generated-subtree}). Absent, its docs live in the internal
3980
4037
  `_plurnk/plurnk` namespace; present (attached MCP families: `/tools`),
3981
4038
  the family document materializes at `_plurnk` + that root in the
3982
- worker's private entry space. Turn 0 surveys the families (`## FIND0 [+init,+tools]
4039
+ worker's private entry space. Turn 0 surveys the families (`### FIND0 [+init,+tools]
3983
4040
  (worker://~/_plurnk/tools/*.md)`, one row per
3984
4041
  server carrying its summary) and, for each server named in
3985
4042
  `PLURNK_MCP_EXPANDED`, adds one FIND over its family document matching the
3986
- `## EXEC0` headings (`## FIND0 [+init,+tools] (worker://~/_plurnk/tools/<server>.md)`
3987
- with `/^## EXEC0 .*\n.*$/m`), so turn 0 names every tool with its annotation and
4043
+ `### EXEC0` headings (`### FIND0 (worker://~/_plurnk/tools/<server>.md)`
4044
+ with `/^### EXEC0 .*\n.*$/m`), so turn 0 names every tool with its annotation and
3988
4045
  signature — one row per tool, paged like every survey. No document is delivered
3989
4046
  unasked.
3990
4047
  Attached tools are capabilities like every other runtime; the model never
@@ -3993,7 +4050,7 @@ learns an origin.
3993
4050
  §members-functionality **File membership is one Worker Functionality family.**
3994
4051
  Core registers the `members` family with the coordinator ({§functionality-coordinator}):
3995
4052
  the model, the client, and the operator learn one surface — `list | discover | add |
3996
- enable | disable | remove`, `worker.members.<verb>` for the client, `## EXEC0 [members]
4053
+ enable | disable | remove`, `worker.members.<verb>` for the client, `### EXEC0 [members]
3997
4054
  (<verb>)` for the model — for what the model may see, exactly as they do for skills and
3998
4055
  MCP servers. A definition is one gitignore-style glob, `{ glob }`, relative to the project
3999
4056
  root; a leading `!` excludes matching members, and an exclusion wins over every inclusion.
@@ -4047,8 +4104,9 @@ its adapter owns protocol truth for standard Agent Skills and nothing else. A
4047
4104
  definition is `SkillDefinition` — the standard skill `name`, the universal
4048
4105
  root `scope` (`project` = `<projectRoot>/.agents/skills`, `global` =
4049
4106
  `~/.agents/skills`), and for a Worker-installed skill the standard installer
4050
- `source` that provides it. Plurnk bundles no skills of its own and never
4051
- seeds or mutates a universal root absent an explicit `add`/`remove`.
4107
+ `source` that provides it. Plurnk seeds no universal root and mutates none
4108
+ absent an explicit `add`/`remove`; its one bundled skill document is never a
4109
+ root at all ({§git-skill}).
4052
4110
 
4053
4111
  *Available definitions.* The filesystem is the only truth about installation:
4054
4112
  every `<root>/<name>/SKILL.md` directory under the project then the global
@@ -4091,6 +4149,17 @@ preserved verbatim ({§functionality-documents}). They are discovered by the
4091
4149
  turn-0 `+init,+skills` FIND survey; disabled and unavailable skills are
4092
4150
  absent from model teaching.
4093
4151
 
4152
+ §git-skill **The git skill is a bundled document, surfaced where it applies.** `git.md`
4153
+ (the teaching corpus's `skillDocs.git`, shipped by `@plurnk/plurnk-meta`) is a knowledge
4154
+ document, not a tool: it teaches commits as the only shareable state, one branch-shaped child
4155
+ per checkout, worktrees for parallel children, deliberate merging, and the history a worker
4156
+ must not rewrite. The worker documentation reconciliation materializes it as the worker-private
4157
+ entry `worker://~/_plurnk/skills/git.md` when, and only when, the workspace's project root sits
4158
+ inside a git repository ({§membership}); it touches no universal skill root and installs
4159
+ nothing. The turn-0 survey `FIND (worker://~/_plurnk/skills/*.md)` therefore lists it, with
4160
+ its summary, exactly for the workspaces where it applies, and a plain-directory workspace never
4161
+ sees it.
4162
+
4094
4163
  §skills-remove **`remove` uninstalls what the Worker installed.** Before the
4095
4164
  coordinator forgets a Worker-origin skill definition the adapter removes that
4096
4165
  skill from the definition's scope through the standard CLI (`remove <name>
@@ -4117,7 +4186,7 @@ section because they are language extensions rather than executable tools.
4117
4186
 
4118
4187
  ### §schemes user.schemes — the resource directory
4119
4188
 
4120
- §schemes-directory A `## Resources` section renders in the system slot **after the policy sections** — a terse directory of the scheme families available to this worker, so the model knows what URI resources and operations exist before it acts. Each scheme that ships a `manifest.example` contributes one or more concise canonical ops (no scheme prefix; each example self-documents) into a `plurnk` fence. Scheme example sets are separated by one blank line. The doc is NOT linked inline — it is materialized as the worker-private skill `worker://~/_plurnk/plurnk/<scheme>.md` and discovered via the turn-0 `## FIND0 [+init,+skills] (worker://~/_plurnk/plurnk/*.md)` survey ({§skills-functionality}), keeping the raw packet free of doc links. Meta-owned `worker` depth is required teaching ({§teaching-corpus}); a failed source read rejects materialization with its cause and never falls back. Other core and plugin schemes may supply optional `manifest.documentation`; absence contributes no pull doc. The verbose semantics live in that pull doc (materialized like any entry, READ on demand), not the hot path — terse pushes, depth pulls. A scheme with no example (provisional) is omitted; `PLURNK_SERVICE_DOCS_EXCLUDE` drops a named scheme's examples + doc. The directory includes only examples admitted by the effective worker-level capability layers, and Turn0 further narrows discovery through its loop policy using the same resolver ({§capability-admission}); the packet never baits an operation its own admission path will refuse. Materialized pull docs remain worker state, while their discoverability and execution remain policy-bound.
4189
+ §schemes-directory A `## Resources` section renders in the system slot **after the policy sections** — a terse directory of the scheme families available to this worker, so the model knows what URI resources and operations exist before it acts. Each scheme that ships a `manifest.example` contributes one or more concise canonical ops (no scheme prefix; each example self-documents) into an `example` fence. Scheme example sets are separated by one blank line. The doc is NOT linked inline — it is materialized as the worker-private skill `worker://~/_plurnk/plurnk/<scheme>.md` and discovered via the turn-0 `### FIND0 (worker://~/_plurnk/plurnk/*.md)` survey ({§skills-functionality}), keeping the raw packet free of doc links. Meta-owned `worker` depth is required teaching ({§teaching-corpus}); a failed source read rejects materialization with its cause and never falls back. Other core and plugin schemes may supply optional `manifest.documentation`; absence contributes no pull doc. The verbose semantics live in that pull doc (materialized like any entry, READ on demand), not the hot path — terse pushes, depth pulls. A scheme with no example (provisional) is omitted; `PLURNK_SERVICE_DOCS_EXCLUDE` drops a named scheme's examples + doc. The directory includes only examples admitted by the effective worker-level capability layers, and Turn0 further narrows discovery through its loop policy using the same resolver ({§capability-admission}); the packet never baits an operation its own admission path will refuse. Materialized pull docs remain worker state, while their discoverability and execution remain policy-bound.
4121
4190
 
4122
4191
  ### §inject system.inject — the operator injection
4123
4192
 
@@ -4125,7 +4194,7 @@ section because they are language extensions rather than executable tools.
4125
4194
 
4126
4195
  ### §policy system.policy — the client's policy injection
4127
4196
 
4128
- §policy-sections One section rides the system slot **after the definition and before capability teaching**: `## Policy` from `PLURNK_SERVICE_POLICY` (default `$XDG_CONFIG_HOME/plurnk/AGENTS.md`, {§host-path-layout}). Policy is the client's authoritative rules promoted into the privileged zone — NOT a curatable, foldable, READ-able entry; the model cannot FOLD it away. A default-absent path is silent (the section is omitted); an explicit override (env set) that fails to read fails the turn hard — a deliberate setting with a broken path is a misconfig, surfaced not hidden. Read per-turn so edits take effect live. The PROJECT `AGENTS.md` is local guidance, not policy: it rides turn 0 as the foisted `worker://~/_plurnk/agents.md` entry ({§turn0-agents-stunt}); all other reference material is skills under the worker's private skills tree ({§skills-functionality}).
4197
+ §policy-sections One section rides the system slot **after the definition and before capability teaching**: `## Policy` from `PLURNK_SERVICE_POLICY` (default `$XDG_CONFIG_HOME/plurnk/AGENTS.md`, {§host-path-layout}). Policy is the client's authoritative rules promoted into the privileged zone — NOT a curatable, foldable, READ-able entry; the model cannot KILL it away. A default-absent path is silent (the section is omitted); an explicit override (env set) that fails to read fails the turn hard — a deliberate setting with a broken path is a misconfig, surfaced not hidden. Read per-turn so edits take effect live. The PROJECT `AGENTS.md` is local guidance, not policy: it rides turn 0 as the foisted `worker://~/_plurnk/agents.md` entry ({§turn0-agents-stunt}); all other reference material is skills under the worker's private skills tree ({§skills-functionality}).
4129
4198
 
4130
4199
  On first run, and only when `$XDG_CONFIG_HOME/plurnk` itself is absent, the service seeds
4131
4200
  `AGENTS.md` from `@plurnk/plurnk-meta/POLICY.md` ({§teaching-corpus}).
@@ -4298,7 +4367,7 @@ SARIF region/replacement algebra for exact spans and same-snapshot ordering, not
4298
4367
  adoption of the SARIF interchange envelope.
4299
4368
 
4300
4369
  §slice-semantics-compose-pattern **Compose from evidence.** A match region already uses the four-coordinate
4301
- scope shape. A follow-up `## READ0 (resource) <SL,SC,EL,EC>` retrieves that exact
4370
+ scope shape. A follow-up `### READ0 (resource) <SL,SC,EL,EC>` retrieves that exact
4302
4371
  region. JSONPath/XPath remain locators and matchers; they do not introduce a
4303
4372
  second structural scope or structural EDIT language.
4304
4373
 
@@ -4379,11 +4448,12 @@ Carried from the contract walk; durable.
4379
4448
  {§copy-move-observation}.
4380
4449
  - **READ rx** prefixes every textual line under {§render-rule}; eligible
4381
4450
  editable resources carry `@hash N:`, and all others carry `N:`.
4382
- - **FIND body matcher** applies to the addressed entry channel (all dialects), per-candidate via the in-tree `Matcher.matchAgainstContent` ({§matcher-dispatch}; status 200 = content hit → entry selected). The target scope and channel select candidates; the path-glob is the (target). FIND's signal classifies its own log item ({§log-item-tags}).
4383
- - **OPEN/FOLD** operate on the **log** (`log:///`), not entries ({§open-fold}) FOLD collapses a log row to its path, OPEN restores its body. Aimed at an entry scheme they return 501.
4384
- - **SEND signal `410`** deletes as a side-effect (not the model idiom; {§move}): with `#fragment`, that channel only; without, the whole entry. **SEND signal `499`** resolves the durable open-subscription row and invokes that subscription's exact callable owner through the process-local live registry ({§subscriptions}).
4451
+ - **FIND body matcher** applies to the addressed entry channel (all dialects), per-candidate via the in-tree `Matcher.matchAgainstContent` ({§matcher-dispatch}; status 200 = content hit → entry selected). The target scope and channel select candidates; the path-glob is the (target).
4452
+ - **Scoped KILL** on the **log** (`log:///`) folds a body span away ({§log-kill-scope}); on an entry it deletes that span through the EDIT path ({§kill-scope-entry}). A whole-entry KILL deletes the entry, or one `#fragment` channel.
4385
4453
  - **File scheme** detects with `Mimetypes.detect({ path })` and classifies with the same configured service ({§mimetype-classification-consumption}). Handler-declared binary sources materialize through {§membership-source-projection}; projected bodies are READ-able, while source-aware EDIT remains 415.
4386
4454
 
4387
- ### §send-status-policy Directed-SEND status code policy
4455
+ ### §kill-scope-entry Scoped KILL on an entry
4456
+
4457
+ A KILL with a text-coordinate scope aimed at an entry-bearing scheme deletes exactly that span: core prepares and dispatches it as an EDIT with an empty body over the same marker, so anchors resolve, proposals gate it, and the merge facts and receipt are the EDIT path's — while the log row records the model's KILL. `### EDIT0 (path) <scope>` with an empty body remains the same act spelled the other way; the teaching names KILL.
4388
4458
 
4389
- Status codes outside 410/499 on directed SEND return 501 from entry schemes. plurnk.md doesn't prescribe semantics for arbitrary HTTP status codes on directed sends; each scheme decides. 501 is the default; new interpretations land as concrete use cases arise.
4459
+ A body pattern on an entry KILL is refused (400 `kill-body-log-only`): body patterns select log items ({§log-kill-scope}), and a selector core does not apply is never silently dropped, so a scoped entry KILL can never widen to its whole span.