pi-daddy 0.43.1 → 0.44.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/CHANGELOG.md +97 -31
  2. package/README.md +15 -0
  3. package/THIRD_PARTY_LICENSES/musl-COPYRIGHT.txt +193 -0
  4. package/THIRD_PARTY_LICENSES/zig-MIT.txt +21 -0
  5. package/THIRD_PARTY_NOTICES.md +9 -0
  6. package/dist/cli.d.ts +2 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +10 -5
  9. package/dist/cli.js.map +1 -1
  10. package/dist/executors/activity-session.js +116 -65
  11. package/dist/executors/activity-session.js.map +1 -1
  12. package/dist/executors/captured-execution.d.ts +13 -0
  13. package/dist/executors/captured-execution.d.ts.map +1 -0
  14. package/dist/executors/captured-execution.js +53 -0
  15. package/dist/executors/captured-execution.js.map +1 -0
  16. package/dist/executors/child-final.d.ts +31 -0
  17. package/dist/executors/child-final.d.ts.map +1 -0
  18. package/dist/executors/child-final.js +197 -0
  19. package/dist/executors/child-final.js.map +1 -0
  20. package/dist/executors/executor.d.ts +2 -1
  21. package/dist/executors/executor.d.ts.map +1 -1
  22. package/dist/executors/executor.js +12 -0
  23. package/dist/executors/executor.js.map +1 -1
  24. package/dist/executors/owned-worker.d.ts +18 -0
  25. package/dist/executors/owned-worker.d.ts.map +1 -0
  26. package/dist/executors/owned-worker.js +295 -0
  27. package/dist/executors/owned-worker.js.map +1 -0
  28. package/dist/executors/worker-artifact.d.ts +3 -0
  29. package/dist/executors/worker-artifact.d.ts.map +1 -0
  30. package/dist/executors/worker-artifact.js +3 -0
  31. package/dist/executors/worker-artifact.js.map +1 -0
  32. package/dist/governance/approval-prompt.d.ts +4 -3
  33. package/dist/governance/approval-prompt.d.ts.map +1 -1
  34. package/dist/governance/approval-prompt.js +13 -6
  35. package/dist/governance/approval-prompt.js.map +1 -1
  36. package/dist/governance/captured-worker-record.d.ts +9 -0
  37. package/dist/governance/captured-worker-record.d.ts.map +1 -0
  38. package/dist/governance/captured-worker-record.js +123 -0
  39. package/dist/governance/captured-worker-record.js.map +1 -0
  40. package/dist/governance/lease-record.d.ts +4 -0
  41. package/dist/governance/lease-record.d.ts.map +1 -1
  42. package/dist/governance/lease-record.js +19 -2
  43. package/dist/governance/lease-record.js.map +1 -1
  44. package/dist/governance/ledger-events.d.ts +5 -5
  45. package/dist/governance/ledger-events.d.ts.map +1 -1
  46. package/dist/governance/ledger-v3-validation.js +1 -1
  47. package/dist/governance/ledger-v3-validation.js.map +1 -1
  48. package/dist/governance/workspace-acceptance.d.ts +3 -1
  49. package/dist/governance/workspace-acceptance.d.ts.map +1 -1
  50. package/dist/governance/workspace-acceptance.js +21 -5
  51. package/dist/governance/workspace-acceptance.js.map +1 -1
  52. package/dist/governance/workspace-lease.d.ts.map +1 -1
  53. package/dist/governance/workspace-lease.js +44 -1
  54. package/dist/governance/workspace-lease.js.map +1 -1
  55. package/dist/kernel/authority-text.d.ts +3 -0
  56. package/dist/kernel/authority-text.d.ts.map +1 -0
  57. package/dist/kernel/authority-text.js +22 -0
  58. package/dist/kernel/authority-text.js.map +1 -0
  59. package/dist/kernel/bounded-read-failures.d.ts +9 -0
  60. package/dist/kernel/bounded-read-failures.d.ts.map +1 -0
  61. package/dist/kernel/bounded-read-failures.js +33 -0
  62. package/dist/kernel/bounded-read-failures.js.map +1 -0
  63. package/dist/kernel/bounded-read-sync.d.ts +24 -0
  64. package/dist/kernel/bounded-read-sync.d.ts.map +1 -0
  65. package/dist/kernel/bounded-read-sync.js +75 -0
  66. package/dist/kernel/bounded-read-sync.js.map +1 -0
  67. package/dist/kernel/bounded-read.d.ts +29 -2
  68. package/dist/kernel/bounded-read.d.ts.map +1 -1
  69. package/dist/kernel/bounded-read.js +98 -9
  70. package/dist/kernel/bounded-read.js.map +1 -1
  71. package/dist/kernel/capacity.d.ts +36 -0
  72. package/dist/kernel/capacity.d.ts.map +1 -0
  73. package/dist/kernel/capacity.js +94 -0
  74. package/dist/kernel/capacity.js.map +1 -0
  75. package/dist/kernel/captured-worker-contract.d.ts +38 -0
  76. package/dist/kernel/captured-worker-contract.d.ts.map +1 -0
  77. package/dist/kernel/captured-worker-contract.js +2 -0
  78. package/dist/kernel/captured-worker-contract.js.map +1 -0
  79. package/dist/kernel/catalog.d.ts +12 -3
  80. package/dist/kernel/catalog.d.ts.map +1 -1
  81. package/dist/kernel/catalog.js +28 -8
  82. package/dist/kernel/catalog.js.map +1 -1
  83. package/dist/kernel/chain.d.ts +1 -0
  84. package/dist/kernel/chain.d.ts.map +1 -1
  85. package/dist/kernel/chain.js.map +1 -1
  86. package/dist/kernel/definitions.d.ts +11 -1
  87. package/dist/kernel/definitions.d.ts.map +1 -1
  88. package/dist/kernel/definitions.js +6 -3
  89. package/dist/kernel/definitions.js.map +1 -1
  90. package/dist/kernel/fanout.d.ts +5 -25
  91. package/dist/kernel/fanout.d.ts.map +1 -1
  92. package/dist/kernel/fanout.js +15 -30
  93. package/dist/kernel/fanout.js.map +1 -1
  94. package/dist/kernel/grant-env.d.ts +0 -2
  95. package/dist/kernel/grant-env.d.ts.map +1 -1
  96. package/dist/kernel/grant-env.js +0 -1
  97. package/dist/kernel/grant-env.js.map +1 -1
  98. package/dist/kernel/model-preflight.d.ts +8 -0
  99. package/dist/kernel/model-preflight.d.ts.map +1 -1
  100. package/dist/kernel/model-preflight.js +23 -0
  101. package/dist/kernel/model-preflight.js.map +1 -1
  102. package/dist/kernel/selected-definitions.d.ts +15 -0
  103. package/dist/kernel/selected-definitions.d.ts.map +1 -0
  104. package/dist/kernel/selected-definitions.js +146 -0
  105. package/dist/kernel/selected-definitions.js.map +1 -0
  106. package/dist/kernel/skill-packages.d.ts +4 -2
  107. package/dist/kernel/skill-packages.d.ts.map +1 -1
  108. package/dist/kernel/skill-packages.js +34 -41
  109. package/dist/kernel/skill-packages.js.map +1 -1
  110. package/dist/kernel/skill-resources.d.ts.map +1 -1
  111. package/dist/kernel/skill-resources.js +8 -11
  112. package/dist/kernel/skill-resources.js.map +1 -1
  113. package/dist/kernel/workspace.d.ts +6 -3
  114. package/dist/kernel/workspace.d.ts.map +1 -1
  115. package/dist/kernel/workspace.js +10 -6
  116. package/dist/kernel/workspace.js.map +1 -1
  117. package/dist/products/dashboard-cli.js +1 -1
  118. package/dist/products/dashboard-cli.js.map +1 -1
  119. package/dist/products/dashboard-render.d.ts +1 -2
  120. package/dist/products/dashboard-render.d.ts.map +1 -1
  121. package/dist/products/dashboard-render.js +3 -1
  122. package/dist/products/dashboard-render.js.map +1 -1
  123. package/dist/products/dashboard-session-client.d.ts +1 -2
  124. package/dist/products/dashboard-session-client.d.ts.map +1 -1
  125. package/dist/products/dashboard-session-client.js.map +1 -1
  126. package/dist/products/episode-report.d.ts +12 -8
  127. package/dist/products/episode-report.d.ts.map +1 -1
  128. package/dist/products/episode-report.js +61 -12
  129. package/dist/products/episode-report.js.map +1 -1
  130. package/extensions/approvals.ts +1 -1
  131. package/extensions/chain-plan.ts +9 -3
  132. package/extensions/context-staging.ts +30 -35
  133. package/extensions/dashboard-session-server.ts +1 -2
  134. package/extensions/definition-describe.ts +44 -0
  135. package/extensions/definition-runtime.ts +89 -26
  136. package/extensions/delegate-chain.ts +273 -256
  137. package/extensions/delegation-activation.ts +1 -1
  138. package/extensions/delegation.ts +41 -53
  139. package/extensions/execute-child.ts +167 -134
  140. package/extensions/fanout-outcome.ts +1 -9
  141. package/extensions/grants-command.ts +2 -9
  142. package/extensions/grants.ts +106 -38
  143. package/extensions/init-command.ts +52 -12
  144. package/extensions/reload-environment.ts +21 -2
  145. package/extensions/retired-inputs.ts +7 -0
  146. package/extensions/run-delegation.ts +212 -265
  147. package/extensions/session-capacity.ts +53 -0
  148. package/extensions/session-environment.ts +5 -2
  149. package/extensions/session-model-prompt.ts +33 -32
  150. package/extensions/session-report.ts +28 -11
  151. package/extensions/session.ts +200 -157
  152. package/extensions/workspace-runtime.ts +2 -1
  153. package/native/README.md +25 -0
  154. package/native/linux-x64/worker +0 -0
  155. package/native/linux-x64/worker.sha256 +1 -0
  156. package/native/provenance.json +42 -0
  157. package/native/toolchain.json +18 -0
  158. package/native/worker.c +209 -0
  159. package/package.json +16 -11
  160. package/src/cli.ts +16 -6
  161. package/src/executors/activity-session.ts +120 -66
  162. package/src/executors/captured-execution.ts +61 -0
  163. package/src/executors/child-final.ts +190 -0
  164. package/src/executors/executor.ts +14 -1
  165. package/src/executors/owned-worker.ts +322 -0
  166. package/src/executors/worker-artifact.ts +2 -0
  167. package/src/governance/approval-prompt.ts +18 -8
  168. package/src/governance/captured-worker-record.ts +138 -0
  169. package/src/governance/lease-record.ts +21 -2
  170. package/src/governance/ledger-events.ts +5 -5
  171. package/src/governance/ledger-v3-validation.ts +1 -1
  172. package/src/governance/workspace-acceptance.ts +20 -4
  173. package/src/governance/workspace-lease.ts +59 -1
  174. package/src/kernel/authority-text.ts +17 -0
  175. package/src/kernel/bounded-read-failures.ts +42 -0
  176. package/src/kernel/bounded-read-sync.ts +87 -0
  177. package/src/kernel/bounded-read.ts +128 -11
  178. package/src/kernel/capacity.ts +123 -0
  179. package/src/kernel/captured-worker-contract.ts +29 -0
  180. package/src/kernel/catalog.ts +45 -16
  181. package/src/kernel/chain.ts +1 -0
  182. package/src/kernel/definitions.ts +11 -2
  183. package/src/kernel/fanout.ts +17 -32
  184. package/src/kernel/grant-env.ts +0 -3
  185. package/src/kernel/model-preflight.ts +29 -0
  186. package/src/kernel/selected-definitions.ts +156 -0
  187. package/src/kernel/skill-packages.ts +40 -38
  188. package/src/kernel/skill-resources.ts +8 -9
  189. package/src/kernel/workspace.ts +12 -5
  190. package/src/products/dashboard-cli.ts +1 -1
  191. package/src/products/dashboard-render.ts +6 -2
  192. package/src/products/dashboard-session-client.ts +1 -2
  193. package/src/products/episode-report.ts +80 -17
  194. package/dist/advisors/advisor.d.ts +0 -90
  195. package/dist/advisors/advisor.d.ts.map +0 -1
  196. package/dist/advisors/advisor.js +0 -154
  197. package/dist/advisors/advisor.js.map +0 -1
  198. package/dist/advisors/decider.d.ts +0 -88
  199. package/dist/advisors/decider.d.ts.map +0 -1
  200. package/dist/advisors/decider.js +0 -29
  201. package/dist/advisors/decider.js.map +0 -1
  202. package/dist/advisors/jev.d.ts +0 -41
  203. package/dist/advisors/jev.d.ts.map +0 -1
  204. package/dist/advisors/jev.js +0 -139
  205. package/dist/advisors/jev.js.map +0 -1
  206. package/dist/advisors/settings.d.ts +0 -49
  207. package/dist/advisors/settings.d.ts.map +0 -1
  208. package/dist/advisors/settings.js +0 -99
  209. package/dist/advisors/settings.js.map +0 -1
  210. package/dist/governance/episode-cost-gate.d.ts +0 -31
  211. package/dist/governance/episode-cost-gate.d.ts.map +0 -1
  212. package/dist/governance/episode-cost-gate.js +0 -112
  213. package/dist/governance/episode-cost-gate.js.map +0 -1
  214. package/extensions/advisor-session.ts +0 -67
  215. package/extensions/effort-advice.ts +0 -112
  216. package/extensions/pruning-advice.ts +0 -133
  217. package/src/advisors/advisor.ts +0 -246
  218. package/src/advisors/decider.ts +0 -74
  219. package/src/advisors/jev.ts +0 -163
  220. package/src/advisors/settings.ts +0 -115
  221. package/src/governance/episode-cost-gate.ts +0 -128
