@caupulican/pi-adaptative 0.81.27 → 0.81.30

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 (191) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/bundled-resources/skills/harness-self-adaptation/SKILL.md +327 -0
  3. package/dist/bundled-resources/skills/harness-self-adaptation/references/adaptation-layers.md +89 -0
  4. package/dist/core/agent-session.d.ts +20 -3
  5. package/dist/core/agent-session.d.ts.map +1 -1
  6. package/dist/core/agent-session.js +73 -17
  7. package/dist/core/agent-session.js.map +1 -1
  8. package/dist/core/auth-storage.d.ts +6 -0
  9. package/dist/core/auth-storage.d.ts.map +1 -1
  10. package/dist/core/auth-storage.js +35 -0
  11. package/dist/core/auth-storage.js.map +1 -1
  12. package/dist/core/autonomy/approval-gate.d.ts +1 -1
  13. package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
  14. package/dist/core/autonomy/approval-gate.js +5 -1
  15. package/dist/core/autonomy/approval-gate.js.map +1 -1
  16. package/dist/core/autonomy/contracts.d.ts +2 -0
  17. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  18. package/dist/core/autonomy/contracts.js.map +1 -1
  19. package/dist/core/autonomy/lane-tool-surface.d.ts +4 -0
  20. package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
  21. package/dist/core/autonomy/lane-tool-surface.js +31 -4
  22. package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
  23. package/dist/core/autonomy/lane-tracker.d.ts +6 -0
  24. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  25. package/dist/core/autonomy/lane-tracker.js +25 -3
  26. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  27. package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
  28. package/dist/core/autonomy/risk-assessment.js +1 -1
  29. package/dist/core/autonomy/risk-assessment.js.map +1 -1
  30. package/dist/core/background-lane-controller.d.ts +34 -1
  31. package/dist/core/background-lane-controller.d.ts.map +1 -1
  32. package/dist/core/background-lane-controller.js +204 -9
  33. package/dist/core/background-lane-controller.js.map +1 -1
  34. package/dist/core/context/context-artifacts.d.ts.map +1 -1
  35. package/dist/core/context/context-artifacts.js +7 -6
  36. package/dist/core/context/context-artifacts.js.map +1 -1
  37. package/dist/core/context/context-store-retention.d.ts +12 -0
  38. package/dist/core/context/context-store-retention.d.ts.map +1 -0
  39. package/dist/core/context/context-store-retention.js +161 -0
  40. package/dist/core/context/context-store-retention.js.map +1 -0
  41. package/dist/core/context-gc.d.ts.map +1 -1
  42. package/dist/core/context-gc.js +20 -4
  43. package/dist/core/context-gc.js.map +1 -1
  44. package/dist/core/context-pipeline.d.ts +18 -15
  45. package/dist/core/context-pipeline.d.ts.map +1 -1
  46. package/dist/core/context-pipeline.js +143 -38
  47. package/dist/core/context-pipeline.js.map +1 -1
  48. package/dist/core/cost/cost-summary.d.ts +7 -1
  49. package/dist/core/cost/cost-summary.d.ts.map +1 -1
  50. package/dist/core/cost/cost-summary.js +28 -17
  51. package/dist/core/cost/cost-summary.js.map +1 -1
  52. package/dist/core/cost/daily-usage.d.ts +7 -3
  53. package/dist/core/cost/daily-usage.d.ts.map +1 -1
  54. package/dist/core/cost/daily-usage.js +10 -5
  55. package/dist/core/cost/daily-usage.js.map +1 -1
  56. package/dist/core/delegation/worker-result.d.ts.map +1 -1
  57. package/dist/core/delegation/worker-result.js +3 -0
  58. package/dist/core/delegation/worker-result.js.map +1 -1
  59. package/dist/core/delegation/worker-runner.d.ts.map +1 -1
  60. package/dist/core/delegation/worker-runner.js +70 -5
  61. package/dist/core/delegation/worker-runner.js.map +1 -1
  62. package/dist/core/export-html/template.js +2 -1
  63. package/dist/core/extensions/loader.d.ts.map +1 -1
  64. package/dist/core/extensions/loader.js +52 -2
  65. package/dist/core/extensions/loader.js.map +1 -1
  66. package/dist/core/extensions/runner.d.ts.map +1 -1
  67. package/dist/core/extensions/runner.js +21 -19
  68. package/dist/core/extensions/runner.js.map +1 -1
  69. package/dist/core/extensions/types.d.ts +5 -0
  70. package/dist/core/extensions/types.d.ts.map +1 -1
  71. package/dist/core/extensions/types.js.map +1 -1
  72. package/dist/core/failure-corpus.d.ts.map +1 -1
  73. package/dist/core/failure-corpus.js +36 -13
  74. package/dist/core/failure-corpus.js.map +1 -1
  75. package/dist/core/local-runtime-controller.d.ts +16 -0
  76. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  77. package/dist/core/local-runtime-controller.js +127 -30
  78. package/dist/core/local-runtime-controller.js.map +1 -1
  79. package/dist/core/memory-controller.d.ts +2 -0
  80. package/dist/core/memory-controller.d.ts.map +1 -1
  81. package/dist/core/memory-controller.js +18 -0
  82. package/dist/core/memory-controller.js.map +1 -1
  83. package/dist/core/model-registry.d.ts +2 -0
  84. package/dist/core/model-registry.d.ts.map +1 -1
  85. package/dist/core/model-registry.js +4 -0
  86. package/dist/core/model-registry.js.map +1 -1
  87. package/dist/core/models/local-runtime.d.ts +2 -0
  88. package/dist/core/models/local-runtime.d.ts.map +1 -1
  89. package/dist/core/models/local-runtime.js +25 -14
  90. package/dist/core/models/local-runtime.js.map +1 -1
  91. package/dist/core/models/runtime-arbiter.d.ts +11 -0
  92. package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
  93. package/dist/core/models/runtime-arbiter.js +35 -13
  94. package/dist/core/models/runtime-arbiter.js.map +1 -1
  95. package/dist/core/reflection-controller.d.ts +5 -1
  96. package/dist/core/reflection-controller.d.ts.map +1 -1
  97. package/dist/core/reflection-controller.js +9 -3
  98. package/dist/core/reflection-controller.js.map +1 -1
  99. package/dist/core/runtime-builder.d.ts +19 -2
  100. package/dist/core/runtime-builder.d.ts.map +1 -1
  101. package/dist/core/runtime-builder.js +13 -5
  102. package/dist/core/runtime-builder.js.map +1 -1
  103. package/dist/core/sdk.d.ts.map +1 -1
  104. package/dist/core/sdk.js +3 -0
  105. package/dist/core/sdk.js.map +1 -1
  106. package/dist/core/session-analytics.d.ts +13 -7
  107. package/dist/core/session-analytics.d.ts.map +1 -1
  108. package/dist/core/session-analytics.js +155 -112
  109. package/dist/core/session-analytics.js.map +1 -1
  110. package/dist/core/tool-gate-controller.d.ts +3 -0
  111. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  112. package/dist/core/tool-gate-controller.js +20 -15
  113. package/dist/core/tool-gate-controller.js.map +1 -1
  114. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  115. package/dist/core/tool-recovery-log-records.js +54 -9
  116. package/dist/core/tool-recovery-log-records.js.map +1 -1
  117. package/dist/core/tool-recovery-logger.d.ts +2 -0
  118. package/dist/core/tool-recovery-logger.d.ts.map +1 -1
  119. package/dist/core/tool-recovery-logger.js +32 -13
  120. package/dist/core/tool-recovery-logger.js.map +1 -1
  121. package/dist/core/tool-recovery-stats.d.ts +15 -0
  122. package/dist/core/tool-recovery-stats.d.ts.map +1 -0
  123. package/dist/core/tool-recovery-stats.js +206 -0
  124. package/dist/core/tool-recovery-stats.js.map +1 -0
  125. package/dist/core/tool-selection/expected-utility.d.ts +51 -0
  126. package/dist/core/tool-selection/expected-utility.d.ts.map +1 -0
  127. package/dist/core/tool-selection/expected-utility.js +85 -0
  128. package/dist/core/tool-selection/expected-utility.js.map +1 -0
  129. package/dist/core/tool-selection/tool-performance-store.d.ts +82 -0
  130. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -0
  131. package/dist/core/tool-selection/tool-performance-store.js +249 -0
  132. package/dist/core/tool-selection/tool-performance-store.js.map +1 -0
  133. package/dist/core/tool-selection/tool-selection-controller.d.ts +41 -0
  134. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -0
  135. package/dist/core/tool-selection/tool-selection-controller.js +199 -0
  136. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -0
  137. package/dist/core/tools/delegate-status.d.ts +9 -0
  138. package/dist/core/tools/delegate-status.d.ts.map +1 -0
  139. package/dist/core/tools/delegate-status.js +61 -0
  140. package/dist/core/tools/delegate-status.js.map +1 -0
  141. package/dist/core/tools/delegate.d.ts +13 -0
  142. package/dist/core/tools/delegate.d.ts.map +1 -1
  143. package/dist/core/tools/delegate.js +28 -4
  144. package/dist/core/tools/delegate.js.map +1 -1
  145. package/dist/core/tools/run-toolkit-script.d.ts +3 -0
  146. package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
  147. package/dist/core/tools/run-toolkit-script.js +17 -7
  148. package/dist/core/tools/run-toolkit-script.js.map +1 -1
  149. package/dist/main.d.ts.map +1 -1
  150. package/dist/main.js +1 -1
  151. package/dist/main.js.map +1 -1
  152. package/dist/modes/interactive/components/bash-execution.d.ts +2 -1
  153. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/bash-execution.js +12 -1
  155. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  156. package/dist/modes/interactive/components/footer.d.ts +1 -0
  157. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  158. package/dist/modes/interactive/components/footer.js +19 -9
  159. package/dist/modes/interactive/components/footer.js.map +1 -1
  160. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  161. package/dist/modes/interactive/components/tool-execution.js +12 -2
  162. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  163. package/dist/modes/interactive/components/tool-panel-registry.d.ts +1 -0
  164. package/dist/modes/interactive/components/tool-panel-registry.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/tool-panel-registry.js +18 -2
  166. package/dist/modes/interactive/components/tool-panel-registry.js.map +1 -1
  167. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  168. package/dist/modes/interactive/interactive-mode.js +18 -0
  169. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  170. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  171. package/dist/modes/rpc/jsonl.js +9 -28
  172. package/dist/modes/rpc/jsonl.js.map +1 -1
  173. package/dist/utils/streaming-lines.d.ts +20 -0
  174. package/dist/utils/streaming-lines.d.ts.map +1 -0
  175. package/dist/utils/streaming-lines.js +79 -0
  176. package/dist/utils/streaming-lines.js.map +1 -0
  177. package/docs/extensions.md +2 -0
  178. package/docs/index.md +1 -1
  179. package/docs/integration-sweep-builder-blueprint-2026-07-09.md +365 -0
  180. package/docs/integration-sweep-resume-2026-07-09.md +407 -0
  181. package/docs/self-adaptation.md +7 -0
  182. package/docs/settings.md +7 -1
  183. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  184. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  185. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  186. package/examples/extensions/sandbox/package-lock.json +2 -2
  187. package/examples/extensions/sandbox/package.json +1 -1
  188. package/examples/extensions/with-deps/package-lock.json +2 -2
  189. package/examples/extensions/with-deps/package.json +1 -1
  190. package/npm-shrinkwrap.json +12 -12
  191. package/package.json +4 -4
