@miller-tech/uap 2.21.3 → 2.36.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 (328) hide show
  1. package/README.md +22 -10
  2. package/config/model-profiles/qwen38-coder390.json +46 -0
  3. package/config/model-profiles/qwen38.json +3 -2
  4. package/config/model-registry.json +110 -0
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/benchmarks/paired/types.d.ts +2 -2
  7. package/dist/bin/cli.js +315 -20
  8. package/dist/bin/cli.js.map +1 -1
  9. package/dist/cli/attention.d.ts +6 -0
  10. package/dist/cli/attention.d.ts.map +1 -0
  11. package/dist/cli/attention.js +115 -0
  12. package/dist/cli/attention.js.map +1 -0
  13. package/dist/cli/bench-report.d.ts +82 -0
  14. package/dist/cli/bench-report.d.ts.map +1 -0
  15. package/dist/cli/bench-report.js +237 -0
  16. package/dist/cli/bench-report.js.map +1 -0
  17. package/dist/cli/clients.d.ts +6 -0
  18. package/dist/cli/clients.d.ts.map +1 -0
  19. package/dist/cli/clients.js +142 -0
  20. package/dist/cli/clients.js.map +1 -0
  21. package/dist/cli/dashboard-grants.d.ts +26 -0
  22. package/dist/cli/dashboard-grants.d.ts.map +1 -0
  23. package/dist/cli/dashboard-grants.js +69 -0
  24. package/dist/cli/dashboard-grants.js.map +1 -0
  25. package/dist/cli/dashboard-pace.d.ts +31 -0
  26. package/dist/cli/dashboard-pace.d.ts.map +1 -0
  27. package/dist/cli/dashboard-pace.js +42 -0
  28. package/dist/cli/dashboard-pace.js.map +1 -0
  29. package/dist/cli/dashboard-session.d.ts +25 -0
  30. package/dist/cli/dashboard-session.d.ts.map +1 -0
  31. package/dist/cli/dashboard-session.js +814 -0
  32. package/dist/cli/dashboard-session.js.map +1 -0
  33. package/dist/cli/dashboard-types.d.ts +18 -0
  34. package/dist/cli/dashboard-types.d.ts.map +1 -0
  35. package/dist/cli/dashboard-types.js +9 -0
  36. package/dist/cli/dashboard-types.js.map +1 -0
  37. package/dist/cli/dashboard.d.ts +2 -18
  38. package/dist/cli/dashboard.d.ts.map +1 -1
  39. package/dist/cli/dashboard.js +43 -793
  40. package/dist/cli/dashboard.js.map +1 -1
  41. package/dist/cli/deliver.d.ts +35 -0
  42. package/dist/cli/deliver.d.ts.map +1 -1
  43. package/dist/cli/deliver.js +93 -9
  44. package/dist/cli/deliver.js.map +1 -1
  45. package/dist/cli/diff.d.ts +85 -0
  46. package/dist/cli/diff.d.ts.map +1 -0
  47. package/dist/cli/diff.js +293 -0
  48. package/dist/cli/diff.js.map +1 -0
  49. package/dist/cli/eta.d.ts +35 -0
  50. package/dist/cli/eta.d.ts.map +1 -0
  51. package/dist/cli/eta.js +101 -0
  52. package/dist/cli/eta.js.map +1 -0
  53. package/dist/cli/handsfree.d.ts +7 -0
  54. package/dist/cli/handsfree.d.ts.map +1 -1
  55. package/dist/cli/handsfree.js +27 -0
  56. package/dist/cli/handsfree.js.map +1 -1
  57. package/dist/cli/hooks.d.ts.map +1 -1
  58. package/dist/cli/hooks.js +126 -5
  59. package/dist/cli/hooks.js.map +1 -1
  60. package/dist/cli/loops.d.ts +24 -5
  61. package/dist/cli/loops.d.ts.map +1 -1
  62. package/dist/cli/loops.js +92 -12
  63. package/dist/cli/loops.js.map +1 -1
  64. package/dist/cli/models.d.ts +62 -0
  65. package/dist/cli/models.d.ts.map +1 -0
  66. package/dist/cli/models.js +567 -0
  67. package/dist/cli/models.js.map +1 -0
  68. package/dist/cli/plan.d.ts +9 -0
  69. package/dist/cli/plan.d.ts.map +1 -1
  70. package/dist/cli/plan.js +57 -4
  71. package/dist/cli/plan.js.map +1 -1
  72. package/dist/cli/proxy-relay.d.ts +55 -0
  73. package/dist/cli/proxy-relay.d.ts.map +1 -0
  74. package/dist/cli/proxy-relay.js +116 -0
  75. package/dist/cli/proxy-relay.js.map +1 -0
  76. package/dist/cli/proxy.d.ts +4 -0
  77. package/dist/cli/proxy.d.ts.map +1 -1
  78. package/dist/cli/proxy.js +26 -1
  79. package/dist/cli/proxy.js.map +1 -1
  80. package/dist/cli/sandbox.d.ts +101 -4
  81. package/dist/cli/sandbox.d.ts.map +1 -1
  82. package/dist/cli/sandbox.js +393 -44
  83. package/dist/cli/sandbox.js.map +1 -1
  84. package/dist/cli/self.d.ts +13 -0
  85. package/dist/cli/self.d.ts.map +1 -0
  86. package/dist/cli/self.js +94 -0
  87. package/dist/cli/self.js.map +1 -0
  88. package/dist/cli/systemd-services.d.ts +2 -8
  89. package/dist/cli/systemd-services.d.ts.map +1 -1
  90. package/dist/cli/systemd-services.js +5 -20
  91. package/dist/cli/systemd-services.js.map +1 -1
  92. package/dist/cli/task.js +1 -1
  93. package/dist/cli/task.js.map +1 -1
  94. package/dist/cli/wizard-config.d.ts.map +1 -1
  95. package/dist/cli/wizard-config.js +31 -2
  96. package/dist/cli/wizard-config.js.map +1 -1
  97. package/dist/config/settings-registry.d.ts +1 -1
  98. package/dist/config/settings-registry.d.ts.map +1 -1
  99. package/dist/config/settings-registry.js +108 -0
  100. package/dist/config/settings-registry.js.map +1 -1
  101. package/dist/coordination/capability-router.js +2 -2
  102. package/dist/coordination/capability-router.js.map +1 -1
  103. package/dist/coordination/database.d.ts +13 -0
  104. package/dist/coordination/database.d.ts.map +1 -1
  105. package/dist/coordination/database.js +63 -7
  106. package/dist/coordination/database.js.map +1 -1
  107. package/dist/coordination/eta-inject.d.ts +32 -0
  108. package/dist/coordination/eta-inject.d.ts.map +1 -0
  109. package/dist/coordination/eta-inject.js +64 -0
  110. package/dist/coordination/eta-inject.js.map +1 -0
  111. package/dist/coordination/reactor.d.ts.map +1 -1
  112. package/dist/coordination/reactor.js +14 -0
  113. package/dist/coordination/reactor.js.map +1 -1
  114. package/dist/coordination/service.d.ts +18 -8
  115. package/dist/coordination/service.d.ts.map +1 -1
  116. package/dist/coordination/service.js +38 -28
  117. package/dist/coordination/service.js.map +1 -1
  118. package/dist/dashboard/client-registry.d.ts +163 -0
  119. package/dist/dashboard/client-registry.d.ts.map +1 -0
  120. package/dist/dashboard/client-registry.js +549 -0
  121. package/dist/dashboard/client-registry.js.map +1 -0
  122. package/dist/dashboard/controls.d.ts.map +1 -1
  123. package/dist/dashboard/controls.js +33 -4
  124. package/dist/dashboard/controls.js.map +1 -1
  125. package/dist/dashboard/data-seeder.d.ts +10 -7
  126. package/dist/dashboard/data-seeder.d.ts.map +1 -1
  127. package/dist/dashboard/data-seeder.js +31 -75
  128. package/dist/dashboard/data-seeder.js.map +1 -1
  129. package/dist/dashboard/data-service.d.ts +9 -0
  130. package/dist/dashboard/data-service.d.ts.map +1 -1
  131. package/dist/dashboard/data-service.js +32 -3
  132. package/dist/dashboard/data-service.js.map +1 -1
  133. package/dist/dashboard/placement-routes.d.ts +119 -0
  134. package/dist/dashboard/placement-routes.d.ts.map +1 -0
  135. package/dist/dashboard/placement-routes.js +331 -0
  136. package/dist/dashboard/placement-routes.js.map +1 -0
  137. package/dist/dashboard/server.d.ts.map +1 -1
  138. package/dist/dashboard/server.js +408 -2
  139. package/dist/dashboard/server.js.map +1 -1
  140. package/dist/delivery/attention.d.ts +130 -0
  141. package/dist/delivery/attention.d.ts.map +1 -0
  142. package/dist/delivery/attention.js +341 -0
  143. package/dist/delivery/attention.js.map +1 -0
  144. package/dist/delivery/decompose.d.ts +18 -0
  145. package/dist/delivery/decompose.d.ts.map +1 -1
  146. package/dist/delivery/decompose.js +22 -1
  147. package/dist/delivery/decompose.js.map +1 -1
  148. package/dist/delivery/eta-estimate.d.ts +111 -0
  149. package/dist/delivery/eta-estimate.d.ts.map +1 -0
  150. package/dist/delivery/eta-estimate.js +171 -0
  151. package/dist/delivery/eta-estimate.js.map +1 -0
  152. package/dist/delivery/eta.d.ts +23 -0
  153. package/dist/delivery/eta.d.ts.map +1 -0
  154. package/dist/delivery/eta.js +59 -0
  155. package/dist/delivery/eta.js.map +1 -0
  156. package/dist/delivery/orchestrated-mission.d.ts +10 -0
  157. package/dist/delivery/orchestrated-mission.d.ts.map +1 -1
  158. package/dist/delivery/orchestrated-mission.js +15 -1
  159. package/dist/delivery/orchestrated-mission.js.map +1 -1
  160. package/dist/delivery/plan-check.d.ts +7 -1
  161. package/dist/delivery/plan-check.d.ts.map +1 -1
  162. package/dist/delivery/plan-check.js +23 -2
  163. package/dist/delivery/plan-check.js.map +1 -1
  164. package/dist/delivery/run-state.d.ts +1 -1
  165. package/dist/delivery/run-state.d.ts.map +1 -1
  166. package/dist/delivery/run-state.js +8 -1
  167. package/dist/delivery/run-state.js.map +1 -1
  168. package/dist/delivery/task-orchestrator.d.ts +8 -3
  169. package/dist/delivery/task-orchestrator.d.ts.map +1 -1
  170. package/dist/delivery/task-orchestrator.js +75 -43
  171. package/dist/delivery/task-orchestrator.js.map +1 -1
  172. package/dist/delivery/task-sync.d.ts +21 -0
  173. package/dist/delivery/task-sync.d.ts.map +1 -1
  174. package/dist/delivery/task-sync.js +44 -8
  175. package/dist/delivery/task-sync.js.map +1 -1
  176. package/dist/delivery/task-workspace.d.ts +3 -3
  177. package/dist/delivery/task-workspace.js +3 -3
  178. package/dist/generators/self-card.d.ts +65 -0
  179. package/dist/generators/self-card.d.ts.map +1 -0
  180. package/dist/generators/self-card.js +256 -0
  181. package/dist/generators/self-card.js.map +1 -0
  182. package/dist/inference/probe.js +1 -1
  183. package/dist/inference/probe.js.map +1 -1
  184. package/dist/memory/prepopulate.d.ts.map +1 -1
  185. package/dist/memory/prepopulate.js +2 -0
  186. package/dist/memory/prepopulate.js.map +1 -1
  187. package/dist/models/analytics.d.ts +32 -0
  188. package/dist/models/analytics.d.ts.map +1 -1
  189. package/dist/models/analytics.js +68 -5
  190. package/dist/models/analytics.js.map +1 -1
  191. package/dist/models/plan-readability.d.ts +55 -0
  192. package/dist/models/plan-readability.d.ts.map +1 -0
  193. package/dist/models/plan-readability.js +339 -0
  194. package/dist/models/plan-readability.js.map +1 -0
  195. package/dist/placement/admission.d.ts +59 -0
  196. package/dist/placement/admission.d.ts.map +1 -0
  197. package/dist/placement/admission.js +197 -0
  198. package/dist/placement/admission.js.map +1 -0
  199. package/dist/placement/auto.d.ts +44 -0
  200. package/dist/placement/auto.d.ts.map +1 -0
  201. package/dist/placement/auto.js +212 -0
  202. package/dist/placement/auto.js.map +1 -0
  203. package/dist/placement/enforce.d.ts +128 -0
  204. package/dist/placement/enforce.d.ts.map +1 -0
  205. package/dist/placement/enforce.js +655 -0
  206. package/dist/placement/enforce.js.map +1 -0
  207. package/dist/placement/idle.d.ts +50 -0
  208. package/dist/placement/idle.d.ts.map +1 -0
  209. package/dist/placement/idle.js +213 -0
  210. package/dist/placement/idle.js.map +1 -0
  211. package/dist/placement/ledger.d.ts +323 -0
  212. package/dist/placement/ledger.d.ts.map +1 -0
  213. package/dist/placement/ledger.js +263 -0
  214. package/dist/placement/ledger.js.map +1 -0
  215. package/dist/placement/preview.d.ts +51 -0
  216. package/dist/placement/preview.d.ts.map +1 -0
  217. package/dist/placement/preview.js +61 -0
  218. package/dist/placement/preview.js.map +1 -0
  219. package/dist/placement/probes.d.ts +47 -0
  220. package/dist/placement/probes.d.ts.map +1 -0
  221. package/dist/placement/probes.js +207 -0
  222. package/dist/placement/probes.js.map +1 -0
  223. package/dist/placement/proxy-env.d.ts +21 -0
  224. package/dist/placement/proxy-env.d.ts.map +1 -0
  225. package/dist/placement/proxy-env.js +42 -0
  226. package/dist/placement/proxy-env.js.map +1 -0
  227. package/dist/placement/registry.d.ts +1038 -0
  228. package/dist/placement/registry.d.ts.map +1 -0
  229. package/dist/placement/registry.js +274 -0
  230. package/dist/placement/registry.js.map +1 -0
  231. package/dist/policies/liveness.d.ts +6 -8
  232. package/dist/policies/liveness.d.ts.map +1 -1
  233. package/dist/policies/liveness.js +6 -25
  234. package/dist/policies/liveness.js.map +1 -1
  235. package/dist/policies/sandbox-anchor.d.ts +91 -0
  236. package/dist/policies/sandbox-anchor.d.ts.map +1 -0
  237. package/dist/policies/sandbox-anchor.js +187 -0
  238. package/dist/policies/sandbox-anchor.js.map +1 -0
  239. package/dist/policies/sandbox-grants.d.ts +131 -0
  240. package/dist/policies/sandbox-grants.d.ts.map +1 -0
  241. package/dist/policies/sandbox-grants.js +562 -0
  242. package/dist/policies/sandbox-grants.js.map +1 -0
  243. package/dist/state/manifest.d.ts +4 -2
  244. package/dist/state/manifest.d.ts.map +1 -1
  245. package/dist/state/manifest.js +32 -16
  246. package/dist/state/manifest.js.map +1 -1
  247. package/dist/utils/checkout-root.d.ts +2 -0
  248. package/dist/utils/checkout-root.d.ts.map +1 -0
  249. package/dist/utils/checkout-root.js +43 -0
  250. package/dist/utils/checkout-root.js.map +1 -0
  251. package/dist/utils/resolve-uap-bin.d.ts +5 -0
  252. package/dist/utils/resolve-uap-bin.d.ts.map +1 -0
  253. package/dist/utils/resolve-uap-bin.js +33 -0
  254. package/dist/utils/resolve-uap-bin.js.map +1 -0
  255. package/dist/utils/terminal-safe.d.ts +12 -0
  256. package/dist/utils/terminal-safe.d.ts.map +1 -0
  257. package/dist/utils/terminal-safe.js +53 -0
  258. package/dist/utils/terminal-safe.js.map +1 -0
  259. package/docs/ATTRIBUTION.md +1 -0
  260. package/docs/DASHBOARD_UPLIFT_SPEC.md +8 -8
  261. package/docs/INDEX.md +6 -5
  262. package/docs/architecture/OVERVIEW.md +15 -3
  263. package/docs/architecture/PROTOCOL.md +7 -1
  264. package/docs/architecture/adr/0006-operator-directed-model-placement.md +86 -0
  265. package/docs/architecture/adr/0007-auto-displacement-allowlist-as-standing-consent.md +79 -0
  266. package/docs/architecture/adr/0008-fleet-clients-link-out.md +92 -0
  267. package/docs/architecture/adr/0009-completion-triggered-dispatch-and-per-leaf-model-dials.md +71 -0
  268. package/docs/architecture/adr/0010-attention-queue-and-afk-auto-decider.md +159 -0
  269. package/docs/architecture/adr/0011-sandbox-grants-and-network-egress-boundary.md +219 -0
  270. package/docs/architecture/adr/0012-operator-legibility-surfaces.md +175 -0
  271. package/docs/getting-started/INSTALLATION.md +1 -1
  272. package/docs/guides/AUTOMATIC_FEATURES.md +8 -0
  273. package/docs/guides/LOCAL_MODELS.md +1 -1
  274. package/docs/guides/PROXY.md +2 -1
  275. package/docs/guides/SANDBOX.md +91 -4
  276. package/docs/integrations/MCP_ROUTER.md +1 -1
  277. package/docs/plans/model-performance-proof-options.md +176 -0
  278. package/docs/reference/API.md +1 -1
  279. package/docs/reference/CLI.md +169 -4
  280. package/docs/reference/COMPARISON.md +1 -1
  281. package/docs/reference/CONFIGURATION.md +12 -3
  282. package/docs/reference/CONFIGURATION_REFERENCE.md +269 -14
  283. package/docs/reference/DATABASE_SCHEMA.md +1 -1
  284. package/docs/reference/FEATURES.md +15 -3
  285. package/docs/reference/PATTERNS.md +1 -1
  286. package/docs/reference/PLATFORMS.md +14 -1
  287. package/docs/specs/operator-model-placement.md +1314 -0
  288. package/docs/specs/operator-model-placement.review.md +339 -0
  289. package/package.json +2 -2
  290. package/scripts/maintenance/publish-npm.sh +23 -11
  291. package/scripts/version-bump.sh +6 -51
  292. package/src/policies/enforcers/__pycache__/_common.cpython-311.pyc +0 -0
  293. package/src/policies/enforcers/__pycache__/expert_review_required.cpython-311.pyc +0 -0
  294. package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-311.pyc +0 -0
  295. package/src/policies/schemas/policies/mandatory-testing-deployment.md +2 -5
  296. package/templates/hooks/__pycache__/deliver_autoroute.cpython-311.pyc +0 -0
  297. package/templates/hooks/session-start.sh +44 -0
  298. package/tools/agents/UAP/cli.py +14 -3
  299. package/tools/agents/UAP/paths.py +50 -0
  300. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-311.pyc +0 -0
  301. package/tools/agents/scripts/anthropic_proxy.py +1386 -99
  302. package/tools/agents/scripts/toolcall_path_normalizer.py +46 -1
  303. package/tools/agents/tests/test_anthropic_proxy_streaming.py +29 -6
  304. package/tools/agents/tests/test_doubling_break.py +64 -5
  305. package/tools/agents/tests/test_error_loop_break.py +10 -4
  306. package/tools/agents/tests/test_error_loop_ignores_correctives.py +13 -2
  307. package/tools/agents/tests/test_lockstep_escalation.py +280 -9
  308. package/tools/agents/tests/test_path_containment.py +94 -0
  309. package/tools/agents/tests/test_proxy_unix_socket.py +162 -0
  310. package/tools/agents/tests/test_signature_quality.py +349 -0
  311. package/tools/agents/tests/test_uap_compliance.py +11 -1
  312. package/web/dash/core.js +1 -0
  313. package/web/dash/tab-clients.js +196 -0
  314. package/web/dash/tab-models.js +387 -8
  315. package/web/dash/tab-policies.js +87 -4
  316. package/web/dash/tabs.js +77 -73
  317. package/web/dashboard.html +6 -0
  318. package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
  319. package/src/policies/enforcers/__pycache__/expert_review_required.cpython-312.pyc +0 -0
  320. package/src/policies/enforcers/__pycache__/quality_metrics_gate.cpython-312.pyc +0 -0
  321. package/templates/hooks/__pycache__/deliver_autoroute.cpython-312.pyc +0 -0
  322. package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
  323. package/web/dash/tab-agents.js +0 -21
  324. package/web/dash/tab-deliver.js +0 -12
  325. package/web/dash/tab-memory.js +0 -12
  326. package/web/dash/tab-orchestration.js +0 -21
  327. package/web/dash/tab-overview.js +0 -21
  328. package/web/dash/tab-tasks.js +0 -21