package/CHANGELOG.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Newest first. **Breaking changes are marked and say what to do about them.**
4
4
 
5
5
  This file exists because the README had grown ninety lines of stacked version banners before a reader
6
- reached what the package *does* — churn documentation in front of product documentation. The banners are
6
+ reached what the package _does_ — churn documentation in front of product documentation. The banners are
7
7
  the record of how the package got here and are worth keeping; they are not worth reading first.
8
8
 
9
9
  > **0.13.0 is the first PUBLISHED release.** Every version below it was developed in this repository and
@@ -12,6 +12,74 @@ the record of how the package got here and are worth keeping; they are not worth
12
12
  > the record of how the package arrived at what it does, and because the reasoning behind each one is
13
13
  > usually the clearest statement of why the current behaviour is what it is.
14
14
 
15
+ ## 0.44.1 — Pi 1.0.4 extension-loader compatibility (2026-10-07)
16
+
17
+ - Declare Pi and TypeBox as wildcard host-provided peers and retain the qualified versions only as development dependencies. Pi 1.0.4 can now supply its single runtime copies without extension-loader warnings or duplicate modules.
18
+
19
+ ## 0.44.0 — stable release (2026-10-07)
20
+
21
+ - Rebuild the native helper using a SHA-pinned Zig/static-musl toolchain, retain exact source/artifact/license
22
+ provenance, and have CI reproduce every output byte. The loader verifies the held executable against its generated
23
+ JavaScript constant; the checksum sidecar is no longer runtime authority. Ship the corresponding musl and Zig notices.
24
+ - Reject invalid native control/status descriptors and unsupported child enumeration before admitting a worker;
25
+ treat control-read failures as owner loss, validate numeric bounds, send TERM once per unreaped child, and preserve
26
+ the original stop reason during hard escalation. Startup uses the caller's timeout/deadline, retaining late valid
27
+ ownership evidence without reopening a cancelled worker's start gate.
28
+ - Recheck retained reservations against their original durable receipts before single, parallel and chain dispatch.
29
+ Exact later settlement proof releases capacity once; missing or mismatched proof remains retained, and the original
30
+ failed/unknown result remains unchanged. Use `delegate_all` for independent parallel work.
31
+ - Compare streamed/persisted messages structurally: object-key order is irrelevant, array order and every value remain
32
+ binding. Share a final-output conformance table with skill-harness, preserving text bytes without invented separators.
33
+ - **Breaking — explicit package support:** require Linux x64 and exact Pi 1.0.4 in package platform and peer metadata.
34
+ Other platforms or Pi versions must retain their previously qualified runtime until separately qualified.
35
+ - Clarify the original candidate's removed monetary/advisor/model automation and passive-cost JSON breaking changes,
36
+ with migration guidance and version-scoped changelog entries.
37
+
38
+ ## 0.44.0-rc.1 — captured delegation qualification (2026-10-07)
39
+
40
+ Release candidate for review, not a stable or npm publication. Use the immutable candidate tag for source review.
41
+
42
+ - **Breaking — delegation bounds:** budget now caps active descendants through disjoint subtree reservations, alongside
43
+ depth and per-call limits. Settled children return capacity; uncertain cleanup retains it. A single child
44
+ conservatively reserves the available subtree, and active ownership survives extension reloads.
45
+ - **Bounded input and approval handling:** retain cleanup failures on the original owner, guard manual history
46
+ reads, and time out approvals without weakening their authority. Named approval revocation uses the pinned
47
+ selected definition; `revoke --all` remains available without resource acquisition.
48
+ - **Captured execution contract:** qualify Pi 1.0.4 JSON settlement against the exact persisted current turn and
49
+ active branch. Preserve complete final text and expose work/final/cleanup/observation states independently.
50
+ Failed children return native error results with available evidence; optional recording failures preserve work.
51
+ - **Cleanup:** use the packaged Linux x64 subreaper and execution-bound durable receipts. Unknown subtree cleanup
52
+ retains capacity and quarantines workspace reuse; preserve the referenced ownership directory as evidence.
53
+ - **Breaking — platform/backend support:** the package now declares Linux x64 only. macOS, ARM64 and native Windows users must remain on their previous qualified release; this candidate has no qualified executor there.
54
+ - **Breaking — staged backend release:** governed Herdr execution refuses, even when its server answers, until parity is
55
+ qualified. Explicitly set `PI_DADDY_HERDR=0` for captured execution; there is no fallback after selection.
56
+ - **Required handoffs:** block dependent chain steps when the complete prior final exceeds the handoff limit.
57
+ The completed step and its full result remain available; no tail-only handoff is promoted to complete.
58
+ - **Selected Principal resources:** bind the native phase to selected inline and delegated bytes, hash and exact
59
+ package manifest, use `delegate_describe` to obtain the required definition identity, and pin it until reload.
60
+ Missing, moved or tampered marked Principal resources refuse rather than becoming ordinary inline definitions.
61
+
62
+ - **Breaking — removed automation:** remove monetary execution gates, external advisors and the automatic first-delegation model chooser. Configure provider-side spend controls if required, and select models/thinking manually. Recognized
63
+ legacy settings and cost arguments are inert; manual model edits, permission approvals and retained historical
64
+ usage remain. Pi 1.0.4 argument preparation validates active arguments after removing the retired cost override.
65
+ - Live complete episode cost is explicitly unavailable in the session dashboard; historical usage remains in reports.
66
+
67
+
68
+ ### Passive cost coverage
69
+
70
+ - **Breaking — report JSON change:** row/group/total cost and episode-cost percentiles may be null when coverage is incomplete.
71
+ Use observedCost for the known subtotal and costCoverage for complete/partial/unavailable status. A reported zero
72
+ remains zero. Cost coverage concerns recorded child executions only; root and unrecorded work are not measured.
73
+
74
+ ### Surviving guard repairs
75
+
76
+ - Treat damaged or oversized runtime/resource settings and package metadata as failures, not missing defaults.
77
+ Bounded reads reject FIFOs and malformed UTF-8; unresolved cleanup stays attached to the operation and session owner.
78
+ - Pruned handoffs carry only the active Pi branch and shared ancestry. Unavailable input is labeled incomplete.
79
+ Named file handoffs require Linux held-descriptor confinement proof and refuse when it is unavailable.
80
+ - Approval timeouts accept absent (120 seconds), literal 0 (unlimited), or canonical whole seconds 1..2147483.
81
+ Fix malformed values before requesting a new prompt; existing authority remains usable.
82
+
15
83
  ## 0.43.1 — Pi-only documentation refresh (2026-09-29)
16
84
 
17
85
  - Refresh `README.md`, `AGENTS.md`, the package README, and the ledger-record contract README against the shipped
@@ -786,7 +854,6 @@ and test synchronization only; dependencies and runtime are unchanged.
786
854
  Rename prose/whitespace keys before calling `runNamedCheck`; invalid IDs now refuse before the executable
787
855
  or lease starts rather than failing only when a v3 receipt is appended.
788
856
 
789
-
790
857
  ## 0.19.0 — workspace routing is a capability (2026-08-23)
791
858
 
792
859
  **The four hang fixes below were staged for a 0.18.2 and are released here instead — a decision reversed
@@ -794,13 +861,13 @@ deliberately, so the reversal is recorded rather than the reason vanishing.** Th
794
861
  argued for cutting them as a patch so a fix for released code would not be gated on a breaking change. The
795
862
  counter-argument won: **R-131 — workspace routing does not attenuate — is a live escalation in published
796
863
  0.18.0 and 0.18.1**, a child routed to `staging` can route its grandchild to `prod` with a real lease and a
797
- ledger line that reads as authorised, and the fix for it *is* the breaking change. A 0.18.2 would have fixed
864
+ ledger line that reads as authorised, and the fix for it _is_ the breaking change. A 0.18.2 would have fixed
798
865
  one defect and left that one open, on a line that then needed supporting alongside this one. Shipping once
799
866
  fixes all three.
800
867
 
801
868
  - **FIX — a retained lease no longer reports a retention that did not happen (R-152).** `markRetained`
802
869
  returned `void` and `releaseDelegationWorkspace` hardcoded the ledger word, so a `workspace_lease` event
803
- said `retained` — *"the pane may still be live"* — for a helper that had already died (the fact is `lost`),
870
+ said `retained` — _"the pane may still be live"_ — for a helper that had already died (the fact is `lost`),
804
871
  for a lease already cleanly released, and for a retention whose record could not be written. It now answers
805
872
  in the release vocabulary and the caller ledgers what it says. **Breaking for direct library callers only:**
806
873
  `WorkspaceLease.markRetained` returns `Promise<LeaseReleaseOutcome>` instead of `Promise<void>`, and
@@ -827,7 +894,6 @@ fixes all three.
827
894
  explicitly rejected outcome. Measured with a `herdr` that sleeps: before, `LOCK=HELD` with no marker
828
895
  indefinitely; after, released with the marker written. Tunable via `herdrCloseTimeoutMs` (default 15s).
829
896
 
830
-
831
897
  - Ship a canonical JSON Schema draft 2020-12 contract for `ledgerVersion: 2` plus deterministic fixtures for
832
898
  all four event types, generated through the production builders. Stable package export paths let external
833
899
  harnesses pin the real contract instead of maintaining a parallel format.
@@ -886,7 +952,7 @@ and a mutation battery, and are listed because ADR-0035 claimed three of them as
886
952
  amendment). **The entries under "Present in earlier releases" below DID ship**, and an earlier draft of this section put
887
953
  them under this heading, telling operators the `tool:*` attenuation escape could not affect them. (That draft
888
954
  then said "two" while three bullets sat under the heading, one of which — the v2 enum — is the single item
889
- here that provably did *not* ship. It has moved back.)
955
+ here that provably did _not_ ship. It has moved back.)
890
956
 
891
957
  - **Routing terminated below the root instead of attenuating.** `unknownCapabilities` did not know the
892
958
  namespace, and a catalog is always present in a real session, so every requested `workspace:<id>` was
@@ -1008,7 +1074,7 @@ is never a force-push, and `test/branch-guard.test.ts`, which pins it against se
1008
1074
 
1009
1075
  **Why a version at all**, since nothing here changed: rule 10 says version bumps take the same path as
1010
1076
  everything else, and this one did — branch, PR, review, squash-merge. The rule's first draft was reviewed by
1011
- six independent agents across two rounds that found sixteen defects, including that *"never commit to `main`"*
1077
+ six independent agents across two rounds that found sixteen defects, including that _"never commit to `main`"_
1012
1078
  forbids the merge the rule requires, and that the guard written to fix that had reproduced the same defect in
1013
1079
  shell. `docs/03-risks.md` R-85 and the 2026-08-18 session-log entry hold the details.
1014
1080
 
@@ -1021,11 +1087,11 @@ order is now what the sentence says it is.
1021
1087
  one that removes the last reason to keep an ungoverned spawner installed alongside this one.
1022
1088
 
1023
1089
  - **The handoff is fenced, labelled and nonce-delimited.** A chain makes step N's task the output of a governed
1024
- child, which is the highest-authority text a child receives after its own `SKILL.md`. The label is *framing* — a
1090
+ child, which is the highest-authority text a child receives after its own `SKILL.md`. The label is _framing_ — a
1025
1091
  determined injection can argue with it — but the **nonce is mechanism**: minted after the producing child
1026
1092
  finished, so it cannot forge a closing delimiter. ADR-0033 records the stronger option (quarantine to a file the
1027
1093
  next step must `read`) as the prepared answer if framing proves insufficient.
1028
- - **Gated upfront: one dialog per capability *and* definition, all before the first step runs.** Approvals arrive
1094
+ - **Gated upfront: one dialog per capability _and_ definition, all before the first step runs.** Approvals arrive
1029
1095
  together instead of interrupting a running pipeline. Not one dialog for everything — an approval is keyed
1030
1096
  `capability@subject`, so a single dialog spanning several definitions would ask about one and spend the answer on
1031
1097
  the rest. ADR-0033 originally specified that, three reviewers found it was a privilege path, and the ADR carries
@@ -1040,7 +1106,7 @@ one that removes the last reason to keep an ungoverned spawner installed alongsi
1040
1106
  `PI_GRANTS_FANOUT=12` (the default is 8). At most 8 steps.
1041
1107
 
1042
1108
  **Also:** `test-integration/herdr.it.ts` now checks herdr's own contracts against a real server in an isolated
1043
- workspace — the gap that hid three shipping defects in 0.16.0, where the unit fake was a *claim* about herdr that
1109
+ workspace — the gap that hid three shipping defects in 0.16.0, where the unit fake was a _claim_ about herdr that
1044
1110
  nothing verified.
1045
1111
 
1046
1112
  ## 0.16.0 — children you can watch, in panes chosen for you
@@ -1048,17 +1114,17 @@ nothing verified.
1048
1114
  **If herdr is running, your sub-agents now run in herdr panes without you configuring anything — and the
1049
1115
  parent shows what each one is doing while it works.** Two ADRs, shipped together.
1050
1116
 
1051
- ### `PI_GRANTS_HERDR` is three-state, and unset now means *probe* (ADR-0031)
1117
+ ### `PI_GRANTS_HERDR` is three-state, and unset now means _probe_ (ADR-0031)
1052
1118
 
1053
- | Value | Behaviour |
1054
- | :--- | :--- |
1119
+ | Value | Behaviour |
1120
+ | :---- | :-------------------------------------------------------------------------------------------------------------------------------------- |
1055
1121
  | unset | Probe once at session start (`herdr tab list`, 2s bound). A server that **answers** ⇒ herdr panes; anything else ⇒ captured subprocess. |
1056
- | `1` | Demand herdr. **Every delegation refuses** if it is unreachable — no fallback. |
1057
- | `0` | Demand the captured subprocess. No probe. |
1122
+ | `1` | Demand herdr. **Every delegation refuses** if it is unreachable — no fallback. |
1123
+ | `0` | Demand the captured subprocess. No probe. |
1058
1124
 
1059
1125
  **Not a `PATH` check.** A binary with no server behind it would make every delegation fail at `tab create`, on
1060
- a path nobody chose — so only a *reachable* server counts. This reverses part of ADR-0016 point 6, which
1061
- refused auto-detection on the grounds that a run must not "silently relocate"; the answer to *silently* is that
1126
+ a path nobody chose — so only a _reachable_ server counts. This reverses part of ADR-0016 point 6, which
1127
+ refused auto-detection on the grounds that a run must not "silently relocate"; the answer to _silently_ is that
1062
1128
  the executor is now named at session start, in `/grants`, and per child in the ledger.
1063
1129
 
1064
1130
  **What to do about it:** nothing, unless you relied on an unset variable meaning subprocesses. If you did, set
@@ -1090,7 +1156,7 @@ returned.
1090
1156
 
1091
1157
  A pane used to be destroyed the instant its child settled, so a twenty-second child's pane was gone before
1092
1158
  anyone could switch to it. Panes now belong to the **agent run** and are swept at `agent_settled`, capped at 8
1093
- at once, with process `exit` as the backstop. `PI_GRANTS_HERDR_KEEP_PANE=1` still means *not even then*.
1159
+ at once, with process `exit` as the backstop. `PI_GRANTS_HERDR_KEEP_PANE=1` still means _not even then_.
1094
1160
 
1095
1161
  A child's pane also defaults to the **parent's own herdr workspace** now, so switching to one is a tab away
1096
1162
  rather than a workspace away.
@@ -1106,7 +1172,7 @@ shipping blockers, and they change what the herdr path guarantees:
1106
1172
  working with its grant after its result was reported.
1107
1173
  - **herdr binds an agent name to its tab.** With panes outliving their calls, the **second `delegate` of every
1108
1174
  turn** failed with `agent_name_taken`. Names are now unique per spawn.
1109
- - **The 8-pane cap killed live siblings**, because pi runs tool calls in parallel by default. Only *settled* panes
1175
+ - **The 8-pane cap killed live siblings**, because pi runs tool calls in parallel by default. Only _settled_ panes
1110
1176
  are reclaimable now; if they are all live the cap yields rather than enforcing.
1111
1177
  - **The pane reader amplified output 89,000×** once a pane scrolled or passed the output cap: `agent read` returns
1112
1178
  a snapshot of a bounded terminal and was being diffed as an append-only stream.
@@ -1127,7 +1193,7 @@ and coverage was added where it was simply absent — including that nothing ver
1127
1193
  ### Also
1128
1194
 
1129
1195
  - **`/grants ledger` tallies executors**, so "which children ran in panes?" no longer needs `jq`.
1130
- - **The tripwire names `delegate_all`.** It said only *"Use `delegate` instead"*, and a request for parallel
1196
+ - **The tripwire names `delegate_all`.** It said only _"Use `delegate` instead"_, and a request for parallel
1131
1197
  work was answered with a single sequential call as a result.
1132
1198
  - **The ledger records `executor` per child** — required, not optional. The executor is decided by a probe now,
1133
1199
  so nothing outside the record preserves which one ran, and the two paths do not produce the same argv.
@@ -1158,7 +1224,7 @@ pi
1158
1224
  **always wins**: it is how a child is governed and how CI is configured. `.pi/grants.env` is still written
1159
1225
  and still worth committing — it is the reviewable record, no longer what the enforcer reads. (ADR-0030)
1160
1226
  - **The dialog does not ask questions whose answers cannot matter.** `tool:bash` subsumes `write` and
1161
- `edit`, so once bash is granted those are conferred; asking anyway let an operator answer *no* to
1227
+ `edit`, so once bash is granted those are conferred; asking anyway let an operator answer _no_ to
1162
1228
  `tool:write` and then watch `build` be allowed it. It now reports them as already conferred instead.
1163
1229
  - **An unknown `/grants` subcommand is refused rather than ignored.** `/grants init` used to print the
1164
1230
  ordinary status screen with the word silently dropped, so a command that did not exist looked like it had
@@ -1182,7 +1248,7 @@ resolution, enforcement, approvals or the ledger changed — this is the part be
1182
1248
  - **The generated grant is READ-ONLY by default** (ADR-0029). `init` grants what the copied skills declare
1183
1249
  minus anything that can change your machine — `bash`, `write`, `edit` and the universal capabilities are
1184
1250
  written **commented**, naming the definitions that need them. `init` + `source` gives a working read-only
1185
- setup; widening costs one deliberate uncomment. The reason: `PI_GRANTS_GRANT` is what *bounds* a declared
1251
+ setup; widening costs one deliberate uncomment. The reason: `PI_GRANTS_GRANT` is what _bounds_ a declared
1186
1252
  ceiling, so generating it from those ceilings would give the bound and the bounded one author, and it
1187
1253
  would not be you.
1188
1254
 
@@ -1193,14 +1259,14 @@ resolution, enforcement, approvals or the ledger changed — this is the part be
1193
1259
  `PI_GRANTS_GRANT` string by hand — seven times for `principal-pi-skills`.
1194
1260
 
1195
1261
  **It chooses no ceiling, and that boundary is the whole design.** A skill that declares `allowed-tools` is
1196
- copied byte for byte; one that declares none is copied with a *commented* placeholder and stays
1262
+ copied byte for byte; one that declares none is copied with a _commented_ placeholder and stays
1197
1263
  unspawnable until a human fills it in. The placeholder is deliberately not a working example, so
1198
1264
  uncommenting it unedited fails loudly instead of granting something nobody decided. An existing file is
1199
1265
  **kept**, never overwritten — that edit is the capability decision, and a second `init` run is exactly
1200
1266
  when it would be destroyed. `--force` exists and says what it costs.
1201
1267
 
1202
1268
  - **Session start says how many definitions are spawnable, and names the withheld ones.** The line reported
1203
- the grant and never the definitions, so *"governance is working"* and *"did the install fail?"* looked
1269
+ the grant and never the definitions, so _"governance is working"_ and _"did the install fail?"_ looked
1204
1270
  identical:
1205
1271
 
1206
1272
  ```
@@ -1224,11 +1290,11 @@ resolution, enforcement, approvals or the ledger changed — this is the part be
1224
1290
  from a package are refused, and the assembled grant is charset-checked before the file is written at all.
1225
1291
 
1226
1292
  - **Fixed before release: `init` overwrote an operator's file and wrote through symlinks** (R-79). The
1227
- presence probe was `readFile`, which treats *unreadable* as *absent* — so a permissions-restricted
1293
+ presence probe was `readFile`, which treats _unreadable_ as _absent_ — so a permissions-restricted
1228
1294
  `SKILL.md` was replaced and its ceiling **widened**, with no `--force`. And `writeFile` follows symlinks, so
1229
1295
  a dangling link at a target path created the file outside the project while reporting an in-project path.
1230
1296
  Both are one `open(path, "wx")`. `--force` no longer regenerates `.pi/grants.env`, and `pi-daddy init
1231
- --Force` is no longer accepted as a silent no-op.
1297
+ --Force` is no longer accepted as a silent no-op.
1232
1298
 
1233
1299
  - **Fixed before release: the startup line blamed your files for a session-level refusal** (R-81). A session
1234
1300
  at its depth limit, or with a malformed `PI_GRANTS_MAX_DEPTH`, was told its `SKILL.md` files were written
@@ -1258,17 +1324,17 @@ as a user of this package:
1258
1324
  the path, not the lock this process created, so a broken stale lock cascaded: the old holder freed the new
1259
1325
  owner's lock on the way out, and the next arrival — which raced nothing — walked in beside it. Reproduced
1260
1326
  across real OS processes. Every lock now carries a token and proves ownership before deleting.
1261
- - **The ledger over-claimed human approval under concurrency.** One *Allow for this session* answered under
1327
+ - **The ledger over-claimed human approval under concurrency.** One _Allow for this session_ answered under
1262
1328
  a fan-out of eight wrote eight lines each recording `approvalSource: "prompt"`. Riders now record
1263
1329
  `session`, which is what actually happened.
1264
1330
 
1265
1331
  One breaking change, and it is a type.
1266
1332
 
1267
1333
  - **BREAKING: `revokeApproval` returns `"revoked" | "absent" | "failed" | "busy"`**, not a boolean. It had
1268
- two outcomes for four facts, and `/grants revoke` printed *"no persisted approval named X"* whenever the
1334
+ two outcomes for four facts, and `/grants revoke` printed _"no persisted approval named X"_ whenever the
1269
1335
  write failed — telling an operator that the approval they are revoking does not exist **while it is still
1270
1336
  in effect**. The most alarming outcome wore the most reassuring message. `busy` is separate because a lock
1271
- timeout happens *before* the load, so nothing was looked at and nothing may be claimed about the entry.
1337
+ timeout happens _before_ the load, so nothing was looked at and nothing may be claimed about the entry.
1272
1338
  Callers switching on the boolean must switch on the string; `"revoked"` is the only success.
1273
1339
  - **Approval writes hold a lock (R-49).** Every write is load → modify → write and none of them was
1274
1340
  serialised, so session 1 could load, session 2 could revoke, and session 1's next save would restore the
@@ -1278,10 +1344,10 @@ One breaking change, and it is a type.
1278
1344
  - **`/grants ledger` counts where each approval came from.** ADR-0020 keeps the persistence layer on an
1279
1345
  asserted fatigue argument and named the evidence that would settle it — `persisted` against `prompt` over
1280
1346
  real use. The data was already recorded and nothing read it. **Two numbers, both labelled**: raw records
1281
- are an *upper bound* on prompts avoided, because within one session only the first would have been a
1347
+ are an _upper bound_ on prompts avoided, because within one session only the first would have been a
1282
1348
  prompt and the rest come from the in-memory session cache; distinct `capability@subject` pairs are the
1283
1349
  closer estimate. Reporting records alone overstated the layer twentyfold in the obvious case (R-63).
1284
- Records written before per-capability sources existed are reported as *not counted* rather than folded in,
1350
+ Records written before per-capability sources existed are reported as _not counted_ rather than folded in,
1285
1351
  because that older scalar over-claimed `prompt`.
1286
1352
  - **A revoke is documented as taking effect at the next gate check**, not "immediately". A spawn whose gate
1287
1353
  check already passed is not retracted by a revoke arriving microseconds later — inherent to revoking
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # pi-daddy
2
2
 