@@ -0,0 +1,407 @@
1
+ # Integration Sweep Resume Note — 2026-07-09
2
+
3
+ Status: paused by user after a second work slice; implementation is intentionally uncommitted and
4
+ ready to resume. The latest slice has not yet been re-tested.
5
+
6
+ ## Scope
7
+
8
+ Synchronize and simplify these host subsystems while prioritizing foreground performance and
9
+ accuracy:
10
+
11
+ - toolkit store and deterministic toolkit routing;
12
+ - shared tool repair and isolated child loops;
13
+ - local-model lifecycle, routing, residency, and background lanes;
14
+ - memory and file-backed tool-output artifacts;
15
+ - worker/subagent contracts and accounting;
16
+ - generic external memory-provider compatibility.
17
+
18
+ Do not modify Pi extensions. In particular, no files under
19
+ `/home/caudev/__pi/agent/extensions` were changed. Graphify was inspected only as an external
20
+ consumer of the host's generic tool and context-memory-provider contracts.
21
+
22
+ ## Design decisions
23
+
24
+ 1. Foreground first: optional local curation/background work must not compete with a local user
25
+ turn.
26
+ 2. One model-call gateway: foreground, routed, and isolated calls must share managed-local
27
+ readiness, repair telemetry, timeout behavior, and accounting.
28
+ 3. Reuse a configured healthy Ollama server when it exposes the requested model. Server/store
29
+ ownership is not a capability boundary.
30
+ 4. Residency admission must not synchronously cold-load Ollama with an empty generation. The real
31
+ adaptive stream owns cold load and prefill timing.
32
+ 5. Preserve exact oversized tool output in retrievable artifacts; send bounded previews to models.
33
+ 6. Use compact structured model-to-model contracts. Do not use Unicode/Braille as compression;
34
+ measure tokenizer cost instead.
35
+ 7. Future automatic tool selection should use constrained expected utility, not another free-form
36
+ judge:
37
+
38
+ `utility = success_probability * value - latency_cost - token_cost - risk_cost - context_cost`
39
+
40
+ Hard capability/path/profile gates run first; ambiguous rankings return a shortlist or defer to
41
+ the foreground model.
42
+
43
+ ## Implemented in the working tree
44
+
45
+ ### Local model reliability and performance
46
+
47
+ - `ReflectionController.runIsolatedCompletion` now calls a shared managed-local readiness gate, so
48
+ research, workers, route judges, curation, reflex interpretation, fitness probes, and other
49
+ isolated calls no longer bypass local runtime startup.
50
+ - Manual/default local foreground models now receive readiness handling even when the model router
51
+ is disabled.
52
+ - A healthy configured Ollama server is reused when `/api/tags` contains the requested model,
53
+ regardless of whether its store is Pi-owned, user-owned, or externally managed.
54
+ - Ollama detection now carries the live server's model list in `LocalRuntimeStatus`, so the initial
55
+ readiness pass uses one `/api/tags` request instead of detecting and listing separately.
56
+ - A running server missing the requested model fails visibly instead of being used incorrectly.
57
+ - Runtime residency adapters are collected into one session-wide view instead of constructing an
58
+ arbiter that sees only the current runtime.
59
+ - Residency supports admission/eviction without loading the model. The local controller uses this
60
+ mode to avoid a blocking empty `/api/generate` with a 60-second timeout before the real request.
61
+ - Already-resident models no longer receive redundant activation calls from the arbiter.
62
+ - Local curator draining is deferred while both the foreground and curator models are managed-local,
63
+ preventing a fire-and-forget curator from taking a single-parallel Ollama slot before the user
64
+ request.
65
+ - A focused local-priority regression test was added but has not yet been run.
66
+
67
+ ### Tool repair
68
+
69
+ - Isolated child tool loops now forward `onToolArgumentValidation` and
70
+ `onToolValidationEscalation`, so their deterministic repairs and repeated validation failures use
71
+ the same telemetry/adaptation path as foreground calls.
72
+
73
+ ### Toolkit output artifacts
74
+
75
+ - `run_toolkit_script` now stores exact oversized stdout/stderr in the session artifact store and
76
+ returns an 8 KiB/400-line bounded preview plus an `artifact_retrieve` handle.
77
+ - Exit status and failure text remain in the preview; toolkit output is marked non-reproducible.
78
+
79
+ ## Live diagnosis captured
80
+
81
+ - The active Pi config is under `~/.pi/agent`.
82
+ - Its Ollama provider targets `http://localhost:11434/v1` and registers local qwen/MiniCPM models.
83
+ - The model router was disabled at inspection time, but local cheap/executor models remained
84
+ configured.
85
+ - No Ollama server was running during inspection and no Linux Ollama binary was found in PATH or the
86
+ Pi runtime directory.
87
+ - Another local configuration under `~/__pi/agent` targets a manually served Windows/WSL endpoint.
88
+ - The prior host policy rejected non-Pi-owned running stores and synchronously preloaded models;
89
+ these were concrete causes of manual-server performance being better and local use failing.
90
+
91
+ ## Focused validation completed
92
+
93
+ From `packages/coding-agent`:
94
+
95
+ ```bash
96
+ node ../../node_modules/vitest/dist/cli.js --run \
97
+ test/run-toolkit-script.test.ts \
98
+ test/isolated-child-loop.test.ts \
99
+ test/agent-session-local-runtime.test.ts \
100
+ test/runtime-arbiter.test.ts \
101
+ test/brain-curator.test.ts \
102
+ test/context-pipeline-token-budget.test.ts
103
+ ```
104
+
105
+ Result: 6 files passed, 65 tests passed.
106
+
107
+ Earlier focused run also passed the existing local runtime and isolated child tests after the
108
+ readiness changes.
109
+
110
+ `npm run check` has not been run yet because the user paused the sweep before final validation.
111
+
112
+ Important: after that 65-test green run, the second slice changed `LocalRuntimeStatus` to include
113
+ `serverModels` and added `context-pipeline-local-priority.test.ts`. Those latest changes have not yet
114
+ been compiled or tested.
115
+
116
+ ## Files changed by this sweep
117
+
118
+ - `packages/coding-agent/src/core/agent-session.ts`
119
+ - `packages/coding-agent/src/core/context-pipeline.ts`
120
+ - `packages/coding-agent/src/core/local-runtime-controller.ts`
121
+ - `packages/coding-agent/src/core/models/runtime-arbiter.ts`
122
+ - `packages/coding-agent/src/core/reflection-controller.ts`
123
+ - `packages/coding-agent/src/core/runtime-builder.ts`
124
+ - `packages/coding-agent/src/core/tools/run-toolkit-script.ts`
125
+ - `packages/coding-agent/test/agent-session-local-runtime.test.ts`
126
+ - `packages/coding-agent/test/context-pipeline-token-budget.test.ts`
127
+ - `packages/coding-agent/test/context-pipeline-local-priority.test.ts`
128
+ - `packages/coding-agent/test/isolated-child-loop.test.ts`
129
+ - `packages/coding-agent/test/run-toolkit-script.test.ts`
130
+ - `packages/coding-agent/test/runtime-arbiter.test.ts`
131
+ - this resume note.
132
+
133
+ `packages/coding-agent/docs/bug-ledger.md` was already modified before this sweep and was not edited
134
+ as part of this work.
135
+
136
+ ## Remaining work: exact execution plan
137
+
138
+ ### 1. Stabilize the latest local-runtime changes
139
+
140
+ Files:
141
+
142
+ - `src/core/models/local-runtime.ts`
143
+ - `src/core/local-runtime-controller.ts`
144
+ - `src/core/models/runtime-arbiter.ts`
145
+ - `test/agent-session-local-runtime.test.ts`
146
+ - `test/runtime-arbiter.test.ts`
147
+
148
+ How:
149
+
150
+ 1. Compile/run the focused tests first. `LocalRuntimeStatus.serverModels` is newly required, so faux
151
+ status literals in other tests may need `serverModels: []`.
152
+ 2. Check that one cold readiness pass performs:
153
+ - one `/api/tags` request for reachability plus requested-model presence;
154
+ - one `/api/ps` request for residency accounting;
155
+ - no empty `/api/generate` preload;
156
+ - then the real OpenAI-compatible stream, whose adaptive local connect bound owns cold load and
157
+ prefill.
158
+ 3. Keep `_confirmedUp` as the steady-state fast path: subsequent successful turns should perform no
159
+ readiness HTTP requests until a matching local assistant error invalidates the key.
160
+ 4. Verify a manually managed server is accepted only when it exposes the exact requested model or
161
+ the bare/`:latest` equivalent. A reachable server without the model must return
162
+ `model_missing_on_server`, not proceed and fail later.
163
+ 5. Review session-wide residency adapter identities for multiple Ollama URLs and Transformers
164
+ models. They must not collide.
165
+
166
+ Expected:
167
+
168
+ - Manually started Ollama keeps its own binary, GPU/backend configuration, model store, and warm
169
+ cache.
170
+ - Pi starts its managed server only when the configured endpoint is down and a usable binary exists.
171
+ - No duplicate server is started against an already reachable configured endpoint.
172
+ - Local route, manual model, judge, research, worker, curation, reflex, and fitness calls all pass
173
+ through readiness.
174
+ - Foreground failure remains visible and router fallback remains bounded/explicit.
175
+
176
+ Acceptance tests:
177
+
178
+ ```bash
179
+ cd packages/coding-agent
180
+ node ../../node_modules/vitest/dist/cli.js --run \
181
+ test/agent-session-local-runtime.test.ts \
182
+ test/runtime-arbiter.test.ts \
183
+ test/model-perf-profile.test.ts \
184
+ test/isolated-child-loop.test.ts
185
+ ```
186
+
187
+ ### 2. Finish foreground-priority behavior
188
+
189
+ Files:
190
+
191
+ - `src/core/context-pipeline.ts`
192
+ - `test/context-pipeline-local-priority.test.ts`
193
+ - optionally `test/brain-curator.test.ts` if a session-level regression is clearer.
194
+
195
+ How:
196
+
197
+ 1. Run the newly added local-priority test and correct type/faux-dependency issues.
198
+ 2. Keep queued curator work intact when both foreground and curator are managed-local.
199
+ 3. Add a second assertion or test proving the same queued job can drain later when the foreground is
200
+ a cloud model or no local foreground is active. Do not drop or mark the job completed on defer.
201
+ 4. Keep the visible reason code `curation_deferred_for_local_foreground` in diagnostics.
202
+
203
+ Expected:
204
+
205
+ - Optional curation never takes a single-parallel local server slot before a user request.
206
+ - Deferral loses no work; curation can run on a later non-competing turn.
207
+ - Cloud foreground plus local curator remains allowed unless profiling later shows host CPU pressure.
208
+
209
+ ### 3. Complete toolkit/artifact integration
210
+
211
+ Files:
212
+
213
+ - `src/core/tools/run-toolkit-script.ts`
214
+ - `src/core/runtime-builder.ts`
215
+ - `test/run-toolkit-script.test.ts`
216
+
217
+ How:
218
+
219
+ 1. Re-run the artifact regression.
220
+ 2. Confirm the active-tool companion rule always activates `artifact_retrieve` when
221
+ `run_toolkit_script` can emit an artifact. The current runtime only auto-adds the companion for
222
+ `grep`/`find`; either extend that condition to toolkit or suppress the artifact store when the
223
+ retrieval tool is not active. Never emit an unresolvable handle.
224
+ 3. Keep the preview bounded at 8 KiB/400 lines unless measurement supports a smaller cap.
225
+ 4. Preserve exit code, timeout state, first failure text, stdout/stderr labels, and exact full output
226
+ in the artifact.
227
+ 5. Verify context-GC reference release recognizes toolkit `details.artifactId` exactly as it does for
228
+ grep/find.
229
+
230
+ Expected:
231
+
232
+ - Small script output stays directly readable.
233
+ - Large output never bloats prompt context and is never lost.
234
+ - Every emitted artifact handle is resolvable in the same active tool surface.
235
+ - Failed scripts remain unmistakably failed even when output is packed.
236
+
237
+ ### 4. Tool-selection policy: observe first
238
+
239
+ Do not add an orphan policy module. Integrate only when its inputs and output have live owners.
240
+
241
+ Suggested files:
242
+
243
+ - new `src/core/tool-selection/expected-utility.ts` for pure math;
244
+ - new `src/core/tool-selection/tool-performance-store.ts` for bounded host/model/tool statistics;
245
+ - `src/core/tool-gate-controller.ts` for execution outcomes/timing;
246
+ - `src/core/system-prompt-builder.ts` or a dedicated pre-turn controller for a compact recommendation;
247
+ - focused tests under `test/tool-selection-*.test.ts`.
248
+
249
+ How:
250
+
251
+ 1. Candidate generation uses only active, profile-allowed, capability-compatible tools.
252
+ 2. Hard gates run before scoring: denied tool/path/capability never becomes a candidate.
253
+ 3. Maintain per `(host, model ref, intent class, tool)` bounded statistics:
254
+ - Beta posterior `alpha/beta` for success probability;
255
+ - latency EWMA and bounded deviation;
256
+ - prompt/output-token EWMA where observable;
257
+ - repair/bounce/failure counts;
258
+ - last-used timestamp and sample count.
259
+ 4. Score candidates with normalized units:
260
+
261
+ `U(t) = Psuccess(t) * value(t) - λL*latency(t) - λT*tokens(t) - λR*risk(t) - λC*context(t)`
262
+
263
+ 5. Include `no_tool` as a real candidate with zero cost and an intent-dependent value.
264
+ 6. Recommend a tool only when:
265
+ - best utility is positive;
266
+ - best-minus-runner-up exceeds a configured margin;
267
+ - minimum evidence exists, or the match is deterministic name/alias/schema intent.
268
+ 7. Compute normalized entropy over candidate probabilities. High entropy produces a shortlist; it
269
+ never executes automatically.
270
+ 8. First production slice is observe-only: persist/redact rankings and compare recommendation to the
271
+ model's actual choice. Do not hide tools or execute on the model's behalf.
272
+ 9. Promote to a concise prompt hint only after offline replay shows higher first-tool success and no
273
+ increase in unsafe/wrong-tool calls.
274
+
275
+ Expected:
276
+
277
+ - Exact toolkit/name hits remain deterministic and model-call-free.
278
+ - Repeated host/model workflows improve from observed outcomes.
279
+ - Ambiguity remains conservative.
280
+ - The selector reduces wrong first tools, retries, latency, and context cost without becoming another
281
+ prompt-heavy router.
282
+
283
+ Acceptance metrics:
284
+
285
+ - first-tool success rate;
286
+ - wrong-tool/refusal rate;
287
+ - p50/p95 time to first useful tool result;
288
+ - tool-related input/output tokens;
289
+ - repair and validation-bounce rate;
290
+ - shortlist/abstention calibration;
291
+ - no regression in capability/path gate enforcement.
292
+
293
+ ### 5. Worker semantics
294
+
295
+ Files:
296
+
297
+ - `src/core/delegation/worker-runner.ts`
298
+ - `src/core/background-lane-controller.ts`
299
+ - `src/core/delegation/worker-result.ts`
300
+ - worker delegation tests.
301
+
302
+ Current fact: direct write/edit tools and structured actions may mutate inside the capability
303
+ envelope before `validateWorkerResult` returns `parent_review_required`.
304
+
305
+ How:
306
+
307
+ 1. Do not silently remove the intentional write lane.
308
+ 2. Choose and document one explicit contract:
309
+ - review-after-apply: envelope authorization permits mutation; parent reviews/validates afterward;
310
+ - staged apply: worker returns structured actions/patches, parent gate accepts, then runner applies.
311
+ 3. If staged apply is selected, direct write/edit tools must also target a staging layer; otherwise
312
+ only structured actions are truly staged.
313
+ 4. Preserve symlink-aware path enforcement, changed-file accounting on partial failure, blockers, and
314
+ spawned usage under either contract.
315
+
316
+ Expected:
317
+
318
+ - User and parent can tell whether review is pre- or post-mutation.
319
+ - A blocked/out-of-scope action never mutates.
320
+ - Partial mutations never look like clean success.
321
+
322
+ ### 6. External memory and Graphify compatibility
323
+
324
+ Host files only. Do not modify Pi extensions.
325
+
326
+ How:
327
+
328
+ 1. Verify extension registration/reload keeps both `registerMemoryProvider` and
329
+ `registerContextMemoryProvider` contributions across atomic reloads.
330
+ 2. Add/retain host tests using faux graph-capable context providers (`graph: true`) rather than
331
+ importing private Graphify code.
332
+ 3. Confirm generic graph results are budgeted, source-labeled, wrapped as untrusted evidence, and
333
+ included only when the long-term-memory demand gate opens.
334
+ 4. Confirm dynamic provider GC markers join context-GC markers without brand-specific host logic.
335
+
336
+ Expected:
337
+
338
+ - The host is fully ready for Graphify or any graph provider through public contracts.
339
+ - Private providers remain optional and can disappear/reload without breaking the session.
340
+ - No private brand or path becomes a package dependency.
341
+
342
+ ### 7. Documentation and final validation
343
+
344
+ Update these stale planning snapshots after behavior is final:
345
+
346
+ - `docs/model-router-rework.md`
347
+ - `docs/model-router-rework/current-state.md`
348
+ - `docs/model-router-rework/local-model-lifecycle-design.md`
349
+ - `docs/context-management-rework/tool-output-artifacts.md`
350
+ - this note: change status to completed and record final test/check results.
351
+
352
+ Document:
353
+
354
+ - three-tier router and judge are implemented;
355
+ - autonomy/delegation/research directories exist;
356
+ - managed-local readiness covers every call path;
357
+ - configured manual Ollama servers are preferred when valid;
358
+ - residency admission is non-blocking;
359
+ - local foreground has priority over optional local sidecars;
360
+ - artifact coverage is grep/find/toolkit, plus any additional tools actually completed;
361
+ - worker mutation semantics exactly as implemented.
362
+
363
+ Final commands:
364
+
365
+ ```bash
366
+ cd /home/caudev/GitHub/mine/pi-adaptative
367
+ git status --short
368
+
369
+ cd packages/coding-agent
370
+ node ../../node_modules/vitest/dist/cli.js --run \
371
+ test/agent-session-local-runtime.test.ts \
372
+ test/runtime-arbiter.test.ts \
373
+ test/model-perf-profile.test.ts \
374
+ test/isolated-child-loop.test.ts \
375
+ test/context-pipeline-local-priority.test.ts \
376
+ test/context-pipeline-token-budget.test.ts \
377
+ test/brain-curator.test.ts \
378
+ test/run-toolkit-script.test.ts
379
+
380
+ cd /home/caudev/GitHub/mine/pi-adaptative
381
+ npm run check
382
+ ```
383
+
384
+ Fix every error, warning, and info from `npm run check`. Do not use `tail`. Do not run `npm test` or
385
+ `npm run build` unless requested. Do not commit unless requested.
386
+
387
+ ## Resume command
388
+
389
+ Start at the repository root and inspect only; do not discard other-session changes:
390
+
391
+ ```bash
392
+ git status --short
393
+ git diff -- \
394
+ packages/coding-agent/src/core/agent-session.ts \
395
+ packages/coding-agent/src/core/context-pipeline.ts \
396
+ packages/coding-agent/src/core/local-runtime-controller.ts \
397
+ packages/coding-agent/src/core/models/runtime-arbiter.ts \
398
+ packages/coding-agent/src/core/reflection-controller.ts \
399
+ packages/coding-agent/src/core/runtime-builder.ts \
400
+ packages/coding-agent/src/core/tools/run-toolkit-script.ts \
401
+ packages/coding-agent/test/agent-session-local-runtime.test.ts \
402
+ packages/coding-agent/test/context-pipeline-token-budget.test.ts \
403
+ packages/coding-agent/test/context-pipeline-local-priority.test.ts \
404
+ packages/coding-agent/test/isolated-child-loop.test.ts \
405
+ packages/coding-agent/test/run-toolkit-script.test.ts \
406
+ packages/coding-agent/test/runtime-arbiter.test.ts
407
+ ```
@@ -11,6 +11,7 @@ This keeps a human on the edge of the loop: Pi proposes, you confirm, then it ac
11
11
  - [Skillify](#skillify)
12
12
  - [Extensionify](#extensionify)
13
13
  - [Learn](#learn)
14
+ - [Harness self-adaptation](#harness-self-adaptation)
14
15
  - [Duplicate detection](#duplicate-detection)
15
16
  - [Going live](#going-live)
16
17
 
@@ -57,6 +58,12 @@ Before anything is offered for activation, the candidate is **smoke-tested in is
57
58
 
58
59
  `/learn` orchestrates; it never writes or activates on its own. Long-term memory storage is handled outside Pi; `/learn` routes to it rather than implementing it.
59
60
 
61
+ ## Harness self-adaptation
62
+
63
+ For work on Pi itself, the bundled `harness-self-adaptation` skill keeps the active task primary and wraps it in a bounded improvement loop: define an observable oracle, capture a baseline or correctness invariant, diagnose the owning mechanism, choose the smallest enforcing layer, validate a focused intervention, then retain or roll it back. A task with no reusable evidence ends with no durable adaptation rather than a speculative change.
64
+
65
+ The skill treats tests, benchmarks, telemetry, and before/after measurements as retention evidence. It keeps code defects in their owning code, routes procedures to skills or prompts, and reserves extensions or core changes for behavior lower layers cannot enforce. It composes with `pi-harness-learning` for after-action capture and `skill-architect` for instruction authoring. Pi can load it when the task description matches, or you can force it with `/skill:harness-self-adaptation`.
66
+
60
67
  ## Duplicate detection
61
68
 
62
69
  The `skill_audit` tool guards against accumulating near-identical skills. Given a draft's name, description, and body, it scans your loaded skills and scores keyword overlap. Matches above the similarity threshold are flagged so you can **merge or refine** an existing skill instead of adding a redundant one.
package/docs/settings.md CHANGED
@@ -148,7 +148,13 @@ Fitness applicability is intentionally split by autonomy level:
148
148
 
149
149
  ### Worker Delegation
150
150
 
151
- Delegation is available by default when the active model and UAC tool surface support it. Ultra reinforces proactive use but does not own or unlock the capability. Each worker gets a fresh classified tool surface (`read`, `grep`, `find`, and `ls`); its shipped profile filters those names with the same glob semantics as foreground UAC. `delegate`, shell, memory/lifecycle tools, and opaque extension tools are never inherited into the child. Workers remain read-only unless the write toggle, a non-empty path scope, and the shipped profile all grant `write` or `edit`.
151
+ Delegation is available by default when the active model and UAC tool surface support it. Ultra reinforces proactive use but does not own or unlock the capability. Each worker gets a fresh classified tool surface (`read`, `grep`, `find`, and `ls`); its shipped profile filters those names with the same glob semantics as foreground UAC. `delegate`, shell, foreground memory/lifecycle tools, and opaque extension tools are never inherited into the child. The orchestrator may set `memoryRead: true` for a relevant task; if global memory retrieval remains enabled and the lane profile also grants `memory`, the worker receives a separate bounded query-only memory tool. Generic file tools cannot bypass that decision by reading private memory/auth/settings files. Memory writes remain unavailable. Workers are otherwise read-only unless the write toggle, a non-empty path scope, and the shipped profile all grant `write` or `edit`.
152
+
153
+ The worker model is provider-independent: when `workerDelegation.model` is unset it inherits the active model; an explicit pattern may select any authenticated, capability-eligible model, including subscription, API-key, or local providers. The isolated worker resolves auth and text-tool fallback from that selected model rather than inheriting the foreground model's protocol. Local workers that contend with a local foreground are queued and drained at the configured running concurrency. `delegate_status` preserves bounded non-JSON read-only results and labels output that ended at a provider limit as incomplete instead of discarding it as unparseable.
154
+
155
+ **Confirmed behavior:** `delegate` returns a lane id immediately instead of waiting for the worker. `delegate_status` shows queued, running, and terminal workers and retrieves bounded terminal output by lane id. Completion emits a session notification with the completed lane id and status; the interactive footer shows running/queued counts or the latest terminal lane. Late worker output is stored separately and is never injected into an active foreground transcript.
156
+
157
+ Worker writes use **review-after-apply** semantics: a gate-authorized direct `write`/`edit` call or an envelope/path-validated structured action may mutate the scoped workspace before the parent reviews the result. The parent review is therefore a post-mutation acceptance step and receives changed files, blockers, the usage report id, and `parent_review_required` for an in-scope changed result. Denied or out-of-scope actions are refused before filesystem mutation; partial application is reported as `blocked`, never clean success.
152
158
 
153
159
  | Setting | Type | Default | Description |
154
160
  |---------|------|---------|-------------|
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.81.27",
3
+ "version": "0.81.30",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.81.27",
9
+ "version": "0.81.30",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.81.27",
4
+ "version": "0.81.30",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.81.27",
4
+ "version": "0.81.30",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "0.81.27",
3
+ "version": "0.81.30",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "0.81.27",
9
+ "version": "0.81.30",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.81.27",
4
+ "version": "0.81.30",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.81.27",
3
+ "version": "0.81.30",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.81.27",
9
+ "version": "0.81.30",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.81.27",
4
+ "version": "0.81.30",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@caupulican/pi-adaptative",
3
- "version": "0.81.27",
3
+ "version": "0.81.30",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@caupulican/pi-adaptative",
9
- "version": "0.81.27",
9
+ "version": "0.81.30",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@caupulican/pi-agent-core": "^0.81.27",
13
- "@caupulican/pi-ai": "^0.81.27",
14
- "@caupulican/pi-tui": "^0.81.27",
12
+ "@caupulican/pi-agent-core": "^0.81.30",
13
+ "@caupulican/pi-ai": "^0.81.30",
14
+ "@caupulican/pi-tui": "^0.81.30",
15
15
  "@ff-labs/fff-node": "0.9.6",
16
16
  "@silvia-odwyer/photon-node": "0.3.4",
17
17
  "chalk": "5.6.2",
@@ -475,11 +475,11 @@
475
475
  }
476
476
  },
477
477
  "node_modules/@caupulican/pi-agent-core": {
478
- "version": "0.81.27",
479
- "resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.81.27.tgz",
478
+ "version": "0.81.30",
479
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.81.30.tgz",
480
480
  "license": "MIT",
481
481
  "dependencies": {
482
- "@caupulican/pi-ai": "^0.81.27",
482
+ "@caupulican/pi-ai": "^0.81.30",
483
483
  "ignore": "7.0.5",
484
484
  "typebox": "1.1.38",
485
485
  "yaml": "2.9.0"
@@ -489,8 +489,8 @@
489
489
  }
490
490
  },
491
491
  "node_modules/@caupulican/pi-ai": {
492
- "version": "0.81.27",
493
- "resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.81.27.tgz",
492
+ "version": "0.81.30",
493
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.81.30.tgz",
494
494
  "license": "MIT",
495
495
  "dependencies": {
496
496
  "@anthropic-ai/sdk": "0.91.1",
@@ -512,8 +512,8 @@
512
512
  }
513
513
  },
514
514
  "node_modules/@caupulican/pi-tui": {
515
- "version": "0.81.27",
516
- "resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.81.27.tgz",
515
+ "version": "0.81.30",
516
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.81.30.tgz",
517
517
  "license": "MIT",
518
518
  "dependencies": {
519
519
  "get-east-asian-width": "1.6.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caupulican/pi-adaptative",
3
- "version": "0.81.27",
3
+ "version": "0.81.30",
4
4
  "description": "Adaptive fork of Pi coding agent for self-evolving agent harness experiments",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -73,9 +73,9 @@
73
73
  "prepublishOnly": "npm run clean && npm run build && npm run shrinkwrap"
74
74
  },
75
75
  "dependencies": {
76
- "@caupulican/pi-agent-core": "^0.81.27",
77
- "@caupulican/pi-ai": "^0.81.27",
78
- "@caupulican/pi-tui": "^0.81.27",
76
+ "@caupulican/pi-agent-core": "^0.81.30",
77
+ "@caupulican/pi-ai": "^0.81.30",
78
+ "@caupulican/pi-tui": "^0.81.30",
79
79
  "@ff-labs/fff-node": "0.9.6",
80
80
  "@silvia-odwyer/photon-node": "0.3.4",
81
81
  "chalk": "5.6.2",