[{"data":1,"prerenderedAt":36},["ShallowReactive",2],{"note-the-grouping-planner-ca":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":35},"the-grouping-planner",50,"\"El planificador d'agrupació: els mínims workers que permeten les empremtes i l'historial\"","Donats els plugins d'un canal en l'ordre del senyal, el planificador posa en un sol worker els plugins consecutius que poden compartir procés i deixa sols els altres, segons les seves empremtes, el seu cost i el que han fet en aquesta màquina; queda desactivat per defecte fins que el banc de proves demostri que guanya.","El disseny de l'agrupació de plugin-hostd, octubre del 2026. L'agrupació està desactivada per defecte fins que el banc de proves publiqui una millora en una Raspberry Pi 5 i en un ordinador de taula.","host",[11,14,17,20,23,26,29,32],{"id":12,"title":13},"el-problema","El problema",{"id":15,"title":16},"el-planificador","El planificador",{"id":18,"title":19},"els-verbs","Els verbs",{"id":21,"title":22},"l-historial","L'historial",{"id":24,"title":25},"com-ho-fa-servir-la-qualificacio","Com ho fa servir la qualificació",{"id":27,"title":28},"a-zynthian","A Zynthian",{"id":30,"title":31},"el-banc-de-proves-que-decideix-el-valor-per-defecte","El banc de proves que decideix el valor per defecte",{"id":33,"title":34},"modes-de-fallada","Modes de fallada","\u003Ch2 id=\"el-problema\">El problema\u003C\u002Fh2>\n\u003Cp>plugin-hostd pot fer córrer molts plugins en un sol procés i això estalvia CPU i memòria. Però una cadena és tot o res:\nun controlador declara els membres d'un canal com una sola cadena i un sol membre que no pot compartir procés (sense\nveredicte de qualificació o amb el veredicte \u003Ccode>isolated\u003C\u002Fcode>) fa que tot el canal corri amb un procés per plugin. Tampoc no\ns'aprèn res del que un plugin ha fet a la màquina.\u003C\u002Fp>\n\u003Cp>El planificador respon una pregunta diferent de la d'una cadena. Una cadena és l'afirmació del controlador: aquests corren\njunts, en aquest ordre. Un pla és la resposta del dimoni a: donats aquests, en aquest ordre, quins poden córrer junts. Acaba\nen les crides \u003Ccode>chain\u003C\u002Fcode> i \u003Ccode>add\u003C\u002Fcode> que el dimoni ja té; no afegeix cap manera nova de fer córrer un plugin.\u003C\u002Fp>\n\u003Ch2 id=\"el-planificador\">El planificador\u003C\u002Fh2>\n\u003Cp>Una funció pura de plugin-hostd: les mateixes entrades donen el mateix pla, byte a byte i mentre decideix no llegeix cap\nrellotge ni cap fitxer.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Entrades\u003C\u002Fstrong>: els membres en l'ordre del senyal (instància, uri, format); per a cadascun, la seva empremta (fitxers,\ndisposició, veredicte o cap), el seu cost (\u003Ccode>coreFractionP95\u003C\u002Fcode> a la freqüència i el quàntum del dimoni) i la latència del\nregistre de qualificació si n'hi ha i el seu historial en aquesta classe d'amfitrió; i la classe d'amfitrió i els\nparàmetres (\u003Ccode>group_max\u003C\u002Fcode>, \u003Ccode>group_cost_max\u003C\u002Fcode>, \u003Ccode>grouping\u003C\u002Fcode>, \u003Ccode>require_pins\u003C\u002Fcode>, \u003Ccode>pin_mode\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Sortida\u003C\u002Fstrong>: una llista de segments en l'ordre del senyal. Un segment és una tirada de membres consecutius que comparteixen\nun worker o un membre sol. Un segment de dos o més es declara com una cadena; un segment d'un sol membre corre en un worker\npropi. Cada membre que queda sol rep un codi de motiu.\u003C\u002Fp>\n\u003Cp>Els segments són tirades de membres consecutius perquè una cadena és una sola crida en l'ordre declarat i un membre que\nqueda fora al mig ha de conservar el seu lloc en el camí del senyal. Així, \u003Ccode>A B C D E\u003C\u002Fcode> amb \u003Ccode>C\u003C\u002Fcode> no apte esdevé\n\u003Ccode>[A B] [C] [D E]\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Regles, en aquest ordre; la primera que coincideix amb un membre en decideix.\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>motiu\u003C\u002Fth>\n\u003Cth>quan\u003C\u002Fth>\n\u003Cth>el membre\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>veredicte de l'empremta \u003Ccode>refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no s'afegeix (-516)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>no-pin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>sense empremta, \u003Ccode>pin_mode strict\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no s'afegeix (-508)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>no-verdict\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>una empremta sense veredicte (una empremta apresa)\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>verdict-isolated\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>veredicte \u003Ccode>isolated\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format-world\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el seu format només fa empremtes en un món propi i no es pot construir el món unió de la cadena\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>history-crashed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>l'historial el marca com a fallat\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>history-xruns\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>l'historial el marca com a causant de xruns quan està agrupat\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cost-over\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el seu cost tot sol passa de \u003Ccode>group_cost_max\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>corre sol\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format-mixed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el seu programa no és el del segment obert i tots dos no fan córrer cadenes en un sol client\u003C\u002Ftd>\n\u003Ctd>comença un segment nou\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>group-full\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el segment obert ja té \u003Ccode>group_max\u003C\u002Fcode> membres\u003C\u002Ftd>\n\u003Ctd>comença un segment nou\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>group-cost\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el seu cost fa passar el segment obert de \u003Ccode>group_cost_max\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>comença un segment nou\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Un membre amb el qual no coincideix cap regla s'afegeix al segment obert. Un plugin sense historial es jutja només per la\nseva empremta i el seu cost: no tenir historial és neutral, si no, un plugin no se'n podria guanyar mai cap. \u003Ccode>group_cost_max\u003C\u002Fcode>\nés una fracció d'un nucli; un segment és una sola crida, de manera que els costos dels membres se sumen. Un membre de cost\ndesconegut compta com la mediana dels costos coneguts del segment (zero si no se'n coneix cap) i els motius diuen\n\u003Ccode>cost-assumed\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Un membre que queda sol només perquè era al costat d'un de no apte pot compartir un grup de workers amb membres així\nd'altres cadenes. Un grup estalvia memòria resident, no despertars: cada membre continua sent un client JACK. Dues cadenes\nno comparteixen mai un worker de cadena.\u003C\u002Fp>\n\u003Ch2 id=\"els-verbs\">Els verbs\u003C\u002Fh2>\n\u003Cp>El pla es fa al dimoni, perquè el motor de Zynthian (un controlador en Python) i la consola d'OpenMixer arribin a la mateixa\nresposta sense haver de portar les regles.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>plan &lt;chain&gt; &lt;instance&gt; ...\u003C\u002Fcode> aplica el pla: els segments esdevenen cadenes i els membres sols corren sols. La resposta\ndona els segments com \u003Ccode>i,i,i;i;i,i\u003C\u002Fcode>. Una cadena que es torna a planificar conserva els workers en marxa dels segments que\nno han canviat.\u003C\u002Fli>\n\u003Cli>\u003Ccode>plan_get &lt;chain&gt;\u003C\u002Fcode> llegeix l'últim pla i el motiu de cada membre que ha quedat sol; un esdeveniment \u003Ccode>plan_reason\u003C\u002Fcode> porta\nel mateix quan un pla canvia.\u003C\u002Fli>\n\u003Cli>\u003Ccode>plan_clear &lt;chain&gt;\u003C\u002Fcode> dona a cada membre un worker propi i oblida el pla.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>El paràmetre \u003Ccode>placement\u003C\u002Fcode> fixa el worker de cada segment al nucli d'àudio menys carregat; \u003Ccode>plan\u003C\u002Fcode> i \u003Ccode>plan_get\u003C\u002Fcode> diuen el\nnucli de cada membre.\u003C\u002Fp>\n\u003Cp>\u003Ccode>grouping\u003C\u002Fcode> és un paràmetre, \u003Ccode>off\u003C\u002Fcode> o \u003Ccode>on\u003C\u002Fcode>. Amb \u003Ccode>off\u003C\u002Fcode>, \u003Ccode>plan\u003C\u002Fcode> respon el pla sense aplicar-lo, amb el motiu \u003Ccode>grouping-off\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"l-historial\">L'historial\u003C\u002Fh2>\n\u003Cp>El que ha fet cada plugin en aquesta màquina, guardat per plugin, per binari i per classe d'amfitrió: la clau és l'uri, el\nSHA-256 del primer fitxer amb empremta i la classe d'amfitrió (arquitectura, franja de nuclis, franja de rellotge). Un\nplugin canviat comença un registre nou.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>clau\u003C\u002Fth>\n\u003Cth>significat\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>first\u003C\u002Fcode>, \u003Ccode>last\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>la primera i l'última finestra, segons UTC\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>windows_solo\u003C\u002Fcode>, \u003Ccode>windows_grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>finestres en un worker propi o en un worker de dos o més\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cpu_p95_solo\u003C\u002Fcode>, \u003Ccode>cpu_max_solo\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>percentatge d'un nucli en una finestra, només finestres en solitari\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pss_mb_solo\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>la memòria proporcional del worker, MiB, la finestra en solitari més gran\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrun_windows_solo\u003C\u002Fcode>, \u003Ccode>xrun_windows_grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>finestres en què JACK ha comptat almenys un xrun\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>crashes_solo\u003C\u002Fcode>, \u003Ccode>crashes_grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>morts de worker atribuïdes al plugin\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>restarts_grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>morts de worker mentre n'era membre i no n'era el culpable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quarantines\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>vegades que ha quedat en quarantena\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>last_crash\u003C\u002Fcode>, \u003Ccode>last_crash_grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>segons UTC\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>La CPU per plugin només es guarda de les finestres en solitari: el temps del worker d'un grup no es pot repartir\nhonestament entre els seus membres. Una finestra dura 60 segons; una finestra en què el plugin ha estat en marxa menys de\nla meitat no compta.\u003C\u002Fp>\n\u003Cp>El fitxer és \u003Ccode>$XDG_STATE_HOME\u002Fplugin-hostd\u002Fhistory\u003C\u002Fcode> (si no, \u003Ccode>~\u002F.local\u002Fstate\u002Fplugin-hostd\u002Fhistory\u003C\u002Fcode>), amb permisos 0600,\nescrit en un fitxer temporal i reanomenat. Només l'escriu el dimoni, des del seu tic de repòs i quan el supervisor atribueix\nuna mort. El planificador en llegeix un resum: \u003Ccode>crashed\u003C\u002Fcode> quan hi ha una fallada en els últims 30 dies, \u003Ccode>raises-xruns\u003C\u002Fcode> quan,\ndesprés d'almenys 30 finestres agrupat, la proporció de finestres agrupades amb xruns supera en 0,05 la proporció en\nsolitari.\u003C\u002Fp>\n\u003Cp>L'historial és local. Conté URI, resums i comptadors: ni àudio, ni camins, ni noms d'usuari, de sessió o de preset. El\ndimoni no l'envia enlloc i \u003Ccode>history_clear\u003C\u002Fcode> l'esborra.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Els xruns.\u003C\u002Fstrong> JACK comunica un xrun a un client, no a un plugin i el dimoni no té cap client JACK. El worker sí que en\nté, de manera que comunica \u003Ccode>xruns &lt;count&gt;\u003C\u002Fcode> pel seu port de retorn i el dimoni compta els xruns d'una finestra a tots els\nmembres d'aquell worker. Una finestra amb xruns d'un grup és una sospita sobre cada membre, no una prova contra un de sol:\nper això el planificador compara la proporció agrupada d'un plugin amb la seva pròpia proporció en solitari en lloc de\nllegir-ne un recompte absolut.\u003C\u002Fp>\n\u003Ch2 id=\"com-ho-fa-servir-la-qualificacio\">Com ho fa servir la qualificació\u003C\u002Fh2>\n\u003Cp>\u003Ccode>plugin-qualify adjust --history &lt;file&gt;\u003C\u002Fcode> escriu un segon veredicte al costat del mesurat, per a la classe d'amfitrió de\nl'historial, amb el seu motiu. El veredicte mesurat no canvia mai.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>canvi\u003C\u002Fth>\n\u003Cth>quan\u003C\u002Fth>\n\u003Cth>motiu\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>d'\u003Ccode>in-process\u003C\u002Fcode> a \u003Ccode>isolated\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>ha fallat o causa xruns agrupat, en aquesta classe\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>history.crashed\u003C\u002Fcode>, \u003Ccode>history.xruns-grouped\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>d'\u003Ccode>isolated\u003C\u002Fcode> a \u003Ccode>refused\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>tres o més fallades en solitari en 30 dies\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>history.crashed-alone\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>d'\u003Ccode>isolated\u003C\u002Fcode> a \u003Ccode>in-process\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>el veredicte el decidia només el cost, sis hores en solitari sense cap fallada ni reinici i el cost dins del pressupost del perfil\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>history.steady\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Una promoció no aixeca mai un veredicte decidit per la seguretat en temps real, per una funció que falta, per una fallada a\nla sonda o per un \u003Ccode>unknown\u003C\u002Fcode>: són mesures del plugin, no d'aquesta màquina. Un veredicte \u003Ccode>refused\u003C\u002Fcode> no es promou mai.\nL'historial només pot fer el planificador més prudent que l'empremta, mai menys.\u003C\u002Fp>\n\u003Ch2 id=\"a-zynthian\">A Zynthian\u003C\u002Fh2>\n\u003Cp>El motor de Zynthian envia \u003Ccode>plan\u003C\u002Fcode> amb els membres d'un canal en lloc de \u003Ccode>chain\u003C\u002Fcode> quan el dimoni ho ofereix. Un sol plugin que\nno pot compartir ja no desagrupa el canal, el motor mostra el motiu d'un plugin que ha quedat sol al costat del seu\nveredicte al menú de plugins i un dimoni reiniciat fa el mateix pla a partir de les mateixes entrades.\u003C\u002Fp>\n\u003Ch2 id=\"el-banc-de-proves-que-decideix-el-valor-per-defecte\">El banc de proves que decideix el valor per defecte\u003C\u002Fh2>\n\u003Cp>Els escenaris de cadenes contra processos del banc de proves \u003Ccode>omx-bench\u002F1\u003C\u002Fcode>, en una Raspberry Pi 5 i en un ordinador de\ntaula, en quatre modes amb els mateixos plugins: \u003Ccode>individual\u003C\u002Fcode> (un procés per plugin), \u003Ccode>chain\u003C\u002Fcode> (tot el canal com una sola\ncadena), \u003Ccode>plan\u003C\u002Fcode> (a través del planificador, amb almenys un plugin per canal que no pot compartir) i \u003Ccode>pool\u003C\u002Fcode>. Cada escenari\ntambé corre amb una càrrega fixa: processos ocupats fixats als nuclis de l'amfitrió més un ús de memòria fix.\u003C\u002Fp>\n\u003Cp>\u003Ccode>grouping\u003C\u002Fcode> s'activa per defecte només quan, a totes dues màquines, amb 8 i 16 plugins i a cada freqüència i quàntum\nllistats, amb cada fila repetida almenys tres vegades:\u003C\u002Fp>\n\u003Col>\n\u003Cli>sense càrrega, \u003Ccode>plan\u003C\u002Fcode> té menys processos que \u003Ccode>individual\u003C\u002Fcode> i no més memòria, CPU ni xruns;\u003C\u002Fli>\n\u003Cli>amb càrrega, \u003Ccode>plan\u003C\u002Fcode> no té més xruns que \u003Ccode>individual\u003C\u002Fcode> i en té menys en el conjunt de la matriu;\u003C\u002Fli>\n\u003Cli>\u003Ccode>plan\u003C\u002Fcode> no té més xruns que \u003Ccode>chain\u003C\u002Fcode> on una cadena és possible i es recupera d'un worker mort no més lentament que\n\u003Ccode>chain\u003C\u002Fcode> més enllà de la dispersió mesurada.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Si les xifres perden, l'agrupació es queda desactivada i les xifres es publiquen igualment.\u003C\u002Fp>\n\u003Ch2 id=\"modes-de-fallada\">Modes de fallada\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Un membre falla\u003C\u002Fstrong>: el culpable assenyalat queda en quarantena i passa a un worker propi, la fallada entra a\nl'historial i el pla següent el deixa sol (\u003Ccode>history-crashed\u003C\u002Fcode>). Una mort que no assenyala cap culpable separa els\nmembres; el pla es torna a fer després de deu minuts de funcionament estable.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Xruns en un grup\u003C\u002Fstrong>: quan la proporció supera el marge, el pla següent deixa sols els membres més costosos. Un pla mai no\ncanvia tot sol a mig cicle; s'aplica a la propera declaració, quarantena o crida \u003Ccode>plan\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un historial il·legible\u003C\u002Fstrong> no es llegeix ni es desa i el planificador treballa només amb empremtes i costos\n(\u003Ccode>history-unavailable\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un worker que no comunica xruns\u003C\u002Fstrong> deixa les finestres de xruns a zero i res no es marca \u003Ccode>raises-xruns\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Un pla que el dimoni no pot fer\u003C\u002Fstrong> deixa els membres com estaven i respon el codi del refús, amb el motiu\n\u003Ccode>plan-refused:&lt;code&gt;\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n",1793954996406]