3
+ Stable release: **0.44.1** (tag `v0.44.1`), published to npm.
4
+
3
5
  Capability governance and coordination for [pi](https://github.com/badlogic/pi-mono)'s multi-level agent system. An
4
6
  orchestrator grants each sub-agent a deliberate subset of what it holds and withholds the rest; a sub-agent may delegate
5
7
  further, but only ever a subset of what it holds. Enforcement is pi's own `--tools` allowlist on a separate child
@@ -30,6 +32,19 @@ Escalation is impossible by construction on the tool surface. It does not contai
30
32
  primitive: a child granted `bash` can start an ungoverned descendant, so `bash` is gated by default and every gate
31
33
  answer is recorded when a governance ledger is configured.
32
34
 
35
+ This candidate targets Pi 1.0.4 and captured Linux x64 execution. Qualification is limited to Ubuntu WSL2,
36
+ kernel `6.18.33.2-microsoft-standard-WSL2`, x86_64 and Node `v26.7.0`; other runtime/kernel combinations, native
37
+ Windows and WSL-to-Windows worker interop remain unqualified. Governed Herdr execution refuses until separately qualified. Select captured execution with `PI_DADDY_HERDR=0`. A final must match Pi's settled
38
+ JSON output and persisted current branch. Unknown subtree cleanup retains capacity and workspace exclusion.
39
+ `PI_DADDY_FANOUT` limits active descendants using conservative subtree reservations, with capacity returned only
40
+ after verified settlement. Complete results remain separate from optional recording failures.
41
+
42
+ The package dependency and peer requirement both pin exact Pi **1.0.4**; later Pi versions require new qualification. Use Principal **4.8.0** with this runtime's `delegate_describe` contract. Native phases use `plan`, `build`, `review`, `debug`, and `investigate` with their returned `definitionId`; independent parallel work uses one `delegate_all` batch.
43
+
44
+ Final capture preserves whitespace and concatenates text blocks without inserting separators. Tool-call terminals, empty visible finals and non-`stop` reasons are unavailable. Persisted message comparisons ignore object key order while preserving array order and every field value. The shared `final-conformance.json` table checks these semantics in both runtime and harness. Capture remains bounded: 4 MiB visible final, 32 MiB protocol line, 64 MiB persisted session, and a 3-second bounded session read. Exceeding a limit reports an unavailable final and blocks dependent handoffs; it does not imply the worker failed to settle.
45
+
46
+ Retained capacity is rechecked against the original bound ownership and settlement receipt before a new single, parallel or chain dispatch. Exact later proof refunds the reservation once; missing, malformed or mismatched proof and unbound ownership remain retained. Recovery does not rewrite the original failed/unknown outcome or mint new capacity on reload. A single delegation reserves its available subtree; use `delegate_all` to allocate independent parallel children.
47
+
33
48
  The package requires Node.js 22.19.0 or newer. `pi-daddy report` joins episode usage and attribution;
34
49
  `pi-daddy outcomes` adds Git, CI, amendment, and operator-correction signals for commits carrying a `Pi-Episode`
35
50
  trailer. A connected dashboard can change model/thinking defaults for its owning session without changing persistent
@@ -0,0 +1,193 @@
1
+ musl as a whole is licensed under the following standard MIT license:
2
+
3
+ ----------------------------------------------------------------------
4
+ Copyright © 2005-2020 Rich Felker, et al.
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining
7
+ a copy of this software and associated documentation files (the
8
+ "Software"), to deal in the Software without restriction, including
9
+ without limitation the rights to use, copy, modify, merge, publish,
10
+ distribute, sublicense, and/or sell copies of the Software, and to
11
+ permit persons to whom the Software is furnished to do so, subject to
12
+ the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be
15
+ included in all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24
+ ----------------------------------------------------------------------
25
+
26
+ Authors/contributors include:
27
+
28
+ A. Wilcox
29
+ Ada Worcester
30
+ Alex Dowad
31
+ Alex Suykov
32
+ Alexander Monakov
33
+ Andre McCurdy
34
+ Andrew Kelley
35
+ Anthony G. Basile
36
+ Aric Belsito
37
+ Arvid Picciani
38
+ Bartosz Brachaczek
39
+ Benjamin Peterson
40
+ Bobby Bingham
41
+ Boris Brezillon
42
+ Brent Cook
43
+ Chris Spiegel
44
+ Clément Vasseur
45
+ Daniel Micay
46
+ Daniel Sabogal
47
+ Daurnimator
48
+ David Carlier
49
+ David Edelsohn
50
+ Denys Vlasenko
51
+ Dmitry Ivanov
52
+ Dmitry V. Levin
53
+ Drew DeVault
54
+ Emil Renner Berthing
55
+ Fangrui Song
56
+ Felix Fietkau
57
+ Felix Janda
58
+ Gianluca Anzolin
59
+ Hauke Mehrtens
60
+ He X
61
+ Hiltjo Posthuma
62
+ Isaac Dunham
63
+ Jaydeep Patil
64
+ Jens Gustedt
65
+ Jeremy Huntwork
66
+ Jo-Philipp Wich
67
+ Joakim Sindholt
68
+ John Spencer
69
+ Julien Ramseier
70
+ Justin Cormack
71
+ Kaarle Ritvanen
72
+ Khem Raj
73
+ Kylie McClain
74
+ Leah Neukirchen
75
+ Luca Barbato
76
+ Luka Perkov
77
+ M Farkas-Dyck (Strake)
78
+ Mahesh Bodapati
79
+ Markus Wichmann
80
+ Masanori Ogino
81
+ Michael Clark
82
+ Michael Forney
83
+ Mikhail Kremnyov
84
+ Natanael Copa
85
+ Nicholas J. Kain
86
+ orc
87
+ Pascal Cuoq
88
+ Patrick Oppenlander
89
+ Petr Hosek
90
+ Petr Skocik
91
+ Pierre Carrier
92
+ Reini Urban
93
+ Rich Felker
94
+ Richard Pennington
95
+ Ryan Fairfax
96
+ Samuel Holland
97
+ Segev Finer
98
+ Shiz
99
+ sin
100
+ Solar Designer
101
+ Stefan Kristiansson
102
+ Stefan O'Rear
103
+ Szabolcs Nagy
104
+ Timo Teräs
105
+ Trutz Behn
106
+ Valentin Ochs
107
+ Will Dietz
108
+ William Haddon
109
+ William Pitcock
110
+
111
+ Portions of this software are derived from third-party works licensed
112
+ under terms compatible with the above MIT license:
113
+
114
+ The TRE regular expression implementation (src/regex/reg* and
115
+ src/regex/tre*) is Copyright © 2001-2008 Ville Laurikari and licensed
116
+ under a 2-clause BSD license (license text in the source files). The
117
+ included version has been heavily modified by Rich Felker in 2012, in
118
+ the interests of size, simplicity, and namespace cleanliness.
119
+
120
+ Much of the math library code (src/math/* and src/complex/*) is
121
+ Copyright © 1993,2004 Sun Microsystems or
122
+ Copyright © 2003-2011 David Schultz or
123
+ Copyright © 2003-2009 Steven G. Kargl or
124
+ Copyright © 2003-2009 Bruce D. Evans or
125
+ Copyright © 2008 Stephen L. Moshier or
126
+ Copyright © 2017-2018 Arm Limited
127
+ and labelled as such in comments in the individual source files. All
128
+ have been licensed under extremely permissive terms.
129
+
130
+ The ARM memcpy code (src/string/arm/memcpy.S) is Copyright © 2008
131
+ The Android Open Source Project and is licensed under a two-clause BSD
132
+ license. It was taken from Bionic libc, used on Android.
133
+
134
+ The AArch64 memcpy and memset code (src/string/aarch64/*) are
135
+ Copyright © 1999-2019, Arm Limited.
136
+
137
+ The implementation of DES for crypt (src/crypt/crypt_des.c) is
138
+ Copyright © 1994 David Burren. It is licensed under a BSD license.
139
+
140
+ The implementation of blowfish crypt (src/crypt/crypt_blowfish.c) was
141
+ originally written by Solar Designer and placed into the public
142
+ domain. The code also comes with a fallback permissive license for use
143
+ in jurisdictions that may not recognize the public domain.
144
+
145
+ The smoothsort implementation (src/stdlib/qsort.c) is Copyright © 2011
146
+ Valentin Ochs and is licensed under an MIT-style license.
147
+
148
+ The x86_64 port was written by Nicholas J. Kain and is licensed under
149
+ the standard MIT terms.
150
+
151
+ The mips and microblaze ports were originally written by Richard
152
+ Pennington for use in the ellcc project. The original code was adapted
153
+ by Rich Felker for build system and code conventions during upstream
154
+ integration. It is licensed under the standard MIT terms.
155
+
156
+ The mips64 port was contributed by Imagination Technologies and is
157
+ licensed under the standard MIT terms.
158
+
159
+ The powerpc port was also originally written by Richard Pennington,
160
+ and later supplemented and integrated by John Spencer. It is licensed
161
+ under the standard MIT terms.
162
+
163
+ All other files which have no copyright comments are original works
164
+ produced specifically for use as part of this library, written either
165
+ by Rich Felker, the main author of the library, or by one or more
166
+ contibutors listed above. Details on authorship of individual files
167
+ can be found in the git version control history of the project. The
168
+ omission of copyright and license comments in each file is in the
169
+ interest of source tree size.
170
+
171
+ In addition, permission is hereby granted for all public header files
172
+ (include/* and arch/*/bits/*) and crt files intended to be linked into
173
+ applications (crt/*, ldso/dlstart.c, and arch/*/crt_arch.h) to omit
174
+ the copyright notice and permission notice otherwise required by the
175
+ license, and to use these files without any requirement of
176
+ attribution. These files include substantial contributions from:
177
+
178
+ Bobby Bingham
179
+ John Spencer
180
+ Nicholas J. Kain
181
+ Rich Felker
182
+ Richard Pennington
183
+ Stefan Kristiansson
184
+ Szabolcs Nagy
185
+
186
+ all of whom have explicitly granted such permission.
187
+
188
+ This file previously contained text expressing a belief that most of
189
+ the files covered by the above exception were sufficiently trivial not
190
+ to be subject to copyright, resulting in confusion over whether it
191
+ negated the permissions granted in the license. In the spirit of
192
+ permissive licensing, and of not having licensing issues being an
193
+ obstacle to adoption, that text has been removed.
@@ -0,0 +1,21 @@
1
+ The MIT License (Expat)
2
+
3
+ Copyright (c) Zig contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -5,3 +5,12 @@
5
5
  `src/executors/vendor/herdr-pi-lifecycle.ts` is the unmodified official Herdr Pi lifecycle integration, copied from Herdr `v0.8.2`, blob `67bc41889abc2791d6dcdfe8279bdc24186cc6fe` (SHA-256 `9b1c41cd72520fc2abe5f2a2aec995c12a926cce844df472c7fd5fcae4f4dbfa`).
6
6
 
7
7
  It is licensed under Apache License 2.0. A copy of that license is distributed at `THIRD_PARTY_LICENSES/herdr-Apache-2.0.txt`.
8
+
9
+ ## Captured Linux x64 worker
10
+
11
+ `native/linux-x64/worker` statically links the musl libc shipped in the official Zig 0.14.1
12
+ Linux x86-64 compiler distribution. Its complete copyright/license notice is reproduced in
13
+ `THIRD_PARTY_LICENSES/musl-COPYRIGHT.txt`; Zig's runtime notice is in `THIRD_PARTY_LICENSES/zig-MIT.txt`.
14
+ These are copied directly from the SHA-256-pinned compiler archive by `scripts/build-worker.ts`.
15
+ The worker does not link glibc. `native/provenance.json` records source, compiler archive, artifact
16
+ and license hashes. See `native/README.md` to reproduce and verify the committed binary.
package/dist/cli.d.ts CHANGED
@@ -12,6 +12,7 @@
12
12
  * unknown-option check that exempted `argv[0]` whenever `--dir` was absent, so `pi-daddy init --Force`
13
13
  * was accepted in silence — the exact failure the check's own comment says it prevents.
14
14
  */
15
+ import { loadWorkspaceRegistry } from "./kernel/workspace.ts";
15
16
  import { type RefusedSkill, type SkillPackage } from "./kernel/skill-packages.ts";
16
17
  import { type EpisodeGroupBy } from "./products/episode-report.ts";
17
18
  export interface ParsedArgs {
@@ -41,5 +42,5 @@ export declare function parseArgs(argv: string[]): ParsedArgs;
41
42
  /** Say what was refused and what the fix is. Each reason has a different one. */
42
43
  /** Exported so the message an operator actually reads can be tested; `init` composes it, nothing else calls it. */
43
44
  export declare function reportRefusal(pkg: SkillPackage, refusal: RefusedSkill): string;
44
- export declare function main(argv: string[]): Promise<number>;
45
+ export declare function main(argv: string[], loadRegistry?: typeof loadWorkspaceRegistry): Promise<number>;
45
46
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAkBH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,EAAuD,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AA0BxH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IACjG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oFAAoF;IACpF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgFpD;AAoFD,iFAAiF;AACjF,mHAAmH;AACnH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CA8B9E;AA6DD,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4H1D"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAgBH,OAAO,EAA0B,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGtF,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAWpC,OAAO,EAAuD,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AA0BxH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,eAAe,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IACjG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oFAAoF;IACpF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAgFpD;AA0FD,iFAAiF;AACjF,mHAAmH;AACnH,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CA8B9E;AA6DD,wBAAsB,IAAI,CACxB,IAAI,EAAE,MAAM,EAAE,EACd,YAAY,GAAE,OAAO,qBAA6C,GACjE,OAAO,CAAC,MAAM,CAAC,CA4HjB"}
package/dist/cli.js CHANGED
@@ -16,9 +16,10 @@ import { realpathSync } from "node:fs";
16
16
  import { readFile } from "node:fs/promises";
17
17
  import { relative, resolve as resolvePath } from "node:path";
18
18
  import { pathToFileURL } from "node:url";
19
+ import { BoundedReadCleanupError } from "./kernel/bounded-read.js";
19
20
  import { UnsafeGrantError } from "./kernel/grant-env.js";
20
21
  import { applyInit, countDeclaring, planInit, GITIGNORE_REINCLUDE_LINES, settingsIgnoredByGit, } from "./governance/init.js";
21
- import { registeredWorkspaceIds } from "./kernel/workspace.js";
22
+ import { registeredWorkspaceIds, loadWorkspaceRegistry } from "./kernel/workspace.js";
22
23
  import { explainDoubledNamespace } from "./kernel/catalog.js";
23
24
  import { discoverSkillPackages, skillPackageRoots, } from "./kernel/skill-packages.js";
24
25
  import { adoptLegacyEnvironment, legacyEnvironmentWarning } from "./kernel/env-names.js";
@@ -151,7 +152,7 @@ export function parseArgs(argv) {
151
152
  return { command: "init", dir, force, errors };
152
153
  }
153
154
  /** Report a plan and what came of applying it. Returns the process exit code. */
154
- async function init(cwd, force) {
155
+ async function init(cwd, force, loadRegistry) {
155
156
  const packages = await discoverSkillPackages(cwd);
156
157
  if (packages.length === 0) {
157
158
  // Names BOTH roots it looked in, and offers pi's own install command first. The previous message named
@@ -171,11 +172,15 @@ async function init(cwd, force) {
171
172
  try {
172
173
  // A registry that cannot be read scaffolds no workspace capabilities. That was silent, so the operator
173
174
  // saw a plan with none and no way to tell it apart from having registered none (rule 8).
174
- plan = planInit(packages, cwd, await registeredWorkspaceIds(undefined, (reason) => console.error(`pi-daddy init: workspace registry unreadable, scaffolding none — ${reason}`)));
175
+ plan = planInit(packages, cwd, await registeredWorkspaceIds(undefined, (reason) => console.error(`pi-daddy init: workspace registry unreadable, scaffolding none — ${reason}`), loadRegistry));
175
176
  }
176
177
  catch (error) {
177
178
  // R-78's backstop reaching the surface. Nothing is written: a grant that could mean something to a
178
179
  // shell is not a grant, and half-scaffolding a project would be worse than scaffolding none of it.
180
+ if (error instanceof BoundedReadCleanupError) {
181
+ console.error(`pi-daddy init: cleanup failed — ${error.message}; no scaffolding applied.`);
182
+ throw error;
183
+ }
179
184
  if (error instanceof UnsafeGrantError) {
180
185
  console.error(`pi-daddy init: ${error.message}`);
181
186
  return 1;
@@ -294,7 +299,7 @@ async function report(plan) {
294
299
  ` $EDITOR ${SETTINGS_REL} # review it, then commit it\n` +
295
300
  ` pi # /grants lists every definition and its verdict`);
296
301
  }
297
- export async function main(argv) {
302
+ export async function main(argv, loadRegistry = loadWorkspaceRegistry) {
298
303
  const adoptedLegacy = adoptLegacyEnvironment(process.env);
299
304
  if (adoptedLegacy.length > 0)
300
305
  console.error(legacyEnvironmentWarning(adoptedLegacy));
@@ -407,7 +412,7 @@ export async function main(argv) {
407
412
  // `--dir` made that comparison false for every entry: every declared skill of every package was reported
408
413
  // "declared but unreadable", nothing was copied, a degenerate grants.env was written anyway, and the exit
409
414
  // code was 0 — while the message blamed the package for a defect in this line.
410
- return init(resolvePath(parsed.dir ?? process.cwd()), parsed.force);
415
+ return init(resolvePath(parsed.dir ?? process.cwd()), parsed.force, loadRegistry);
411
416
  }
412
417
  /**
413
418
  * Only when run as a program. Importing this module (the tests do) must not execute anything.