package/README.md CHANGED
@@ -6,17 +6,25 @@
6
6
 
7
7
  [![npm](https://img.shields.io/npm/v/@miller-tech/uap?color=blue&label=npm)](https://www.npmjs.com/package/@miller-tech/uap)
8
8
  [![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org)
9
- [![Tests](https://img.shields.io/badge/tests-450%2B_suites-brightgreen)](#testing)
9
+ [![Tests](https://img.shields.io/badge/tests-500%2B_suites-brightgreen)](#testing)
10
10
  [![License](https://img.shields.io/badge/license-MIT-black)](LICENSE)
11
11
 
12
- `v2.16.6` · 367 TypeScript modules across 26 subsystems · 459 vitest suites (+ a ~1,200-test Python enforcer/proxy suite) · 9 agent harnesses
12
+ 447 TypeScript modules across 34 subsystems · 530 vitest suites (~6,250 tests, + a ~1,400-test Python enforcer/proxy suite) · 9 agent harnesses
13
13
 
14
- [Quickstart](#quickstart) · [Why UAP?](#why-uap) · [The delivery pipeline](docs/guides/DELIVERY_PIPELINE.md) · [`uap deliver`](#the-deliver-harness) · [Docs](docs/INDEX.md)
14
+ [Quickstart](#quickstart) · [Why UAP?](#why-uap) · [Origin & principle](#origin--principle) · [The delivery pipeline](docs/guides/DELIVERY_PIPELINE.md) · [`uap deliver`](#the-deliver-harness) · [Docs](docs/INDEX.md)
15
15
 
16
16
  </div>
17
17
 
18
18
  ---
19
19
 
20
+ ## Origin & principle
21
+
22
+ UAP is a **Miller-Tech** tool built for real delivery floors. The failures it targets are the ones that keep recurring in agentic development — "done" code that never ran, edits on `main`, forgotten decisions, prose architecture rules that blocked nothing, agents that stall on any question or silently decide for you. The fix that works, every time, is the same: **turn the software-engineering practice into an executable check the agent cannot route around. Enforce, don't suggest.**
23
+
24
+ That principle became UAP — a discipline layer installed *underneath* the agent harness, putting a verification station at every point where agentic development actually breaks. It is hardened under its own gates (worktree isolation, parallel review, evidence-bound shipping), which makes the tool the proof of its own thesis. Design decisions are recorded in the [ADR set](docs/architecture/OVERVIEW.md); inspirations and prior art are credited in [docs/ATTRIBUTION.md](docs/ATTRIBUTION.md).
25
+
26
+ ---
27
+
20
28
  ## Why UAP?
21
29
 
22
30
  Shipping software with an AI agent is a lot like running a small factory floor. Intent comes in one end; working, verified, merged code should come out the other. In between are stations — understand the job, set up a bench, build it, **check it actually works**, ship it — and a jam at any one of them quietly ruins everything downstream.
@@ -32,6 +40,9 @@ Coding agents are capable but undisciplined line workers. They forget yesterday'
32
40
  | Two agents clobber each other | Worktree isolation + live file coordination | Conflict-free parallel work |
33
41
  | "Guidelines" get ignored | Policy gates as executable hooks, not prose | Violations are **blocked**, not politely suggested |
34
42
  | Same mistake, every session | Memory promotion + pattern learning | The floor gets better every run |
43
+ | The agent stalls on any question — or silently decides for you | Attention queue + AFK auto-decider | Asks are recorded with a **safe default** and work continues; unattended adoption is logged, never silent |
44
+ | Fast tasks idle behind slow siblings | Completion-triggered dispatch | A finished task's slot refills instantly; dependents start the moment their last dependency settles |
45
+ | Plans the agent can't follow; it guesses its own tooling | Plan readability gate + self-knowledge card | Legible plans; the agent answers "how do I X" from its own version-pinned card |
35
46
 
36
47
  **→ Take the full station-by-station tour: [The UAP Delivery Pipeline](docs/guides/DELIVERY_PIPELINE.md).**
37
48
 
@@ -76,7 +87,7 @@ What happens under the hood:
76
87
 
77
88
  It works with frontier models *and* local models (llama.cpp / Qwen) served over the Anthropic Messages API. See **[docs/guides/DELIVER.md](docs/guides/DELIVER.md)**.
78
89
 
79
- Hardened for shared floors (v1.224): rollback is scoped to the run's own write-set (a shared-worktree rollback can't revert another agent's work), projects can declare extra gates in `delivery.gates[]`, the execution gate is polyglot (Python packages, native binaries), and `delivery.model`/`routing`/`criticality` in `.uap.json` steer model choice — with root-owned, expiring operator overrides for emergencies.
90
+ Hardened for shared floors: rollback is scoped to the run's own write-set (a shared-worktree rollback can't revert another agent's work), projects can declare extra gates in `delivery.gates[]`, the execution gate is polyglot (Python packages, native binaries), and `delivery.model`/`routing`/`criticality` in `.uap.json` steer model choice — with root-owned, expiring operator overrides for emergencies.
80
91
 
81
92
  ---
82
93
 
@@ -89,11 +100,11 @@ Hardened for shared floors (v1.224): rollback is scoped to the run's own write-s
89
100
  | **Isolation** | Editing `main`, clobbering files | [Worktrees](docs/guides/WORKTREE_WORKFLOW.md), live file coordination, delivery gate |
90
101
  | **Build** | Plausible-but-wrong code, stubs, empty output | [`uap deliver`](docs/guides/DELIVER.md), serving-layer recipes, [local-model guardrails](docs/guides/LOCAL_MODELS.md) |
91
102
  | **QC / verify** | "Done" on code that never ran | Completion gates, `uap verify`, acceptance judge, generator≠evaluator |
92
- | **Coordination** | Parallel agents colliding/deadlocking | [Coordination](docs/guides/COORDINATION.md), model-slot concurrency, [deploy batching](docs/guides/DEPLOY_BATCHING.md) |
103
+ | **Coordination** | Parallel agents colliding/deadlocking | [Coordination](docs/guides/COORDINATION.md), model-slot concurrency, [deploy batching](docs/guides/DEPLOY_BATCHING.md), attention queue (asks instead of stalls) |
93
104
  | **Shipping** | Regressions, red CI, skipped version bumps | Worktree→PR flow, version gates, CI feedback watcher |
94
105
  | **Feedback** | The same mistake every session | Memory promotion, pattern learning, session analysis |
95
106
 
96
- Running the whole length of the floor: **policy gates** (32 executable enforcers that *block* non-compliant tool calls — worktree, test, schema-diff, expert-review, delivery-enforcement, quality-metrics, design-token, visual-verification…), the **quality-metrics gate** (deterministic complexity/coverage/mutation budgets with a ratchet baseline, so standards can only tighten), and the **MCP Router** (keeps the context window lean). Full catalog: **[docs/reference/FEATURES.md](docs/reference/FEATURES.md)**.
107
+ Running the whole length of the floor: **policy gates** (34 executable enforcers that *block* non-compliant tool calls — worktree, test, schema-diff, expert-review, delivery-enforcement, quality-metrics, design-token, visual-verification…), the **quality-metrics gate** (deterministic complexity/coverage/mutation budgets with a ratchet baseline, so standards can only tighten), and the **MCP Router** (keeps the context window lean). Full catalog: **[docs/reference/FEATURES.md](docs/reference/FEATURES.md)**.
97
108
 
98
109
  ---
99
110
 
@@ -118,10 +129,10 @@ UAP installs hooks into your agent harness, then mediates every tool call throug
118
129
  └──┬─────────┬──────────┬──────────┬──────────┬───────────────┘
119
130
  ▼ ▼ ▼ ▼ ▼
120
131
  Memory Policy MCP Router Delivery Coordination
121
- 4 tiers 32 gates compression + verify + deploy batch
132
+ 4 tiers 34 gates compression + verify + deploy batch
122
133
  ```
123
134
 
124
- - **60+ CLI commands** across 26 source subsystems (367 TypeScript modules).
135
+ - **58 top-level CLI commands** (~210 registrations including subcommands) across 34 source subsystems (434 TypeScript modules).
125
136
  - Deep dive: **[docs/architecture/OVERVIEW.md](docs/architecture/OVERVIEW.md)** · protocol spec: **[docs/architecture/PROTOCOL.md](docs/architecture/PROTOCOL.md)**.
126
137
 
127
138
  ---
@@ -177,6 +188,7 @@ Install into all detected harnesses with `uap hooks install`; audit coverage wit
177
188
  | | |
178
189
  |---|---|
179
190
  | **[The Delivery Pipeline](docs/guides/DELIVERY_PIPELINE.md)** | The station-by-station tour — start here for the big picture |
191
+ | **[ATTRIBUTION](docs/ATTRIBUTION.md)** | Prior art, inspirations, and credits |
180
192
  | **[Getting Started](docs/getting-started/)** | Installation, quickstart, configuration |
181
193
  | **[Guides](docs/guides/)** | deliver, memory, MCP router, worktrees, policies, multi-model, local models |
182
194
  | **[Architecture](docs/architecture/)** | System overview + the UAP protocol |
@@ -193,8 +205,8 @@ Start at the **[documentation index](docs/INDEX.md)**.
193
205
  ```bash
194
206
  npm install
195
207
  npm run build # TypeScript compile
196
- npm test # vitest — 459 suites (~5,000 tests)
197
- npm run test:enforcers # Python policy-enforcer suite (~1,200 tests)
208
+ npm test # vitest — 518 suites (~6,050 tests)
209
+ npm run test:enforcers # Python policy-enforcer suite (~1,400 tests)
198
210
  npm run bench # benchmark suite
199
211
  ```
200
212
 
@@ -0,0 +1,46 @@
1
+ {
2
+ "_profile": "qwen38-coder390",
3
+ "_description": "Qwen3.8-27B Coder390 EfficientThink (LynnStyle Q4 + Q8 MTP) — community post-train of the official Qwen3.8-27B (dense qwen35 arch, Apache-2.0; nerkyor/Qwen3.8-27B-Coder390-EfficientThink-Opus5.5-GPT6Astra-Grok4.7-DSV4Pro-K3-SFT-RLOO-MTP-DFlash2). Served by uap-coder390-server (llama.cpp continuity script, native draft-mtp from the checkpoint's blk.64 head, Q8 mmproj for vision). The tune's headline: EfficientThink — reasoning P50 down 44-53% and 94K-cap truncations down 13→3 on LCB vs the stock 27B, with LCB 89-90. No DFlash2 draft ships for GGUF (mutually exclusive upstream).",
4
+ "model": "qwen3.8-27b-coder390",
5
+ "max_tokens": 57344,
6
+ "_max_tokens_comment": "Same 50%-of-window ratio as qwen38. The tune is TRAINED to stop early (that is its whole point), but reasoning still spends completion budget in reasoning_content; keep the cap generous so a long-necessary derivation is never truncated into an empty answer — the failure this tune exists to fix must not be reintroduced by the server config. The proxy's PROXY_TOOL_TURN_MAX_TOKENS clamp still applies to tool turns.",
7
+ "temperature": 0.3,
8
+ "top_p": 0.9,
9
+ "top_k": 20,
10
+ "min_p": 0.05,
11
+ "repetition_penalty": 1.0,
12
+ "_sampling_comment": "UAP's tool-call-tuned values, carried from qwen38 (never vendor chat defaults). EfficientThink changes the model's reasoning LENGTH, not its sampling; these stay as-is until a `uap tune` pass on real agent traffic says otherwise.",
13
+ "stop_sequences": ["<|im_end|>"],
14
+ "timeout_ms": 300000,
15
+ "context_window": 114688,
16
+ "_context_window_comment": "LLAMA_CTX_SIZE=131072 is the single-rail TOTAL (one 24 GiB card holding 18.5 GiB weights + 0.6 mmproj + KV); the per-session cap sits 87.5% below the pool exactly like the strata precedent, leaving the engine its own scratch room. If the measure pass shows the q4_0 KV pool smaller than 131k cells, lower this to 0.875x of the measured pool.",
17
+ "optimize_for_tool_calls": true,
18
+ "mode_switch_buffer_tokens": 500,
19
+ "enable_thinking": true,
20
+ "_thinking_comment": "Top-level; the proxy probes the backend once and adapts (PROXY_CHAT_TEMPLATE_KWARGS=auto). The GGUF carries the chat template; the continuity script's qwen-sharp.jinja override is NOT used for this profile's unit — set LLAMA_CHAT_TEMPLATE_FILE=embedded in coder390-server.env if the qwen-sharp template proves incompatible (the tune was trained with its own template).",
21
+ "dynamic_temperature": {
22
+ "enabled": true,
23
+ "decay": 0.5,
24
+ "floor": 0.2,
25
+ "_comment": "On retry, temp = max(floor, base_temp * decay^attempt)."
26
+ },
27
+ "tool_call_batching": {
28
+ "enabled": true,
29
+ "system_prompt_suffix": "When multiple tools are needed, call ALL of them in a single response. Do not call one tool and wait - emit all tool calls together.",
30
+ "_comment": "Reduces round-trips by encouraging multi-tool emission in one turn."
31
+ },
32
+ "concurrency": {
33
+ "max_parallel_requests": 1,
34
+ "_comment": "One rail, one 131k pool: a second hot session would overcommit the KV pool. Matches the strata single-rail posture (slots, proxy concurrency and admission move together).",
35
+ "kv_capacity_shared": true
36
+ },
37
+ "measured": {
38
+ "date": null,
39
+ "gpu": "NVIDIA GeForce RTX 3090, 24576 MiB",
40
+ "_gpu_comment": "Footprint not yet measured — run `uap models measure qwen3.8-27b-coder390/coder390-q4-lynn-mtp` after the first boot and record it here and in the registry (the admit gate refuses unmeasured models, fail-closed)."
41
+ },
42
+ "routing": {
43
+ "endpoint": "http://127.0.0.1:4000/v1",
44
+ "_comment": "Route through the anthropic-proxy, never the llama-server port directly. Clients select this profile with the header 'x-uap-model-profile: qwen38-coder390' (or a uap_model_profile body param); model-id routing uses the registry's advertises aliases."
45
+ }
46
+ }
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "_profile": "qwen38",
3
3
  "_description": "Qwen3.8 Flash-Next — local Strata serve-layer deployment for agentic tool-calling workloads. Successor to qwen36 and to the 2026-09-20 GSQ-RCO llama.cpp deployment; the default local executor in UAP routing. Routes through the anthropic-proxy for the tool/finalize guardrails, NOT the inference server directly.",
4
- "_engine": "strata serve layer 0.1.40.1 (python server 0.1.40.1 + engine binary 0.1.40, compiled locally with a user-space CUDA 13.4 toolkit after the Debian 12.4 headers proved too old for 0.1.40) on :8080, launched by the systemd user unit uap-strata-server.service with /home/cogtek/dev/strata/strata-iq3_s.json. Serves llama.cpp-shaped /props, /slots and /v1, plus a JSON /metrics (engine/live/requests — NOT Prometheus text; `uap inference health` auto-detects it). Weights: strata-data pack iq3_s (Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S since the 2026-10-07 swap per the IQ3_S speed≈IQ3_XXS reports; predecessors Swift 1.5 IQ3_XXS 2026-10-06, Qwen3.8-Flash-Next-GSQ-RCO-IQ3_XXS, native experts + PLE shard) with MTP speculative drafts (spec 8, spec-min-p 0.8 since the 2026-10-06 tuning; previously spec 4, spec-min-p 0.5, mtp_max 4) and an auto-sized expert cache. Model id advertised at /v1/models: qwen3.8-flash-next-iq3_s; the server ignores requested model ids entirely, which is why stale client pins (e.g. a resumed session still naming qwen36 ids) keep working.",
4
+ "_engine": "strata serve layer 0.1.44.1 (build_info 'Strata 0.1.44.1', compiled locally with the user-space CUDA 13.4 toolkit) on :8080, launched by the systemd user unit uap-strata-server.service with /home/cogtek/dev/strata/strata-swift-iq3_s.json since the 2026-10-17 Swift 1.5 A/B trial (revert: repoint the unit's --config at strata-iq3_s.json, daemon-reload, restart; the unit file carries the dated note). Serves llama.cpp-shaped /props, /slots and /v1, plus a JSON /metrics (engine/live/requests — NOT Prometheus text; `uap inference health` auto-detects it). Weights: strata-data pack swift-iq3_s (Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S, the UkisAI reasoning-efficient post-train, since the 2026-10-17 trial; predecessor base Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S since the 2026-10-07 swap per the IQ3_S speed≈IQ3_XXS reports; earlier predecessors Swift 1.5 IQ3_XXS 2026-10-06, Qwen3.8-Flash-Next-GSQ-RCO-IQ3_XXS, native experts + PLE shard) with MTP speculative drafts (spec 8 since the 2026-10-06 tuning; spec-min-p 0.70 after the 0.1.44.1-era calibration, previously 0.8, before that 0.5; previously spec 4, mtp_max 4) and an auto-sized expert cache. Model id advertised at /v1/models: swift-1.5-iq3_s; the server ignores requested model ids entirely, which is why stale client pins (e.g. a resumed session still naming qwen36 or qwen3.8-flash-next ids) keep working.",
5
5
  "_engine_history": "SUPERSEDED 2026-10-04: this profile described buun-llama-cpp behind uap-gsq-rco-server.service (2 rails sharing a 229376-cell VBR pool, DFlash2 draft). That unit is now INACTIVE — the box serves the Strata layer on :8080 instead (tuned 2026-10-03: +15% over the llama.cpp fork on agent workloads). The old description was itself a 2026-09-20 correction of a ninfer-serve description. Verify against /metrics before trusting engine claims here; the dead unit's ExecStart still reports -c 229376 to systemctl, and on 2026-10-04 `uap inference health` printed that stale pool size for the live (131072) backend.",
6
- "model": "qwen3.8-flash-next-iq3_s",
6
+ "model": "swift-1.5-iq3_s",
7
+ "_model_comment": "The alias the live backend advertises at /v1/models; the rails suite drift-checks this field against the serving process (test/model-profiles-qwen38-rails.test.ts). 2026-10-17: the Swift 1.5 IQ3_S A/B trial swapped the unit from the base pack, which advertised qwen3.8-flash-next-iq3_s. The server ignores requested model ids, so clients pinning the old id are unaffected; on revert, restore this field alongside the unit's --config.",
7
8
  "max_tokens": 57344,
8
9
  "_max_tokens_comment": "Deliberately generous: 50% of the 114688 window, the same ratio the previous 65536/131072 pairing used. The engine returns chain-of-thought in a SEPARATE reasoning_content field, so reasoning spends completion budget without ever appearing in content. A tight cap therefore does not produce a short answer, it produces an EMPTY one with finish_reason=length — measured previously as ~90% first-turn decode failure that read as bad output format and was really budget truncation. Do not lower this without re-measuring decode compliance. (The proxy additionally clamps tool turns to PROXY_TOOL_TURN_MAX_TOKENS=32768 regardless.)",
9
10
  "temperature": 0.3,
@@ -0,0 +1,110 @@
1
+ {
2
+ "version": 1,
3
+ "_comment": "Repo defaults for the model placement registry. Shape only: unit/service names, engines, profiles, affinity, and the config inventory. Measured footprints (resident_gpu_mib, host_rss_mib, device totals) are machine state and live in ~/.uap/model-registry.json, deep-merged over this file. A config without a measurement is 'unmeasured' and fails closed: it may be served if already resident, but it can never be loaded or evicted. See docs/specs/operator-model-placement.md §4.1.",
4
+ "devices": {
5
+ "gpu0": {
6
+ "kind": "gpu"
7
+ },
8
+ "cpu0": {
9
+ "kind": "cpu"
10
+ }
11
+ },
12
+ "models": {
13
+ "qwen3.6-27b": {
14
+ "display": "Qwen3.6 27B",
15
+ "engine": "dflash",
16
+ "task_affinity": ["general", "ugc"],
17
+ "affinity": { "device": ["gpu0"] },
18
+ "endpoint": "http://127.0.0.1:8080",
19
+ "unit": "uap-dflash-server",
20
+ "advertises": [
21
+ "qwen3.6-27b",
22
+ "Qwen3.6-27B",
23
+ "luce-dflash",
24
+ "claude-haiku-4-5-20251001",
25
+ "claude-sonnet-4-6",
26
+ "claude-sonnet-5-20250514",
27
+ "claude-fable-5"
28
+ ],
29
+ "configs": {
30
+ "dflash-q3_k_m": {
31
+ "status": "unmeasured",
32
+ "engine": "dflash",
33
+ "unit": "uap-dflash-server",
34
+ "note": "lucebox-hub DFlash speculative-decoding server (Qwen3.6-27B Q3_K_M target + draft head); machine profile: ~/.config/uap/dflash-server.env. The ugc-factory brain (pay2u tools/ugc-factory) requests 'qwen3.6-27b' through the UAP proxy, so placement auto-loads this config on demand — run `uap models measure` to record this machine's footprint before it can load (fail-closed). The Claude contract ids are advertised here too: the proxy serves them locally (ANTHROPIC_PASSTHROUGH_MODELS=__local_only__), and without a registry mapping the placement gate would 409-park every SDK client that checks /v1/models and then asks for one."
35
+ }
36
+ }
37
+ },
38
+ "qwen3.8-flash-next": {
39
+ "display": "Qwen3.8 Flash Next",
40
+ "engine": "strata",
41
+ "unit": "uap-strata-server",
42
+ "service": "strata-server",
43
+ "launch": "/home/cogtek/dev/strata/run-iq3_s.sh",
44
+ "endpoint": "http://127.0.0.1:8080",
45
+ "task_affinity": ["code", "general"],
46
+ "affinity": { "device": ["gpu0"] },
47
+ "configs": {
48
+ "strata-iq3_s": {
49
+ "status": "unmeasured",
50
+ "note": "active backend on this host; run `uap models measure` to record its footprint"
51
+ },
52
+ "strata-swift-iq3_s": {
53
+ "status": "unmeasured",
54
+ "engine": "strata",
55
+ "unit": "uap-strata-server",
56
+ "note": "Swift 1.5 (UkisAI reasoning-efficient Flash-Next post-train) GSQ-RCO IQ3_S on the strata engine; A/B trial vs strata-iq3_s since 2026-10-17 with identical tuning (spec 8/0.70, vram-reserve 3072, int8 KV resident 32768, 131k). Weights: ukisai Swift-1.5-Qwen3.8-Flash-Next-GSQ-RCO-IQ3_S, sha256-verified, PLE table in shard 1 (setup-detected); pack strata-data/packs/swift-iq3_s; config strata-swift-iq3_s.json behind uap-strata-server.service (revert: point the unit --config back at strata-iq3_s.json, daemon-reload, restart). Run `uap models measure` to record this machine's footprint before it can load (fail-closed). Trial evidence: /home/cogtek/dev/strata/bench/results/2026-10-17-swift-iq3s-trial/."
57
+ }
58
+ },
59
+ "advertises": ["qwen3.8-flash-next-iq3_s", "swift-1.5-iq3_s", "gpt-5.1-codex"]
60
+ },
61
+ "qwen3.8-27b": {
62
+ "display": "Qwen3.8 27B",
63
+ "engine": "llama.cpp",
64
+ "task_affinity": ["code", "general"],
65
+ "affinity": { "device": ["gpu0"] },
66
+ "endpoint": "http://127.0.0.1:8080",
67
+ "advertises": ["Qwen3.8-27B"],
68
+ "configs": {
69
+ "llama-mtp": {
70
+ "status": "unmeasured",
71
+ "engine": "llama.cpp",
72
+ "unit": "uap-llama-server",
73
+ "profile": "config/llama-profiles/qwen38-27b-mtp.env"
74
+ },
75
+ "exl3-4bit": {
76
+ "status": "unmeasured",
77
+ "engine": "exl3",
78
+ "unit": "uap-exl3-server",
79
+ "profile": "config/exl3-profiles/qwen38-27b-exl3.env"
80
+ },
81
+ "flashnext": {
82
+ "status": "unmeasured",
83
+ "engine": "llama.cpp",
84
+ "unit": "uap-flashnext-server"
85
+ },
86
+ "signal": {
87
+ "status": "unmeasured",
88
+ "engine": "llama.cpp",
89
+ "unit": "uap-signal-server"
90
+ },
91
+ "gsq-rco": {
92
+ "status": "unmeasured",
93
+ "engine": "llama.cpp",
94
+ "unit": "uap-gsq-rco-server",
95
+ "service": "gsq-rco-server"
96
+ },
97
+ "ampere": {
98
+ "status": "unmeasured",
99
+ "engine": "llama.cpp",
100
+ "unit": "uap-ampere-server"
101
+ },
102
+ "swift": {
103
+ "status": "unmeasured",
104
+ "engine": "llama.cpp",
105
+ "unit": "uap-swift-server"
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }