Failed proofs
0
out of 24 named capabilities
A test that proved them failed. This is the only card that talks about a fault.
The work board: what is waiting, what is underway, what is waiting for a review, what is done. Nothing is filed by hand, every card is a GitHub issue or pull request, and its column is deduced from facts.
What npm serves right now, against what this repository carries. Both numbers are read from npm and from git at collection time, never typed in, so a card asking to publish a version that is already published gets named here instead of being believed for four days.
Docs and portal deployed 29 Sept 2026, 19:26Z (issues, main as it was then). Since then: 1 in progress (the run rendering this page is one of them). Read at 29 Sept 2026, 19:38Z.
GitHub runs: not read yet. This column reads the GitHub runs API from your browser when the page opens, then every two minutes.
the release check and the Nodal reviews, at build time 29 Sept 2026, 19:38Z
No local job in what could be read at build time.
1 source did not answer at build time: Nodal was not reachable from here. Something may be running there without showing here.
last 7 days, newest first
+ 31 older
last 7 days, newest first
The only page that talks about the PRODUCT rather than the code: one row per thing a user believes they can do (create an agent, connect Notion, approve an action…), and what proves it, at two levels, the screen and the engine. It hands down no verdict: it says which proofs exist and what the last measurement said about them.
The screen says the buttons chain together; the engine says the thing is done behind. A capability is only truly verified if both exist and pass.
Each card states a FACT, not a verdict. "Failed proofs" is the only one that talks about a fault; the other three count proofs nobody ever wrote, a plan of work, not an alarm.
0
out of 24 named capabilities
A test that proved them failed. This is the only card that talks about a fault.
0
the façade may be checked, the engine is not
1
nothing says a user can get there through the interface
0
neither screen nor engine, what we believe is shipped
One row per capability, grouped by product domain. Two columns: what the SCREEN said, what the ENGINE said. Under each result, the tests that carry it.
| Capability | Screen | Engine |
|---|---|---|
| Install and start required Can I install Nodal and land on a screen that answers? screen passed · engine passed
|
passed
dashboard navigation @cap:installer-et-demarrer/ecran the root page IS a new conversation, with no login form and no redirect away dashboard navigation @cap:installer-et-demarrer/ecran the dashboard moved to /dashboard, and nothing redirects back to the root dashboard navigation @cap:installer-et-demarrer/ecran the rail carries the five destinations on every page 56 moredashboard navigation @cap:installer-et-demarrer/ecran every dashboard section is one panel away dashboard navigation @cap:installer-et-demarrer/ecran the Work panel opens on Nodal chats, already unfolded settings pages render without runtime errors @cap:installer-et-demarrer/ecran every (dashboard) route returns 200 and renders an h1 settings pages render without runtime errors @cap:installer-et-demarrer/ecran les routes à paramètre rendent, atteintes par les liens de l’app le rail porte cinq destinations @cap:installer-et-demarrer/ecran rend Work, Agents, Scheduled, Approvals, Settings, puis Runs et Help le rail porte cinq destinations @cap:installer-et-demarrer/ecran porte SUR CHAQUE CASE l’icône de la planche le rail porte cinq destinations @cap:installer-et-demarrer/ecran range Settings juste SOUS Approvals, dans le groupe du haut le rail porte cinq destinations @cap:installer-et-demarrer/ecran fait NAVIGUER Runs, et fait OUVRIR une carte à Help le rail porte cinq destinations @cap:installer-et-demarrer/ecran donne la MÊME forme aux cases, active ou non le rail porte cinq destinations @cap:installer-et-demarrer/ecran dessine la case active PLEINE LARGEUR, sans bordure la destination active suit la route @cap:installer-et-demarrer/ecran allume « agents » sur /agents la destination active suit la route @cap:installer-et-demarrer/ecran allume « agents » sur /agents/a1 la destination active suit la route @cap:installer-et-demarrer/ecran allume « agents » sur /memories la destination active suit la route @cap:installer-et-demarrer/ecran allume « agents » sur /mcp la destination active suit la route @cap:installer-et-demarrer/ecran allume « settings » sur /llm-providers la destination active suit la route @cap:installer-et-demarrer/ecran allume « work » sur /chat la destination active suit la route @cap:installer-et-demarrer/ecran allume « work » sur /chat/abc la destination active suit la route @cap:installer-et-demarrer/ecran allume « work » sur /spaces la destination active suit la route @cap:installer-et-demarrer/ecran allume « work » sur / la destination active suit la route @cap:installer-et-demarrer/ecran allume « run » sur /dashboard la destination active suit la route @cap:installer-et-demarrer/ecran allume « run » sur /automations la destination active suit la route @cap:installer-et-demarrer/ecran allume « run » sur /jobs/j1 la destination active suit la route @cap:installer-et-demarrer/ecran allume « work » sur /chat/runs/j1 la destination active suit la route @cap:installer-et-demarrer/ecran allume « approvals » sur /approvals la destination active suit la route @cap:installer-et-demarrer/ecran allume « settings » sur /settings la destination active suit la route @cap:installer-et-demarrer/ecran allume Runs sur /logs, et montre alors le panneau de REPLI chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran Work : WORKSPACES puis CHANNELS, et rien d’écrit chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran Agents : le dossier des agents, puis CONNECT chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran Run : CRON puis WEBHOOKS, et rien au-dessus chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran la case Run du rail MÈNE au tableau de bord, pas à la racine chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran ne propose « Code » dans aucun des cinq panneaux chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran Approvals : APPROVALS puis RECENTS chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran Settings : les quatre familles, chacune ouvrant un réglage RÉEL chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran n’allume QUE le réglage ouvert, et aucun sur /settings nu chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran ne fait PAS dépendre une entrée sans paramètre de ceux de la route chaque panneau porte les sections de SA planche @cap:installer-et-demarrer/ecran marque l’entrée du panneau où l’on se trouve, et elle seule les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran borne chaque lecture à UN DE PLUS que ce qu’elle dessine les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran ne dit « See all » que s’il y en a d’AUTRES les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran encadre le vide, avec la phrase de la planche les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran DIT ce qu’une lecture en échec a répondu, au lieu de se taire les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran relit sur la CADENCE de la barre, sans que rien ne navigue les listes du panneau se lisent en base @cap:installer-et-demarrer/ecran ignore une réponse arrivée APRÈS une plus récente toutes les lignes du panneau ont la MÊME forme @cap:installer-et-demarrer/ecran rend la même classe de ligne pour chacune, quelle que soit sa profondeur toutes les lignes du panneau ont la MÊME forme @cap:installer-et-demarrer/ecran coupe un nom long au lieu d’élargir le panneau PageShell — la largeur de contenu @cap:installer-et-demarrer/ecran les deux modes bornent la colonne de contenu à la même largeur PageShell — la largeur de contenu @cap:installer-et-demarrer/ecran `fluid` retire la borne dans les deux modes PageShell — la largeur de contenu @cap:installer-et-demarrer/ecran l’aside se pose HORS de la colonne bornée, après elle PageShell — la largeur de contenu @cap:installer-et-demarrer/ecran la barre va d’un bord à l’autre, au-dessus de la rangée PageShell — la largeur de contenu @cap:installer-et-demarrer/ecran sans aside, rien de plus n’est rendu à côté du contenu PageShell — une seule boîte de contenu @cap:installer-et-demarrer/ecran le corps d’une page ordinaire est PLEINE LARGEUR, borné et centré PageShell — une seule boîte de contenu @cap:installer-et-demarrer/ecran un écran `fill` borne sa colonne de la même façon PageShell — une seule boîte de contenu @cap:installer-et-demarrer/ecran `fluid` retire la borne, et rien d’autre SettingsSections @cap:installer-et-demarrer/ecran rend une section par réglage, avec son nom, sa pastille et son formulaire SettingsSections @cap:installer-et-demarrer/ecran un réglage sans formulaire dit pourquoi, au lieu de s’afficher vide les pages de /settings @cap:installer-et-demarrer/ecran chaque réglage vit sur UNE page, et chaque page est une entrée du menu les pages de /settings @cap:installer-et-demarrer/ecran `?page=` choisit la page, `?open=<réglage>` y mène aussi, et sinon Access |
passed
gapsBetween @cap:installer-et-demarrer/moteur nomme la migration que l’historique n’a jamais reçue gapsBetween @cap:installer-et-demarrer/moteur ne voit AUCUN trou quand les quatre sont là gapsBetween @cap:installer-et-demarrer/moteur nomme les DEUX trous quand il y en a deux, dans l’ordre du journal 139 moregapsBetween @cap:installer-et-demarrer/moteur LIT un historique rendu en chaînes — `created_at` est un bigint gapsBetween @cap:installer-et-demarrer/moteur IGNORE une ligne d’historique qu’aucune entrée du journal ne réclame gapsBetween @cap:installer-et-demarrer/moteur rend TOUT le journal quand rien n’a été appliqué réparer une migration sautée @cap:installer-et-demarrer/moteur démarre un vrai Postgres et applique les VRAIES migrations réparer une migration sautée @cap:installer-et-demarrer/moteur ne voit AUCUN trou sur une base qui vient d’être migrée réparer une migration sautée @cap:installer-et-demarrer/moteur VOIT le trou quand 0114 a été sautée, et la nomme réparer une migration sautée @cap:installer-et-demarrer/moteur `runMigrations` NE LA RATTRAPE PAS — c’est tout le sujet réparer une migration sautée @cap:installer-et-demarrer/moteur la réparation repose les colonnes ET la ligne d’historique réparer une migration sautée @cap:installer-et-demarrer/moteur réparer une base SANS trou ne fait rien server boot @cap:installer-et-demarrer/moteur GET /api/health returns 200 server boot @cap:installer-et-demarrer/moteur GET /unknown returns 404 server boot @cap:installer-et-demarrer/moteur POST /api/cron returns tick result les quatre lectures REFUSENT un plafond absurde @cap:installer-et-demarrer/moteur rejette zéro, un négatif, un décimal et cinquante-et-un buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur Timezone, Install notes, Auto-run brake et MCP server affichent ce qui a été écrit buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur les mêmes lignes suivent la base quand elle change en sens inverse buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur Verification surfaces nomme les surfaces cochées et les compte buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur Run budget dit les plafonds ÉCRITS, et « aucun » pour zéro (#442) buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur Repair turns dit la borne ÉCRITE, y compris zéro buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur les budgets anti-boucle viennent du code qui les applique, jamais recopiés buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur Workspaces nomme l’espace actif lu en base buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur les quinze lignes existent, groupées dans l’ordre Access, Safety, Workspace, Advanced buildSettingRows — les lignes lisent la base @cap:installer-et-demarrer/moteur sans mot de passe à changer, la ligne Password n’existe pas buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur Sign-in dit le mode en vigueur, et sa pastille buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur Sign-in ajoute Google quand la config le porte buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur Network access montre l’adresse que les autres appareils doivent taper buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur Worker secret dit ce qui casse quand il manque buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur une lecture qui a échoué se DIT, elle ne se remplace pas par un défaut plausible buildSettingRows — la config et l’environnement @cap:installer-et-demarrer/moteur ROOT agent nomme l’agent et son niveau d’autonomie filterSettingRows @cap:installer-et-demarrer/moteur réduit la liste aux lignes dont le nom contient le filtre, sans casse decideStart @cap:installer-et-demarrer/moteur refuses when the runner is healthy AND the data dir names a live postmaster decideStart @cap:installer-et-demarrer/moteur proceeds on a healthy runner alone decideStart @cap:installer-et-demarrer/moteur proceeds on a live postmaster alone — that is the orphan case formatAlreadyRunning @cap:installer-et-demarrer/moteur names every pid it found, and tells the user what to run formatAlreadyRunning @cap:installer-et-demarrer/moteur states what was OBSERVED, not what it takes the observation to mean formatAlreadyRunning @cap:installer-et-demarrer/moteur points at the port itself when no runner pid could be measured formatAlreadyRunning @cap:installer-et-demarrer/moteur omits a port whose pid was never measured rather than inventing one decideStartFromProbes @cap:installer-et-demarrer/moteur refuses against a REAL healthy runner and a REAL live lockfile decideStartFromProbes @cap:installer-et-demarrer/moteur proceeds when the runner answers but is degraded decideStartFromProbes @cap:installer-et-demarrer/moteur proceeds when nothing is listening at all decideStartFromProbes @cap:installer-et-demarrer/moteur never makes an HTTP request when the data dir claims nothing embedded Postgres binaries @cap:installer-et-demarrer/moteur says nothing when the binaries and the links are all there embedded Postgres binaries @cap:installer-et-demarrer/moteur a missing binary names the package, the file, and the command to type embedded Postgres binaries @cap:installer-et-demarrer/moteur a promised link that is absent is named as npm’s install-script gate embedded Postgres binaries @cap:installer-et-demarrer/moteur two missing links read as two, in plain plural embedded Postgres binaries @cap:installer-et-demarrer/moteur an empty manifest is not a fault, which is exactly the Windows case embedded Postgres binaries @cap:installer-et-demarrer/moteur an unreadable manifest is read as empty, not as a wall embedded Postgres binaries @cap:installer-et-demarrer/moteur a package that cannot be loaded at all says so, with the same command embedded Postgres binaries @cap:installer-et-demarrer/moteur a platform with no build is refused without naming a package embedded Postgres package name @cap:installer-et-demarrer/moteur darwin/arm64 needs @embedded-postgres/darwin-arm64 embedded Postgres package name @cap:installer-et-demarrer/moteur darwin/x64 needs @embedded-postgres/darwin-x64 embedded Postgres package name @cap:installer-et-demarrer/moteur linux/x64 needs @embedded-postgres/linux-x64 embedded Postgres package name @cap:installer-et-demarrer/moteur linux/arm64 needs @embedded-postgres/linux-arm64 embedded Postgres package name @cap:installer-et-demarrer/moteur linux/arm needs @embedded-postgres/linux-arm embedded Postgres package name @cap:installer-et-demarrer/moteur linux/ia32 needs @embedded-postgres/linux-ia32 embedded Postgres package name @cap:installer-et-demarrer/moteur linux/ppc64 needs @embedded-postgres/linux-ppc64 embedded Postgres package name @cap:installer-et-demarrer/moteur win32/x64 needs @embedded-postgres/windows-x64 embedded Postgres package name @cap:installer-et-demarrer/moteur win32/arm64 has no build embedded Postgres package name @cap:installer-et-demarrer/moteur darwin/ia32 has no build embedded Postgres package name @cap:installer-et-demarrer/moteur freebsd/x64 has no build embedded Postgres manifest and layout @cap:installer-et-demarrer/moteur reads the entries of a real pg-symlinks.json and drops malformed ones embedded Postgres manifest and layout @cap:installer-et-demarrer/moteur an absent manifest reads as no links at all embedded Postgres manifest and layout @cap:installer-et-demarrer/moteur the package root is three levels above native/bin/pg_ctl embedded Postgres manifest and layout @cap:installer-et-demarrer/moteur the probe reads THIS machine: a supported platform has a complete install stopWithinBudget @cap:installer-et-demarrer/moteur gives up on a stop that never returns, instead of hanging stopWithinBudget @cap:installer-et-demarrer/moteur reports a stop that returned inside the budget stopWithinBudget @cap:installer-et-demarrer/moteur counts a stop that THREW as an answer, not as a timeout killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur signals NOTHING for a RECORDED pid when the process table could not be read killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur still reaches a LIVE HANDLE when the table does not answer, and says so killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur spares a recycled root and still kills the members the same reading vouched for killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur spares a root whose generation changed, by the creation tick alone killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur kills the tree in one `/T` when the reading AGREES with the record killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur spares a root whose RECORD is a bare number, proving nothing killPidTree — the root is not signalled unproven @cap:installer-et-demarrer/moteur still kills a root the caller holds a handle to, with no record to compare killPidTree — the members are re-read before they are signalled @cap:installer-et-demarrer/moteur spares a member the second reading no longer recognises killPidTree — the members are re-read before they are signalled @cap:installer-et-demarrer/moteur spares a member whose generation changed under the same name killPidTree — the members are re-read before they are signalled @cap:installer-et-demarrer/moteur says nothing about a member that is simply gone killPidTree — the members are re-read before they are signalled @cap:installer-et-demarrer/moteur sweeps the members on the earlier reading when the table will not answer twice killPidTree — the members are re-read before they are signalled @cap:installer-et-demarrer/moteur kills the member the second reading still vouches for formatLauncherLine @cap:installer-et-demarrer/moteur stamps a UTC instant, not a local clock time formatLauncherLine @cap:installer-et-demarrer/moteur names the event and its cause formatLauncherLine @cap:installer-et-demarrer/moteur flattens a multi-line cause onto one line formatLauncherLine @cap:installer-et-demarrer/moteur ends every record with exactly one newline le refus de servir une base à trous @cap:installer-et-demarrer/moteur NOMME chaque migration manquante le refus de servir une base à trous @cap:installer-et-demarrer/moteur accorde le singulier sur une seule le refus de servir une base à trous @cap:installer-et-demarrer/moteur donne la commande EXACTE, et rend le démarrage qu’on avait le refus de servir une base à trous @cap:installer-et-demarrer/moteur dit POURQUOI il refuse, et pas seulement qu’il refuse applyPostgresLoggingConfig — atomic replace @cap:installer-et-demarrer/moteur writes the scratch file, never the target, and renames it into place applyPostgresLoggingConfig — atomic replace @cap:installer-et-demarrer/moteur leaves a complete file and no scratch file behind applyPostgresLoggingConfig — atomic replace @cap:installer-et-demarrer/moteur keeps the previous file when the rename fails, and leaves no scratch file postgresLoggingSettings @cap:installer-et-demarrer/moteur turns the collector on and points it outside the data dir postgresLoggingSettings @cap:installer-et-demarrer/moteur writes Windows paths with forward slashes postgresLoggingSettings @cap:installer-et-demarrer/moteur carries the pid and a millisecond timestamp in every line postgresLoggingSettings @cap:installer-et-demarrer/moteur keeps the LOG level, which is where the signal number is written postgresLoggingSettings @cap:installer-et-demarrer/moteur rotates by age and by size, and does not keep every day forever quoteGuc @cap:installer-et-demarrer/moteur doubles an inner quote instead of escaping it mergeAutoConf @cap:installer-et-demarrer/moteur replaces our own keys rather than appending a second copy mergeAutoConf @cap:installer-et-demarrer/moteur keeps a setting somebody else put there with ALTER SYSTEM mergeAutoConf @cap:installer-et-demarrer/moteur drops comments and blank lines rather than duplicating the header applyPostgresLoggingConfig @cap:installer-et-demarrer/moteur writes postgresql.auto.conf and creates the log directory applyPostgresLoggingConfig @cap:installer-et-demarrer/moteur is idempotent across restarts — it runs on EVERY start, not once at initdb applyPostgresLoggingConfig @cap:installer-et-demarrer/moteur replaces an unreadable existing file rather than refusing to boot postgresLogDirFor @cap:installer-et-demarrer/moteur gives two data directories two directories, even when both are named pg-data postgresLogDirFor @cap:installer-et-demarrer/moteur keeps every cluster under the one place a human already opens postgresLogDirFor @cap:installer-et-demarrer/moteur names the directory after the data directory, so the two can be told apart postgresLogDirFor @cap:installer-et-demarrer/moteur answers the same for the same directory spelled differently confirmRecordedPid @cap:installer-et-demarrer/moteur lets through a pid whose tick and executable both still match confirmRecordedPid @cap:installer-et-demarrer/moteur refuses a pid the OS handed to a different generation confirmRecordedPid @cap:installer-et-demarrer/moteur refuses a pid now carried by a different executable confirmRecordedPid @cap:installer-et-demarrer/moteur refuses a postgres our data dir does not claim, even with a perfect record confirmRecordedPid @cap:installer-et-demarrer/moteur lets through a postgres the data dir DOES claim confirmRecordedPid @cap:installer-et-demarrer/moteur refuses a bare number — a pid file written before any identity was recorded confirmRecordedPid @cap:installer-et-demarrer/moteur refuses when the process table did not answer, rather than trusting the record confirmRecordedPid @cap:installer-et-demarrer/moteur reports a pid absent from a table that DID answer as simply gone confirmRecordedPid @cap:installer-et-demarrer/moteur matches the executable name case-insensitively confirmTree @cap:installer-et-demarrer/moteur allows taskkill /T over a tree of our own processes confirmTree @cap:installer-et-demarrer/moteur vetoes taskkill /T when a foreign Postgres sits in the tree confirmTree @cap:installer-et-demarrer/moteur keeps /T when the Postgres in the tree is one we can claim confirmTree @cap:installer-et-demarrer/moteur vetoes /T when the root itself cannot be confirmed unconfirmedIdentityNotice @cap:installer-et-demarrer/moteur names the pid and says the identity was NOT confirmed unconfirmedIdentityNotice @cap:installer-et-demarrer/moteur is what `up` prints before the SIGKILL it cannot confirm formatPortRotation @cap:installer-et-demarrer/moteur names the pid left running and says the port was abandoned, not freed formatPortRotation @cap:installer-et-demarrer/moteur says nothing about a holder when no pid was measured formatPortRotation @cap:installer-et-demarrer/moteur is what `up` prints when it rotates, with the holder actually measured formatPortRotation @cap:installer-et-demarrer/moteur reports each rotated port on its own isPostgresAuthFailure @cap:installer-et-demarrer/moteur recognises the two SQLSTATE codes a wrong password produces isPostgresAuthFailure @cap:installer-et-demarrer/moteur leaves everything a cluster still starting can throw as a RETRY startAndWaitUntilReady @cap:installer-et-demarrer/moteur fails at the FIRST refusal on a bad password, and stops the cluster startAndWaitUntilReady @cap:installer-et-demarrer/moteur keeps retrying a refusal that waiting CAN fix postmasterGaveUp @cap:installer-et-demarrer/moteur reconnaît la ligne par laquelle le postmaster renonce, et la rend telle quelle postmasterGaveUp @cap:installer-et-demarrer/moteur laisse passer ce qu’un cluster qui démarre — ou qui tourne — écrit normalement startAndWaitUntilReady face à un postmaster qui a renoncé @cap:installer-et-demarrer/moteur échoue TOUT DE SUITE, en citant la ligne, plutôt que d’attendre 180 s startAndWaitUntilReady face à un postmaster qui a renoncé @cap:installer-et-demarrer/moteur préfère l’arrêt GRACIEUX, et ne tire à balle réelle que s’il échoue a refused password leaves nothing running @cap:installer-et-demarrer/moteur fails with the SQLSTATE and stops the cluster it started a refused password leaves nothing running @cap:installer-et-demarrer/moteur and the right password still works afterwards the embedded cluster keeps its own log @cap:installer-et-demarrer/moteur writes into a log directory of its own rather than nowhere the embedded cluster keeps its own log @cap:installer-et-demarrer/moteur stamps every line with a pid and a millisecond timestamp the embedded cluster keeps its own log @cap:installer-et-demarrer/moteur records the pid of a backend killed from outside, and how it died up refuses to start on missing database binaries @cap:installer-et-demarrer/moteur stops with the probe’s own message, before the config is even read up refuses to start on missing database binaries @cap:installer-et-demarrer/moteur a complete install is not blocked: up carries on past the check |
| Protect and sign in required Can I close my instance and come back to it with my account? screen passed · engine passed
|
passed
NetworkForm — /settings @cap:se-connecter/ecran Network section renders with radio buttons and read-only URL fields NetworkForm — /settings @cap:se-connecter/ecran clicking LAN radio shows LAN addresses or "No LAN interface detected" NetworkForm — /settings @cap:se-connecter/ecran re-saving the mode already in force reports no restart needed 6 moreNetworkForm — /settings @cap:se-connecter/ecran saving the other mode persists it, demands a restart, and is put back UserMenu — sign-out + re-login round-trip @cap:se-connecter/ecran shows email in sidebar, signs out, redirects to /login, re-logs in le compte au bas du rail @cap:se-connecter/ecran n’ouvre le bloc de compte qu’au clic, et il vient du serveur le compte au bas du rail @cap:se-connecter/ecran se referme à Échap, et PREND la touche en le faisant le compte au bas du rail @cap:se-connecter/ecran se ferme AVANT le menu qui la porte, parce qu’elle est plus intérieure le compte au bas du rail @cap:se-connecter/ecran se referme au clic DEHORS, et pas au clic dedans |
passed
createLocalAuthProvider @cap:se-connecter/moteur returns a LocalAuthProvider instance createLocalAuthProvider @cap:se-connecter/moteur getSession returns null for a request without a session cookie createLocalAuthProvider @cap:se-connecter/moteur getSession returns null for a request with a bogus cookie 13 morecreateLocalAuthProvider @cap:se-connecter/moteur handleAuthRequest returns a Response for auth routes requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/chat with no auth → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/cron with no auth → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/agent with no auth → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/approve with no auth → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/chat with wrong bearer → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/cron with wrong bearer → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/agent with wrong bearer → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/approve with wrong bearer → 401 requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/cron with correct bearer → not 401 (reaches handler) requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/agent with correct bearer → not 401 (reaches handler, gets 400 or 202) requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/approve with correct bearer → not 401 (reaches handler, gets 404) requireRunnerAuth — local-auth mode @cap:se-connecter/moteur POST /api/chat with correct bearer → not 401 (reaches handler, gets 400 or 404) |
| Capability | Screen | Engine |
|---|---|---|
| Create an agent required Can I create an agent and give it a role? screen passed · engine passed
|
passed
agent → task → job flow @cap:creer-agent/ecran @cap:parler-a-un-agent/ecran creates an agent, sends a task, and shows the job in the list le dossier « Agents » @cap:creer-agent/ecran arrive DÉPLIÉ et liste les agents, chacun vers sa page les trois points d’une ligne @cap:creer-agent/ecran ouvre un menu Rename / Delete, fermé tant qu’on ne clique pas 4 moreles trois points d’une ligne @cap:creer-agent/ecran Rename envoie le NOUVEAU nom à l’action de la sorte, puis relit la liste les trois points d’une ligne @cap:creer-agent/ecran Delete demande confirmation, supprime, et remonte à la section si on était dessus les trois points d’une ligne @cap:creer-agent/ecran un projet se RETIRE de la liste par son chemin, il n’est pas supprimé les trois points d’une ligne @cap:creer-agent/ecran la confirmation DIT où le projet part, ce qui reste, et par où il revient |
passed
CRUD: agents @cap:creer-agent/moteur insert + select + update + delete la lecture du dossier Agents @cap:creer-agent/moteur rend ce qu’on lui demande, et pas plus, sur une base qui en porte treize la lecture du dossier Agents @cap:creer-agent/moteur garde l’ordre de la PAGE, celui que la personne a rangé à la main 1 morela lecture du dossier Agents @cap:creer-agent/moteur ne rend QUE l’identifiant, le nom et l’activité, jamais le jeton du bot |
| Configure an agent required Can I change its profile, its personality, its settings? screen passed · engine passed
|
passed
agent recipes @cap:configurer-agent/ecran a profile shows what it sets, then creates ONE ordinary agent with skills and read-only rules agent recipes @cap:configurer-agent/ecran "Customize a new agent" is selected by default and Next opens the empty form |
passed
buildSystemPrompt @cap:configurer-agent/moteur includes personality verbatim (never modified) buildSystemPrompt @cap:configurer-agent/moteur injects the delegated sub-task discipline ONLY when the job is delegated buildSystemPrompt @cap:configurer-agent/moteur appends team block when orchestrator has children 8 morebuildSystemPrompt @cap:configurer-agent/moteur honours {{team}} placeholder in personality buildSystemPrompt @cap:configurer-agent/moteur includes skills metadata block when agent has skills buildSystemPrompt @cap:configurer-agent/moteur no team block for worker agent buildSystemPrompt @cap:configurer-agent/moteur appends ## Job context block with telegramChatId when jobContext is provided buildSystemPrompt @cap:configurer-agent/moteur appends ## Job context with origin only when telegramChatId is absent buildSystemPrompt @cap:configurer-agent/moteur surfaces a notify_on_success directive when the schedule opted into a confirmation buildSystemPrompt @cap:configurer-agent/moteur omits the notify_on_success directive when the flag is absent buildSystemPrompt @cap:configurer-agent/moteur does NOT include ## Job context when jobContext is not provided |
| Organise a team required Can I attach agents to an orchestrator? screen passed · engine passed
|
passed
Agents page redesign @cap:organiser-equipe/ecran render, dark mode, add-worker modal, keyboard drag round-trip what the thread says when a delegation ends @cap:organiser-equipe/ecran a delegation that produced nothing shows its reason, never a promise what the thread says when a delegation ends @cap:organiser-equipe/ecran a delegation that delivered puts the specialist’s own work in the thread |
passed
attachAgentToOrchestrator @cap:organiser-equipe/moteur creates a real agent_assignments row when resolved by slug attachAgentToOrchestrator @cap:organiser-equipe/moteur resolves the target by NAME (ilike), not just slug attachAgentToOrchestrator @cap:organiser-equipe/moteur is idempotent: calling twice produces exactly one assignment row 223 moreattachAgentToOrchestrator @cap:organiser-equipe/moteur returns error:agent_not_found for a missing slug attachAgentToOrchestrator @cap:organiser-equipe/moteur returns error:cannot_attach_self when target resolves to the orchestrator itself migration 0110_tool_calls_seq @cap:organiser-equipe/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0110_tool_calls_seq @cap:organiser-equipe/moteur tool_calls.seq existe, en bigint, alimentée par une séquence migration 0110_tool_calls_seq @cap:organiser-equipe/moteur deux insertions de la MÊME heure gardent leur ordre d’écriture generateText streamed option @cap:organiser-equipe/moteur streams a turn when asked, and records its usage generateText streamed option @cap:organiser-equipe/moteur hands each piece of text to onTextDelta as it arrives, in order (#458) generateText streamed option @cap:organiser-equipe/moteur sizes the first-token clock with the tool schemas it sends generateText streamed option @cap:organiser-equipe/moteur an agent’s first-token wait lets a slow thinker through; without it the call is cut generateText streamed option @cap:organiser-equipe/moteur keeps the one-shot call when the option is absent generateText streamed option @cap:organiser-equipe/moteur a Stop on a one-shot call leaves at once as a cancellation, never re-sent generateText streamed option @cap:organiser-equipe/moteur keeps the one-shot call for a model whose tool calls are parsed from its text streamed turn clocks @cap:organiser-equipe/moteur a model writing one token every 10 s for 20 minutes is never cut streamed turn clocks @cap:organiser-equipe/moteur a model that writes 30 s then goes silent 70 s expires between tokens, its text kept streamed turn clocks @cap:organiser-equipe/moteur a model silent before its first token expires at the first-token clock, nothing kept streamed turn clocks @cap:organiser-equipe/moteur a hosted model silent for 200 s before its first token, at no particular effort, completes streamed turn clocks @cap:organiser-equipe/moteur silent past the first-token clock of a hosted model: cut, with the same reason streamed turn clocks @cap:organiser-equipe/moteur on a 120K-token context the same 200 s silence before the first token does not expire streamed turn clocks @cap:organiser-equipe/moteur reasoning deltas are activity: 5 minutes of thinking out loud, then text, completes streamed turn clocks @cap:organiser-equipe/moteur a local endpoint has no silence clock: 30 minutes of silence, then the answer streamed turn clocks @cap:organiser-equipe/moteur a local endpoint still stops at the absolute net, its text kept streamed turn clocks @cap:organiser-equipe/moteur a stream cut AFTER a tool call keeps its text but is not resumable streamed turn clocks @cap:organiser-equipe/moteur a stream cut after a tool call and NO text was still served: not resumable, not silent streamed turn clocks @cap:organiser-equipe/moteur counts every generated character — reasoning and tool arguments — not only the text streamed turn clocks @cap:organiser-equipe/moteur a text-start with no token after it is framing: first-token clock, not served streamed turn clocks @cap:organiser-equipe/moteur a stream silent from the start was not served streamed turn clocks @cap:organiser-equipe/moteur a stream cut in plain text is resumable streamed turn clocks @cap:organiser-equipe/moteur Stop ends a stream that is still writing, at once, with what it wrote streamed turn clocks @cap:organiser-equipe/moteur a stream error that is a plain object becomes an Error that keeps its message and code streamed turn clocks @cap:organiser-equipe/moteur a stream error BEFORE any text is thrown as the error it carries streamed turn clocks @cap:organiser-equipe/moteur a stream that breaks after REASONING only was served: counted, not resumable, not a raw error streamed turn clocks @cap:organiser-equipe/moteur a stream that BREAKS after writing keeps its text as a resumable stream_error cut computeTurnClocks @cap:organiser-equipe/moteur grows the first-token clock with the context, never the between-tokens one computeTurnClocks @cap:organiser-equipe/moteur a hosted model waits the hidden-thinking floor at every effort, only max raises it (#583) computeTurnClocks @cap:organiser-equipe/moteur the agent’s value replaces the implicit clock, raises and floors included computeTurnClocks @cap:organiser-equipe/moteur the run budget caps an IMPLICIT clock at half of what remains, never below 60 s computeTurnClocks @cap:organiser-equipe/moteur the run budget never caps the agent’s explicit value computeTurnClocks @cap:organiser-equipe/moteur knows a local endpoint by its host, never by the provider name alone computeTurnClocks @cap:organiser-equipe/moteur counts the tool schemas: a large whitelist moves a call to a longer first-token clock computeTurnClocks @cap:organiser-equipe/moteur estimates the context from text, not from image bytes holdersOfPath @cap:organiser-equipe/moteur a path UNDER a listed root belongs to that root’s agent holdersOfPath @cap:organiser-equipe/moteur a path given with a folder label resolves under that label holdersOfPath @cap:organiser-equipe/moteur a shared folder belongs to every agent that has it holdersOfPath @cap:organiser-equipe/moteur an absolute path under NO listed root belongs to nobody holdersOfPath @cap:organiser-equipe/moteur a bare name cannot be placed from the roster alone: undetermined, never "nobody" buildTeamBlock @cap:organiser-equipe/moteur returns empty string for agent with no children (worker) buildTeamBlock @cap:organiser-equipe/moteur returns empty string when orchestrator has no assigned children buildTeamBlock @cap:organiser-equipe/moteur contains agent names from DB (not hardcoded) buildTeamBlock @cap:organiser-equipe/moteur reflects DB state change (description update) buildTeamBlock @cap:organiser-equipe/moteur exposes BOTH delegation styles for a team with sub-orchestrators, leaning router buildTeamBlock @cap:organiser-equipe/moteur exposes BOTH delegation styles for a workers-only team, leaning planner buildTeamBlock @cap:organiser-equipe/moteur includes skill names AND descriptions so the orchestrator routes by capability buildTeamBlock @cap:organiser-equipe/moteur includes sub-agent connector tools so the orchestrator can route Airtable/Notion/etc requests buildTeamBlock @cap:organiser-equipe/moteur includes sub-agent MCP server tools so the orchestrator can route Stripe/Cogni/etc requests buildTeamBlock @cap:organiser-equipe/moteur does not contain hardcoded agent slugs (invariant 1 spot-check) buildTeamBlock — ce que chaque agent peut réellement faire (#506) @cap:organiser-equipe/moteur liste les dossiers de chaque agent (label et chemin) depuis agent_workspaces buildTeamBlock — ce que chaque agent peut réellement faire (#506) @cap:organiser-equipe/moteur montre TOUS les dossiers et TOUS les programmes, partagé compris buildTeamBlock — ce que chaque agent peut réellement faire (#506) @cap:organiser-equipe/moteur dit si chaque agent peut lancer des commandes, selon son runtime et ses outils buildTeamBlock — les agents de l’espace hors de l’équipe (#473) @cap:organiser-equipe/moteur nomme chaque agent hors équipe, son orchestrateur, et le chemin qui l’atteint buildTeamBlock — une demande explicite de la spécialité d’un coéquipier va à ce coéquipier (#601) @cap:organiser-equipe/moteur on a job that can delegate: the specialty rule, with the delegation route, for any team buildTeamBlock — une demande explicite de la spécialité d’un coéquipier va à ce coéquipier (#601) @cap:organiser-equipe/moteur on the chat (run_task): the same rule, and the teammate is named in the run_task instruction buildTeamBlock — une demande explicite de la spécialité d’un coéquipier va à ce coéquipier (#601) @cap:organiser-equipe/moteur names only a teammate whose entry shows the means, not one whose Purpose alone matches buildTeamBlock — une demande explicite de la spécialité d’un coéquipier va à ce coéquipier (#601) @cap:organiser-equipe/moteur where no hand-off exists (CLI session, maximum depth): no specialty rule buildSystemPrompt — la règle de spécialité et « A question about Nodal is yours » disent la même chose (#601, revue #603 P1) @cap:organiser-equipe/moteur on the job surface, both rules are in the prompt and the specialty rule leaves platform knowledge to the orchestrator buildSystemPrompt — la règle de spécialité et « A question about Nodal is yours » disent la même chose (#601, revue #603 P1) @cap:organiser-equipe/moteur on the chat surface, both rules are in the prompt and the specialty rule leaves platform knowledge to the orchestrator parseDelegationOutcomePayload @cap:organiser-equipe/moteur relit ce que renderDelegationOutcome a écrit, champ pour champ parseDelegationOutcomePayload @cap:organiser-equipe/moteur relit l’enregistrement d’un ÉCHEC, marqueur et consignes compris parseDelegationOutcomePayload @cap:organiser-equipe/moteur un `sub_delegations` ÉCRIT PAR L’ENFANT dans son texte n’en sort pas parseDelegationOutcomePayload @cap:organiser-equipe/moteur rend null sur ce qui n’est PAS un enregistrement — un report, une phrase parseDelegationOutcomePayload @cap:organiser-equipe/moteur écarte les entrées qui ne nomment pas un outil de délégation extractReviewTarget @cap:organiser-equipe/moteur lit la PR quelle que soit la forme écrite, et la rend normalisée extractReviewTarget @cap:organiser-equipe/moteur rend le même ensemble quel que soit l’ordre, et un ensemble DIFFÉRENT quand on en ajoute extractReviewTarget @cap:organiser-equipe/moteur retombe sur le chemin de paquet quand aucune PR n’est citée extractReviewTarget @cap:organiser-equipe/moteur lit le chemin quelle que soit la casse — `APPS/Web` et `apps/web` sont la même cible extractReviewTarget @cap:organiser-equipe/moteur préfère la PR au chemin quand la tâche cite les deux extractReviewTarget @cap:organiser-equipe/moteur rend null quand rien n’est reconnaissable — pas de cible devinée findDeliveredReviewForTarget @cap:organiser-equipe/moteur nomme le verdict déjà livré quand le même relecteur est redemandé sur la même PR findDeliveredReviewForTarget @cap:organiser-equipe/moteur refuse `APPS/Web` après une revue de `apps/web` — deux écritures, une seule cible findDeliveredReviewForTarget @cap:organiser-equipe/moteur LAISSE PASSER la relecture quand une correction a ABOUTI depuis le verdict findDeliveredReviewForTarget @cap:organiser-equipe/moteur REFUSE quand rien n’a abouti entre les deux relectures findDeliveredReviewForTarget @cap:organiser-equipe/moteur une délégation ENCORE EN COURS ne compte pas comme « quelque chose a changé » findDeliveredReviewForTarget @cap:organiser-equipe/moteur une délégation ÉCHOUÉE depuis le verdict ne compte pas non plus findDeliveredReviewForTarget @cap:organiser-equipe/moteur laisse passer une AUTRE cible findDeliveredReviewForTarget @cap:organiser-equipe/moteur laisse passer une tâche SANS cible reconnaissable findDeliveredReviewForTarget @cap:organiser-equipe/moteur laisse passer un AUTRE relecteur sur la même PR — la garde ne ferme pas le second avis findDeliveredReviewForTarget @cap:organiser-equipe/moteur ignore un enfant qui n’a livré AUCUN verdict valide findDeliveredReviewForTarget @cap:organiser-equipe/moteur ne voit pas l’enfant d’un AUTRE job parent — la garde est bornée à ce job findDeliveredReviewForTarget @cap:organiser-equipe/moteur retient le DERNIER appel de l’enfant, celui qui corrige un appel refusé resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a file the child wrote, still unchanged: its size, and the parent is told not to redo it resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a file changed since the child wrote it is said changed, and the parent is NOT told to keep it resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a DECLARED file present on disk that the child never wrote is not credited to it resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a file the child wrote WITHOUT a fingerprint is its work, to re-read, never NOTHING usable resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a file written then removed is said absent resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur only ENOENT means absent: another stat error is an UNKNOWN state, with its code resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a code project is handed over as a PROJECT, with the files the child changed in it resumeDelegated — what a stopped child wrote, as it is now (#491) @cap:organiser-equipe/moteur a completed child carries the same field, so the contract never changes shape parseReviewVerdictOutput @cap:organiser-equipe/moteur rend le verdict validé par l’outil, constats compris parseReviewVerdictOutput @cap:organiser-equipe/moteur rend null sur un appel REFUSÉ par le schéma de l’outil parseReviewVerdictOutput @cap:organiser-equipe/moteur rend null sur une sortie illisible ou vide parseReviewVerdictOutput @cap:organiser-equipe/moteur LÈVE sur une sortie qui s’annonce réussie sans respecter le contrat readDeliveredReviewVerdict @cap:organiser-equipe/moteur lit le verdict sur la ligne tool_calls du job readDeliveredReviewVerdict @cap:organiser-equipe/moteur rend null quand le job n’a jamais appelé l’outil readDeliveredReviewVerdict @cap:organiser-equipe/moteur c’est le DERNIER appel qui fait foi readDeliveredReviewVerdict @cap:organiser-equipe/moteur un dernier appel REFUSÉ ne livre rien, même après un appel réussi readFinalReviewVerdict @cap:organiser-equipe/moteur rend le verdict quand il est le DERNIER appel d’outil du job readFinalReviewVerdict @cap:organiser-equipe/moteur rend null quand un autre outil a tourné APRÈS le verdict readFinalReviewVerdict @cap:organiser-equipe/moteur deux appels du MÊME tour : c’est l’ordre d’écriture qui tranche readFinalReviewVerdict @cap:organiser-equipe/moteur deux verdicts du MÊME tour : le dernier écrit fait foi le parent d’un enfant repris @cap:organiser-equipe/moteur repart avec l’échec typé, au lieu d’attendre pour toujours le parent d’un enfant repris @cap:organiser-equipe/moteur un parent qui attend une AUTRE délégation n’est pas réveillé le parent d’un enfant repris @cap:organiser-equipe/moteur un parent qui attend SANS délégation enregistrée n’est pas réveillé, et c’est DIT le parent d’un enfant repris @cap:organiser-equipe/moteur un job SANS parent est repris sans rien réveiller le parent d’un enfant repris @cap:organiser-equipe/moteur le parent reçoit le dernier texte de l’enfant ET le fichier qu’il a écrit (#491) le parent d’un enfant repris @cap:organiser-equipe/moteur sans la tâche dans la transcription, aucun texte d’historique n’est rendu comme livrable (#491) le parent d’un enfant repris @cap:organiser-equipe/moteur un tour courant fait d’appels d’outil seulement ne rend aucun texte, et le dit (#491) un job survit à un redémarrage du runner (#443) @cap:organiser-equipe/moteur mort au tour 5, repris à son tour 4 sauvegardé, fini au tour 9, les tours d’avant intacts un job survit à un redémarrage du runner (#443) @cap:organiser-equipe/moteur un job qui a épuisé ses reprises échoue avec son code, au lieu de reprendre sans fin un job survit à un redémarrage du runner (#443) @cap:organiser-equipe/moteur un job mort avant son premier tour sauvegardé n’a pas de point de reprise : il échoue la reprise ne refait jamais un effet (#443) @cap:organiser-equipe/moteur un outil qui écrit, mort après l’effet et avant la sauvegarde : pas de reprise, l’effet existe une fois la reprise ne refait jamais un effet (#443) @cap:organiser-equipe/moteur une écriture d’un tour déjà sauvegardé ne bloque pas la reprise la reprise ne refait jamais un effet (#443) @cap:organiser-equipe/moteur un tour interrompu qui n’a fait que lire est repris la reprise ne refait jamais un effet (#443) @cap:organiser-equipe/moteur un runtime sans point de reprise Nodal échoue, et le dit par son code une mort entre l’effet et sa ligne d’audit ne rejoue pas l’effet (#443) @cap:organiser-equipe/moteur file_write fait son effet puis le runner meurt avant l’audit : pas de reprise, un seul effet une demande d’approbation en attente empêche la reprise (#443) @cap:organiser-equipe/moteur pas de reprise, et la demande est nommée dans le fait une marque posée après le point de reprise, quel que soit son tour (#443) @cap:organiser-equipe/moteur tour 5 suspendu sur run_command, approuvé, rejoué, mort avant executed_at : pas de reprise un appel refusé par la porte n’est pas un effet (#443) @cap:organiser-equipe/moteur run_command bloqué par une règle, enregistré après le point de reprise, puis mort : reprise a prose turn that announced an action is re-read @cap:organiser-equipe/moteur announced delegation: the re-read calls the tool, the delegation happens, the job is not completed empty a prose turn that announced an action is re-read @cap:organiser-equipe/moteur a real answer in prose: the re-read calls nothing, the job completes with that answer a prose turn that announced an action is re-read @cap:organiser-equipe/moteur a Stop that lands during the re-read: the tool it asks for never runs a prose turn that announced an action is re-read @cap:organiser-equipe/moteur a re-read cut on the output cap is abandoned: the complete prose stands and the job completes with it a prose turn that announced an action is re-read @cap:organiser-equipe/moteur a turn already over the token budget stops without paying for a re-read a prose turn that announced an action is re-read @cap:organiser-equipe/moteur KNOWN LIMIT: an announcement whose re-read declines ends completed with the announcement a prose turn that announced an action is re-read @cap:organiser-equipe/moteur a re-read with 51 calls is abandoned: no tool runs, the job completes with the prose delegated sub-job deliverable @cap:organiser-equipe/moteur nudges once then FAILS an internal sub-job that signals success with no text delegated sub-job deliverable @cap:organiser-equipe/moteur un livrable fait d’ESPACES n’est pas un livrable delegated sub-job deliverable @cap:organiser-equipe/moteur ACCEPTS the sub-job when the second turn writes the deliverable delegated sub-job deliverable @cap:organiser-equipe/moteur does NOT fail a resumed job whose deliverable was written in an EARLIER run delegated sub-job deliverable @cap:organiser-equipe/moteur FAILS a head job on `api` that signals success with no text and no delivery parent receives a typed delegation record @cap:organiser-equipe/moteur injects {status, summary, error, exit_reason, tools_used} for a completed child parent receives a typed delegation record @cap:organiser-equipe/moteur injects an error-text record that forbids a waiting message for a failed child parent receives a typed delegation record @cap:organiser-equipe/moteur une délégation ordinaire porte les clés du contrat, hint à null parent receives a typed delegation record @cap:organiser-equipe/moteur un refus du fournisseur fait voyager hint jusqu’au parent ce qu’un agent qui DÉLÈGUE livre @cap:organiser-equipe/moteur sa synthèse FINALE l’emporte sur la compilation de ses enfants ce qu’un agent qui DÉLÈGUE livre @cap:organiser-equipe/moteur un parent dont l’ENFANT a livré n’est pas un livrable vide a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur nudges the parent that sends a waiting message and then signals success a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur une délégation de SECOURS réussie efface l’échec de la première a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur un parent qui DIT LA VÉRITÉ échoue AVEC sa raison, pas avec un code opaque a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur sur un canal à OUTIL, l’échec part vers l’utilisateur, pas seulement en base a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur la promesse rendue en TEXTE SEUL porte l’échec avec elle a parent cannot promise over a failed delegation @cap:organiser-equipe/moteur la ligne d’échec du harnais n’est jamais relue comme les mots de l’agent au tour suivant (#562) a child with no deliverable is never "(no output)" @cap:organiser-equipe/moteur compiles a FAILURE into the parent result, not an empty-looking answer a child with no deliverable is never "(no output)" @cap:organiser-equipe/moteur marks a NON-failed child that produced nothing as a failed delegation a DEFERRED delegation is not a failure @cap:organiser-equipe/moteur lets the parent finish honestly after a deferred second handoff le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur le record que le parent lit porte verdict, résumé et constats le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur une délégation ordinaire est inchangée : review_verdict est null le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur la garde « aucun livrable » ne tue pas un job qui a enregistré un verdict le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur un verdict suivi d’un travail sans rapport ne tient plus lieu de livrable le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur une ligne de verdict illisible fait échouer le job par son code le verdict de revue voyage jusqu’au parent @cap:organiser-equipe/moteur une ligne illisible ne laisse JAMAIS le parent suspendu l’échec d’un petit-enfant atteint le grand-parent @cap:organiser-equipe/moteur le nomme dans le résultat livré, depuis l’enregistrement typé et non d’une phrase l’échec d’un petit-enfant atteint le grand-parent @cap:organiser-equipe/moteur le porte aussi dans l’enregistrement que SON propre parent recevrait une réparation réelle efface l’échec propagé @cap:organiser-equipe/moteur ROUTE 1 — le grand-parent va lui-même voir le spécialiste, et il livre une réparation réelle efface l’échec propagé @cap:organiser-equipe/moteur ROUTE 2 — le sous-arbre est rejoué et l’obtient : le grand-parent le sait du record le SUCCÈS pose sa livraison dans la transaction terminale @cap:organiser-equipe/moteur sur un canal à outil, la notice d’échec est commise avec le statut et part every tool_use of a turn leaves with its tool_result, whatever the exit (#561) @cap:organiser-equipe/moteur delegation next to return_result, the child completes: the parent resumes and completes every tool_use of a turn leaves with its tool_result, whatever the exit (#561) @cap:organiser-equipe/moteur delegation next to return_result, the child fails: the parent resumes on the failure and completes every tool_use of a turn leaves with its tool_result, whatever the exit (#561) @cap:organiser-equipe/moteur two assign_ of an agent the job does not have: the dropped one is answered too, the job goes on every tool_use of a turn leaves with its tool_result, whatever the exit (#561) @cap:organiser-equipe/moteur a question next to return_result: the suspended transcript is valid, return_result answered finalizeJobFailure — la livraison est commise avec l’échec @cap:organiser-equipe/moteur une livraison demandée sans préparateur ⇒ refus fort, rien n’est écrit finalizeJobFailure — la livraison est commise avec l’échec @cap:organiser-equipe/moteur le préparateur écrit DANS la transaction terminale : son échec annule l’échec finalizeJobFailure — la livraison est commise avec l’échec @cap:organiser-equipe/moteur l’échec et sa livraison atterrissent ensemble finalizeJobFailure — la livraison est commise avec l’échec @cap:organiser-equipe/moteur un job DÉJÀ terminal ne reçoit pas de livraison : ce n’est pas notre échec un job tenu par un runner vivant n’est jamais fauché (#565) @cap:organiser-equipe/moteur six appels d’outil de 59 s sur deux tours : jamais fauché, fini `completed` un job tenu par un runner vivant n’est jamais fauché (#565) @cap:organiser-equipe/moteur ni appel modèle ni appel d’outil pendant quatre minutes (préparation) : jamais fauché un job tenu par un runner vivant n’est jamais fauché (#565) @cap:organiser-equipe/moteur un parent attend son enfant délégué, qui enchaîne des outils de 59 s : aucun des deux fauché un job tenu par un runner vivant n’est jamais fauché (#565) @cap:organiser-equipe/moteur un job du runtime CLI, trois minutes de préparation puis dix de tour : jamais fauché le battement est rendu quand le run rend la main (#565) @cap:organiser-equipe/moteur après une EXCEPTION du run (dossier de la demande introuvable) : rendu, la ligne vieillit le battement est rendu quand le run rend la main (#565) @cap:organiser-equipe/moteur après une SUSPENSION pour approbation : rendu, la ligne vieillit le battement d’un job, de la prise au lâcher (#565) @cap:organiser-equipe/moteur tenu et immobile dix minutes : frais ; lâché : il vieillit le battement d’un job, de la prise au lâcher (#565) @cap:organiser-equipe/moteur une reprise imbriquée qui rend la main ne lâche pas le battement de l’appelant le battement d’un job, de la prise au lâcher (#565) @cap:organiser-equipe/moteur un run PÉRIMÉ (prise ancienne) ne cache pas au faucheur le run mort qui l’a remplacé le battement d’un job, de la prise au lâcher (#565) @cap:organiser-equipe/moteur une reprise imbriquée (prise suivante) bat sous SA prise, et l’appelant rendu ne bat plus pour elle le battement d’un job, de la prise au lâcher (#565) @cap:organiser-equipe/moteur un job qui n’est plus `processing` n’est pas rajeuni par le battement un tour qui expire @cap:organiser-equipe/moteur est REJOUÉ une fois, et le travail va au bout sans consommer un tour de plus un tour qui expire @cap:organiser-equipe/moteur deux fois de suite, le travail échoue en GARDANT ce que l’agent avait écrit un tour qui expire @cap:organiser-equipe/moteur dit les FAITS — fournisseur, modèle, tour — et non l’exception recopiée un tour qui expire @cap:organiser-equipe/moteur DERRIÈRE UNE CHAÎNE DE REPLI épuisée, l’expiration est reconnue de la même façon un tour qui expire @cap:organiser-equipe/moteur une chaîne épuisée SANS expiration n’est pas rejouée — elle garde son propre code ce que le PARENT reçoit d’un tour expiré @cap:organiser-equipe/moteur l’enregistrement typé porte le travail partiel en résumé, et timeout en raison de sortie lire une expiration sous ses deux formes @cap:organiser-equipe/moteur la reconnaît nue, et au bout d’une chaîne épuisée lire une expiration sous ses deux formes @cap:organiser-equipe/moteur ne reconnaît rien d’autre les faits d’un tour expiré, mis en mots @cap:organiser-equipe/moteur la ligne lue par la personne est une ligne de plateforme, entre crochets les faits d’un tour expiré, mis en mots @cap:organiser-equipe/moteur le code machine porte les mêmes faits un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur la seconde requête porte le partiel et la consigne ; le tour garde la note ENTIÈRE un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur coupé puis muet deux fois, le travail échoue en gardant la moitié écrite un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur l’appel coupé est COMPTÉ : ses jetons estimés entrent dans les totaux du travail un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur l’estimation de l’appel coupé compte le prompt ET les définitions d’outils envoyés un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur coupé APRÈS un appel d’outil, le tour est REJOUÉ, pas repris : l’appel n’est pas perdu un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur une reprise qui tombe sur AUTRE CHOSE qu’une expiration garde la moitié écrite un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur un appel coupé qui fait DÉBORDER le budget de jetons n’est pas repris un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur un Stop qui tombe juste avant l’expiration l’emporte, même si le budget déborde un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur une annulation pendant un appel coupé garde le texte qu’il avait écrit un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur coupé après un appel d’outil SANS texte, l’appel est compté et rejoué, pas pris pour muet un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur un tour repris qu’un plafond arrête garde son texte ENTIER un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur la sortie estimée d’un appel coupé compte le raisonnement, pas seulement le texte un tour coupé EN PLEINE ÉCRITURE est repris, jamais rejoué (#441) @cap:organiser-equipe/moteur les reprises ont un budget : la quatrième coupure termine le travail Stop arrête le travail PENDANT l’appel au modèle @cap:organiser-equipe/moteur un tour qui écrit sans fin s’arrête dès le Stop, avec ce qu’il avait écrit Stop arrête le travail PENDANT l’appel au modèle @cap:organiser-equipe/moteur un Stop suivi d’un débordement de budget rend « annulé », pas « échoué » Stop arrête le travail PENDANT l’appel au modèle @cap:organiser-equipe/moteur une réponse qui revient APRÈS le Stop n’exécute aucun de ses outils la sonde git regarde le dossier du job (#507) @cap:organiser-equipe/moteur le bloc git du prompt décrit le dépôt du dossier attaché, pas celui de l’agent une erreur de préparation échoue le job et reprend le parent (#507) @cap:organiser-equipe/moteur dossier du job supprimé après la création : ligne failed avec le code, parent repris a job at the maximum delegation depth cannot delegate, and is told so (#473) @cap:organiser-equipe/moteur at depth 3: no assign_*, no create_task, no "ways to delegate"; the team is listed as facts a job at the maximum delegation depth cannot delegate, and is told so (#473) @cap:organiser-equipe/moteur below the limit, the same orchestrator still gets both delegation routes une erreur après la prise ne coupe pas la remontée au parent (#566) @cap:organiser-equipe/moteur la lecture de rapprochement lève : executeJob rend une issue, et le parent est repris the cancel cascade never cancels a parent resumed since it was read (#566) @cap:organiser-equipe/moteur the parent read awaiting_delegation is pending by the time of the write: it stays pending après une erreur non rattrapée, la ligne fait foi (#507) @cap:organiser-equipe/moteur annulé avant failJob : cancelled est propagé, pas un faux échec après une erreur non rattrapée, la ligne fait foi (#507) @cap:organiser-equipe/moteur fini ailleurs avant failJob : ce qui est propagé est ce que la ligne dit a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur accepted: fingerprinted and unchanged, by the child or the grandchild; unfingerprinted or declared, modified during the delegate’s run a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur a declared path through a junction matches the real path the guard looks up a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur refused: replaced since the delegate wrote it, another run’s output it declared, a content another job fingerprinted a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur refused: another agent’s file, another run’s delegate’s file, a “child” in another entity a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur a file that exists but cannot be read (locked) is said unreadable, not “not yours” a file my delegate produced is mine to deliver (#588) @cap:organiser-equipe/moteur a failed read says it could not check, not that the file is not mine |
| Choose a model required Can I decide which model runs which agent? screen passed · engine passed
|
passed
Test B — Agent edit picks LLM provider @cap:choisir-modele/ecran change LLM provider dropdown on agent edit → model field updates → save → toast ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran rend UNE pastille de trois segments, portant les valeurs de l’agent ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran le nom du fournisseur n’est JAMAIS écrit deux fois 11 moreThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran chaque segment ouvre SA liste, et une seule à la fois ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran Échap ferme la liste sans rien régler ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran la liste des modèles est CELLE DES RÉGLAGES : catalogue + modèles vus en direct ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran le fournisseur n’ayant pas répondu, il reste le catalogue — le repli de l’écran d’édition ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran changer de fournisseur REPOSE le modèle sur celui du nouveau ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran changer de fournisseur LÂCHE un effort que le nouveau modèle n’offre pas ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran changer de modèle écrit le nouveau et garde un effort qu’il offre ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran choisir un effort l’écrit sur l’AGENT, et le segment prend la nouvelle valeur ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran un échec se dit et la pastille GARDE les anciennes valeurs ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran sans agent, aucune pastille : il n’y a rien à régler ThreadComposer — provider, modèle, effort @cap:choisir-modele/ecran sans aucune clé LLM, aucune pastille — et rien n’est demandé au fournisseur |
passed
createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError when provider is empty createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError when model is empty createLlmClient @cap:choisir-modele/moteur returns a client with the correct config 62 morecreateLlmClient @cap:choisir-modele/moteur returns capabilities matching the registry for the given provider createLlmClient @cap:choisir-modele/moteur exposes generateText, streamText, generateObject functions createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError for openai-compatible without baseURL createLlmClient @cap:choisir-modele/moteur creates openai-compatible client when baseURL is provided createLlmClient @cap:choisir-modele/moteur creates openrouter client when apiKey is provided createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError for openrouter without apiKey isGeminiModel @cap:choisir-modele/moteur reconnaît la famille quel que soit le préfixe de l’agrégateur isGeminiModel @cap:choisir-modele/moteur ne reconnaît pas les autres familles isGeminiModel @cap:choisir-modele/moteur reconnaît la variante OpenRouter, la forme la plus courante du slug isGeminiModel @cap:choisir-modele/moteur lit le DERNIER segment, et Gemma n’est pas Gemini convertSchemaForGemini @cap:choisir-modele/moteur ne laisse passer AUCUN des mots-clés que Gemini refuse convertSchemaForGemini @cap:choisir-modele/moteur garde ce qui fait le sens de l’outil convertSchemaForGemini @cap:choisir-modele/moteur dit « nullable » là où le schéma disait « ou null » convertSchemaForGemini @cap:choisir-modele/moteur un objet vide imbriqué devient un objet nu, la racine vide ne se dit pas sanitizeGeminiTools @cap:choisir-modele/moteur assainit les paramètres de chaque outil sans toucher au reste sanitizeGeminiTools @cap:choisir-modele/moteur un outil sans paramètre part SANS le champ, jamais avec un objet vide le corps envoyé à OpenRouter @cap:choisir-modele/moteur pour un modèle Gemini, les outils partent assainis le corps envoyé à OpenRouter @cap:choisir-modele/moteur pour un autre modèle, le corps est rendu tel quel un fournisseur qui refuse la requête @cap:choisir-modele/moteur le job échoue au tour 1 avec un code qui nomme le fournisseur et le statut un fournisseur qui refuse la requête @cap:choisir-modele/moteur ce que la personne lit nomme les FAITS, jamais le JSON ni un conseil du harnais un fournisseur qui refuse la requête @cap:choisir-modele/moteur ce que l’agent avait écrit avant le refus reste le livrable un fournisseur qui refuse la requête @cap:choisir-modele/moteur le geste à faire est un CHAMP typé, porté jusqu’au parent un fournisseur qui refuse la requête @cap:choisir-modele/moteur une délégation ordinaire ne porte aucun geste un fournisseur qui refuse la requête @cap:choisir-modele/moteur une panne du fournisseur (500) n’est PAS un refus et garde son chemin lire un refus de requête @cap:choisir-modele/moteur le reconnaît sur l’erreur et sur sa cause lire un refus de requête @cap:choisir-modele/moteur ne reconnaît rien d’autre lire un refus de requête @cap:choisir-modele/moteur un statut de panne au-dessus d’un 400 plus bas reste une panne les faits d’un refus, mis en mots @cap:choisir-modele/moteur la ligne lue par la personne est une ligne de plateforme, entre crochets les faits d’un refus, mis en mots @cap:choisir-modele/moteur la ligne ne porte AUCUNE phrase de conseil les faits d’un refus, mis en mots @cap:choisir-modele/moteur le code machine porte les mêmes faits turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur orchestrator on xiaomi/mimo-v2.6-pro: every request, turn 1 included, carries tool_choice 'auto' turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur worker holding more than the always-on tools on xiaomi/mimo-v2.6-pro: turn 1 carries tool_choice 'auto' turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur orchestrator on openai/gpt-5.6-sol: every request, turn 1 included, carries tool_choice 'auto' turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur worker holding more than the always-on tools on openai/gpt-5.6-sol: turn 1 carries tool_choice 'auto' turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur orchestrator on z-ai/glm-5.3: every request, turn 1 included, carries tool_choice 'auto' turn 1 leaves the tool choice to the model @cap:choisir-modele/moteur worker holding more than the always-on tools on z-ai/glm-5.3: turn 1 carries tool_choice 'auto' les schémas des outils intégrés, pour Gemini @cap:choisir-modele/moteur le corps NON assaini porte bien ce que Gemini refuse — sinon ce test ne prouve rien les schémas des outils intégrés, pour Gemini @cap:choisir-modele/moteur assainis, ils ne portent AUCUN mot-clé refusé, sur aucun outil les schémas des outils intégrés, pour Gemini @cap:choisir-modele/moteur aucun outil ne part avec un objet de paramètres vide les schémas des outils intégrés, pour Gemini @cap:choisir-modele/moteur chaque outil garde son nom, et ses paramètres requis quand il en a setAgentModelAndEffortAction @cap:choisir-modele/moteur écrit le modèle et l’effort que le modèle offre setAgentModelAndEffortAction @cap:choisir-modele/moteur « Auto » s’écrit comme un NULL, pas comme une chaîne setAgentModelAndEffortAction @cap:choisir-modele/moteur REFUSE un effort que le modèle catalogué n’offre pas, et ne touche à rien setAgentModelAndEffortAction @cap:choisir-modele/moteur change la CLÉ, et repose le modèle qu’on lui donne setAgentModelAndEffortAction @cap:choisir-modele/moteur la clé primaire ne reste pas dans la chaîne de repli setAgentModelAndEffortAction @cap:choisir-modele/moteur REFUSE une clé d’un autre espace, et ne touche à rien setAgentModelAndEffortAction @cap:choisir-modele/moteur REFUSE une clé désactivée, et ne touche à rien setAgentModelAndEffortAction @cap:choisir-modele/moteur ACCEPTE un modèle hors catalogue — les réglages l’acceptent aussi setAgentModelAndEffortAction @cap:choisir-modele/moteur l’agent d’un AUTRE espace est introuvable, et reste intact getAgentModelChoicesAction @cap:choisir-modele/moteur dit si l’agent EXIGE des outils : un routeur oui, un agent non getAgentModelChoicesAction @cap:choisir-modele/moteur un routeur garde un modèle catalogué AVEC outils : la garde ne refuse pas à tort getAgentModelChoicesAction @cap:choisir-modele/moteur rend la clé de l’agent, son modèle, son effort et les clés ACTIVES getAgentModelChoicesAction @cap:choisir-modele/moteur l’agent d’un autre espace est introuvable buildModelOptionGroups @cap:choisir-modele/moteur propose TOUT le catalogue du fournisseur, et rien d’un autre buildModelOptionGroups @cap:choisir-modele/moteur ajoute les modèles vus EN DIRECT que le catalogue n’a pas, sans doublon buildModelOptionGroups @cap:choisir-modele/moteur un fournisseur sans catalogue ne rend que ce que le fournisseur a dit buildModelOptionGroups @cap:choisir-modele/moteur sait dire si un modèle est dans la liste les règles qui suivent un changement de clé @cap:choisir-modele/moteur le modèle par défaut d’un fournisseur est le PREMIER de son catalogue les règles qui suivent un changement de clé @cap:choisir-modele/moteur une clé se nomme par son surnom, son fournisseur entre parenthèses les règles qui suivent un changement de clé @cap:choisir-modele/moteur la pastille écrit le nom d’une clé UNE fois : le surnom, sinon le fournisseur les règles qui suivent un changement de clé @cap:choisir-modele/moteur un routeur ne peut pas choisir un modèle catalogué SANS outils — grisé, avec la raison des réglages les règles qui suivent un changement de clé @cap:choisir-modele/moteur un effort ne se refuse que sur un modèle CATALOGUÉ qui ne l’offre pas |
| Capability | Screen | Engine |
|---|---|---|
| Talk to an agent required Can I write to an agent and get an answer? screen passed · engine passed
|
passed
Saisie ancrée pendant une réponse @cap:parler-a-un-agent/ecran sur un fil existant Saisie ancrée pendant une réponse @cap:parler-a-un-agent/ecran sur une conversation neuve (l’écran où Quentin l’a vu) revenir pendant la réponse @cap:parler-a-un-agent/ecran la page rouverte montre ce qui est déjà écrit, et Stop arrête ce tour 61 moreStop dans le chat @cap:parler-a-un-agent/ecran Envoyer devient Stop pendant la réponse, et Stop arrête CETTE conversation agent → task → job flow @cap:creer-agent/ecran @cap:parler-a-un-agent/ecran creates an agent, sends a task, and shows the job in the list déplier un bloc du fil @cap:parler-a-un-agent/ecran C — déplier DEPUIS LE BAS ne fait pas filer la zone visible déplier un bloc du fil @cap:parler-a-un-agent/ecran A — depuis le milieu du fil, le dépliage grandit SOUS la zone visible déplier un bloc du fil @cap:parler-a-un-agent/ecran B — revenu en bas après un dépliage, le lecteur est de nouveau suivi déplier une PETITE boîte @cap:parler-a-un-agent/ecran A — une arrivée TARDIVE ne déplace pas le lecteur qui vient d’ouvrir déplier une PETITE boîte @cap:parler-a-un-agent/ecran B — revenu en bas, le lecteur est de nouveau suivi les adresses du produit @cap:parler-a-un-agent/ecran `/` ouvre une conversation neuve — c’est le défaut de Nodal les adresses du produit @cap:parler-a-un-agent/ecran `/dashboard` rend le Dashboard, entier les adresses du produit @cap:parler-a-un-agent/ecran `/?project=<id>` porte le projet jusqu’à la saisie les adresses du produit @cap:parler-a-un-agent/ecran un chargement en échec se DIT, il ne rend pas une saisie sans destination la réponse du chat en flux @cap:parler-a-un-agent/ecran montre la réponse mot à mot, puis laisse le fil relu prendre le relais la réponse du chat en flux @cap:parler-a-un-agent/ecran un flux en erreur ne laisse aucun texte à moitié écrit passer pour la réponse la réponse du chat en flux @cap:parler-a-un-agent/ecran sans flux, l’envoi repasse par le chemin d’avant et la réponse arrive d’un bloc se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran montre ce qui était écrit, puis la suite, et relit le fil à la fin se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran un tour fini SANS réponse en base ne laisse pas sa demi-réponse figée se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran avant le premier mot, dit que l’agent réfléchit et depuis combien de temps se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran aucun tour ne tourne : rien n’est montré, et le fil est relu une fois se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran un fil qui n’attend aucune réponse ne lit rien se rebrancher sur la réponse qui s’écrit @cap:parler-a-un-agent/ecran Stop, dans la saisie, arrête le tour suivi NewConversationComposer @cap:parler-a-un-agent/ecran OUVRIR l’écran n’écrit rien : aucune conversation n’est créée au rendu NewConversationComposer @cap:parler-a-un-agent/ecran le premier envoi crée la conversation ET y envoie le message, dans ce geste-là NewConversationComposer @cap:parler-a-un-agent/ecran puis l’écran DEVIENT ce fil : /chat/<id>, en remplacement NewConversationComposer @cap:parler-a-un-agent/ecran deux envois d’affilée n’ouvrent qu’UNE conversation NewConversationComposer @cap:parler-a-un-agent/ecran avec un projet, la conversation naît ANCRÉE à lui NewConversationComposer @cap:parler-a-un-agent/ecran le message envoyé paraît TOUT DE SUITE, et l’accueil cède la place NewConversationComposer @cap:parler-a-un-agent/ecran envoi raté : la conversation qui venait de naître est JETÉE NewConversationComposer @cap:parler-a-un-agent/ecran après un envoi raté, réessayer ouvre une AUTRE conversation NewConversationComposer @cap:parler-a-un-agent/ecran un envoi réussi ne jette rien NewConversationComposer @cap:parler-a-un-agent/ecran création refusée : RIEN n’est envoyé, on le dit, et le texte revient NewConversationScreen @cap:parler-a-un-agent/ecran accueille la personne par son prénom, au-dessus de la saisie NewConversationScreen @cap:parler-a-un-agent/ecran sans nom connu, l’accueil ne fabrique personne NewConversationScreen @cap:parler-a-un-agent/ecran porte l’en-tête du fil : l’agent, « Untitled », et d’où ça vient NewConversationScreen @cap:parler-a-un-agent/ecran rien ne s’est encore passé : aucun tour, aucune preuve, aucun coût NewConversationScreen @cap:parler-a-un-agent/ecran l’accueil et la saisie sont CENTRÉS dans le vide, pas collés en bas NewConversationScreen @cap:parler-a-un-agent/ecran un projet porté : le dossier reste à un clic, et la saisie est là NewConversationScreen @cap:parler-a-un-agent/ecran sans ROOT désigné : pas de saisie du tout, et le geste qui débloque PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran dès Entrée, le message est dans le fil et l’agent réfléchit — la réponse n’est pas encore là PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran un second message s’ajoute au fil sans attendre, le loader reste sous le premier — et il ne PART qu’une fois le premier répondu PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran quand la première réponse est rendue, sa copie s’efface et le loader passe sous le message suivant PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran quand le runner a déjà écrit le message suivant sans y répondre, le loader est sous LUI, avant les copies PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran un fil qui se termine sur une demande sans réponse ne fait pas réfléchir l’agent pour de faux PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran deux fois le même texte : les copies s’effacent l’une après l’autre PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran si un envoi échoue, son texte revient dans la zone et sa copie quitte le fil PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran un envoi qui échoue ne bloque pas celui qui attend derrière lui PendingTurn — le fil entre l’envoi et la réponse @cap:parler-a-un-agent/ecran le texte rendu revient DEVANT ce qu’on a tapé depuis ThreadComposer — la rangée d’actions @cap:parler-a-un-agent/ecran la pastille fait la hauteur du bouton, pas plus ThreadComposer — la rangée d’actions @cap:parler-a-un-agent/ecran l’envoi est TRANCHÉ dès qu’il y a du texte, neutre quand il n’y a rien ThreadComposer — la rangée d’actions @cap:parler-a-un-agent/ecran un texte fait d’espaces ne rend pas l’envoi tranché ThreadScreen @cap:parler-a-un-agent/ecran la saisie se réserve la gouttière du fil, et le fil la garde stable ThreadScreen @cap:parler-a-un-agent/ecran le fil s’éteint en fondu au-dessus de la saisie, sans bloquer le défilement ThreadScreen @cap:parler-a-un-agent/ecran un fil suit le bas par défaut, et le dit dans le DOM ThreadScreen @cap:parler-a-un-agent/ecran un écran qui ne suit pas le bas le dit aussi ThreadScreen @cap:parler-a-un-agent/ecran le fil publie sa gouttière sur le parent, en pixels ThreadScroller — ouvrir une boîte éteint le suivi @cap:parler-a-un-agent/ecran un PETIT dépliage éteint le suivi : la croissance d’après ne descend plus le fil ThreadScroller — ouvrir une boîte éteint le suivi @cap:parler-a-un-agent/ecran …et il se rallume quand le lecteur redescend jusqu’en bas ThreadScroller — ouvrir une boîte éteint le suivi @cap:parler-a-un-agent/ecran le lecteur qui descend AVANT que son bloc se pose n’est pas déplacé par lui ThreadScroller — ouvrir une boîte éteint le suivi @cap:parler-a-un-agent/ecran le lecteur qui redescend ENTRE deux croissances d’un même dépliage reste suivi ThreadScroller — la zone dit quand elle est branchée @cap:parler-a-un-agent/ecran un fil monté porte le marqueur ThreadScroller — la zone dit quand elle est branchée @cap:parler-a-un-agent/ecran un tableau aussi : le marqueur dit MONTÉ, pas SUIVI ThreadScroller — la zone dit quand elle est branchée @cap:parler-a-un-agent/ecran le marqueur désigne la zone elle-même, celle que les parcours interrogent |
passed
le texte d’une skill par surface @cap:parler-a-un-agent/moteur une skill à outils dit sur le chat ce qui en reste vrai sans outil le texte d’une skill par surface @cap:parler-a-un-agent/moteur et ce texte-là ne prescrit aucun outil — c’est toute la raison de son existence le texte d’une skill par surface @cap:parler-a-un-agent/moteur une skill sans texte de chat n’en fabrique pas un 73 moremigration 0124_chat_messages_cut_reason @cap:parler-a-un-agent/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0124_chat_messages_cut_reason @cap:parler-a-un-agent/moteur chat_messages.cut_reason existe : texte, facultatif, NULL par défaut migration 0123_chat_messages_stopped @cap:parler-a-un-agent/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0123_chat_messages_stopped @cap:parler-a-un-agent/moteur chat_messages.stopped existe : booléen, requis, faux par défaut un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur le corps exact de #163 est classé passager, cas solde_non_verifie_a_temps un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur un vrai refus de facturation reste facturation un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur un refus qui dit aussi de réessayer reste un refus un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur un point entre « verify » et « credits » ne renvoie pas en facturation un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur la politique de réessai rejoue le corps de #163 et rend le résultat un 429 qui demande de réessayer est passager @cap:parler-a-un-agent/moteur le corps de #163 ne produit JAMAIS un QuotaExhaustedError, même en échouant se rebrancher sur un tour en cours (#457) @cap:parler-a-un-agent/moteur une autre lecture reçoit ce qui est écrit, puis la suite, puis la fin ; ensuite rien se rebrancher sur un tour en cours (#457) @cap:parler-a-un-agent/moteur aucun tour en cours : 204, pas un flux vide se rebrancher sur un tour en cours (#457) @cap:parler-a-un-agent/moteur on ne lit jamais le tour d’une conversation d’une autre entité la réponse du chat sous les horloges des jobs (#458) @cap:parler-a-un-agent/moteur une réponse diffusée laisse sa ligne llm_calls, avec l’usage du fournisseur la réponse du chat sous les horloges des jobs (#458) @cap:parler-a-un-agent/moteur un flux coupé après avoir écrit : le texte reste la réponse, la coupure est un fait Stop dans le chat @cap:parler-a-un-agent/moteur coupe une réponse qui écrit sans fin, et garde ce qui a été écrit Stop dans le chat @cap:parler-a-un-agent/moteur ne lance AUCUN job, même si le modèle avait déjà demandé une escalade Stop dans le chat @cap:parler-a-un-agent/moteur un Stop pendant la relance d’escalade : aucun job, la réponse gardée Stop dans le chat @cap:parler-a-un-agent/moteur un Stop pendant la génération du TITRE : la réponse enregistrée est marquée arrêtée Stop dans le chat @cap:parler-a-un-agent/moteur sans flux, un Stop pendant la relance d’escalade garde la réponse déjà reçue Stop dans le chat @cap:parler-a-un-agent/moteur le chemin de secours /api/chat s’arrête lui aussi Stop dans le chat @cap:parler-a-un-agent/moteur arrête aussi un modèle encore muet, avant son premier mot Stop dans le chat @cap:parler-a-un-agent/moteur un Stop pendant la CRÉATION du job d’escalade : le job est annulé, jamais lancé Stop dans le chat @cap:parler-a-un-agent/moteur un Stop après l’escalade : le tour suivant dit au modèle que la personne a arrêté Stop dans le chat @cap:parler-a-un-agent/moteur n’arrête que SA conversation, et dit quand rien ne tournait runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur un run_task pendant qu’un travail court est REFUSÉ au modèle : un seul job, et le refus nomme le travail runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur une REFORMULATION, même avec un `alongside: true` inventé par le modèle, est refusée : un seul job (revue Codex, passe 3) runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur `run_task` n’offre plus de champ `alongside`, ni dans son schéma ni dans sa description runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur après le refus, un second run_task refusé ne laisse pas sa phrase « je lance » : le modèle répond sans outil, refus en mains (revue Codex, passe 2) runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur une tête au statut NULL retient aussi : `NULL NOT IN (…)` n’est pas « terminé » (revue Codex, passe 4) runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur un travail TERMINÉ ne retient rien : run_task lance comme avant runChatTurn — un travail du fil court déjà (#453) @cap:parler-a-un-agent/moteur deux tours SIMULTANÉS sur le même fil, par la file des routes : UNE seule tête (revue Codex, P1) runChatTurn — every final prose reply is re-read, once per turn (#600) @cap:parler-a-un-agent/moteur the reply written after a refused run_task is re-read runChatTurn — every final prose reply is re-read, once per turn (#600) @cap:parler-a-un-agent/moteur once per turn: the prose after a refusal is not re-read a second time runChatTurn — every final prose reply is re-read, once per turn (#600) @cap:parler-a-un-agent/moteur the tool-free retry’s reply is re-read, and may escalate runChatTurn — le tour appartient à l'agent DU fil @cap:parler-a-un-agent/moteur un agentId qui n'est pas celui de la conversation est refusé, et RIEN n'est écrit runChatTurn — le tour appartient à l'agent DU fil @cap:parler-a-un-agent/moteur l'agent DU fil, lui, écrit son tour runInLane — un tour à la fois par conversation @cap:parler-a-un-agent/moteur sur la même conversation, le second tour ne commence qu’après la fin du premier runInLane — un tour à la fois par conversation @cap:parler-a-un-agent/moteur un tour qui échoue rend son erreur à son appelant et ne bloque pas le suivant runInLane — un tour à la fois par conversation @cap:parler-a-un-agent/moteur deux conversations ne s’attendent pas un job que plus aucun runner ne tient @cap:parler-a-un-agent/moteur échoue avec le code typé et une ligne de faits, jamais en silence un job que plus aucun runner ne tient @cap:parler-a-un-agent/moteur un job qui BAT ENCORE n’est pas touché un job que plus aucun runner ne tient @cap:parler-a-un-agent/moteur un orchestrateur dont le TABLEAU DE TÂCHES tourne encore n’est pas touché les faits d’un runner redémarré, mis en mots @cap:parler-a-un-agent/moteur la ligne lue par la personne est une ligne de plateforme, entre crochets les faits d’un runner redémarré, mis en mots @cap:parler-a-un-agent/moteur sous la minute, elle le dit en secondes un tour CLI n’a aucun serveur MCP (#453, revue Codex passe 3) @cap:parler-a-un-agent/moteur les deux runtimes du chat et du job sont ces deux tours-là, et eux seuls un tour CLI n’a aucun serveur MCP (#453, revue Codex passe 3) @cap:parler-a-un-agent/moteur Claude : --strict-mcp-config, et jamais de --mcp-config un tour CLI n’a aucun serveur MCP (#453, revue Codex passe 3) @cap:parler-a-un-agent/moteur Codex : --ignore-user-config, et aucun mcp_servers passé en -c run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur Stop avant le `result` de Claude : la réponse gardée est le texte déjà dit (#456) @cap:parler-a-un-agent/moteur spawnCliTurn — Stop @cap:parler-a-un-agent/moteur tue un processus qui ne finirait jamais, dès le Stop spawnCliTurn — Stop @cap:parler-a-un-agent/moteur un Stop déjà tiré avant le lancement tue le processus aussitôt la garde « livrable vide » lit le tour courant, pas l’historique rejoué (#419) @cap:parler-a-un-agent/moteur un enfant qui ne signale que return_result derrière un bloc rejoué échoue, sans hériter de la ligne rejouée le résultat d’un job vient de SON tour, jamais de l’historique rejoué (#419) @cap:parler-a-un-agent/moteur un tour sans texte après un bloc rejoué à ligne de grand livre laisse le résultat vide le résultat d’un job vient de SON tour, jamais de l’historique rejoué (#419) @cap:parler-a-un-agent/moteur la forme à deux messages (canal sans outil d’envoi) est écartée de la même façon le résultat d’un job vient de SON tour, jamais de l’historique rejoué (#419) @cap:parler-a-un-agent/moteur un texte réellement écrit à ce tour est toujours repris, même derrière l’historique le résultat d’un job vient de SON tour, jamais de l’historique rejoué (#419) @cap:parler-a-un-agent/moteur la tranche du tour courant commence au DERNIER message qui porte la tâche, et garde les relances POST /api/chat — deux messages à la suite @cap:parler-a-un-agent/moteur le second tour attend la réponse au premier, et la voit dans son historique POST /api/chat/stream — la réponse mot à mot @cap:parler-a-un-agent/moteur dit le texte fragment par fragment, garde la réponse entière, et fait attendre le tour suivant POST /api/chat/stream — la réponse mot à mot @cap:parler-a-un-agent/moteur quand le flux casse, `done` le DIT et porte quand même la réponse entière POST /api/chat/stream — la réponse mot à mot @cap:parler-a-un-agent/moteur un flux qui s’ouvre sans rien dire rend `streamed: false`, pas un demi-vrai POST /api/chat/live @cap:parler-a-un-agent/moteur masque le texte déjà écrit comme la suite, et relaie start / delta / end POST /api/chat/live @cap:parler-a-un-agent/moteur aucun tour ne tourne : 204, pas un flux vide getNewConversationAction @cap:parler-a-un-agent/moteur ouvrir l’écran n’écrit AUCUNE ligne — avant zéro, après zéro getNewConversationAction @cap:parler-a-un-agent/moteur rend le ROOT — celui qui recevra la conversation, avec son visage getNewConversationAction @cap:parler-a-un-agent/moteur sans ROOT désigné, elle le DIT — elle n’en choisit pas un à la place getNewConversationAction @cap:parler-a-un-agent/moteur le nom vient du compte, et reste `null` quand le compte n’en porte pas getNewConversationAction @cap:parler-a-un-agent/moteur un projet inconnu échoue — l’écran ne s’ouvre pas sans son ancrage le premier envoi @cap:parler-a-un-agent/moteur crée la conversation ET lui adresse le message, dans le même geste le premier envoi @cap:parler-a-un-agent/moteur un envoi RATÉ ne laisse aucune ligne : la table relue est vide le premier envoi @cap:parler-a-un-agent/moteur mais un fil qui porte DÉJÀ le message n’est pas jeté — on ne perd pas ce qui est écrit le premier envoi @cap:parler-a-un-agent/moteur un fil qui porte un TRAVAIL n’est pas jeté non plus le premier envoi @cap:parler-a-un-agent/moteur le jet ne sort pas de l’espace de travail : le fil du voisin reste le premier envoi @cap:parler-a-un-agent/moteur sans ROOT, rien ne naît — le refus est dit, la base reste vide |
| Follow what it does required Can I see, while it works, what it is really doing? screen passed · engine passed
|
passed
a run is one row, unfolded into its calls @cap:suivre-execution/ecran the old Runs page has left the menu and /jobs lands on Activity @cap:suivre-execution/ecran Run budget @cap:suivre-execution/ecran the workspace sets what a run may cost and how long it may work 203 moreRun budget @cap:suivre-execution/ecran an agent gets its own wait for the first word, and gives it back A — un fil long s’ouvre sur son dernier message @cap:suivre-execution/ecran a run from the MCP folder opens in Work @cap:suivre-execution/ecran the entry opens the run under /chat/runs, and the sidebar stays on Work le rail dit ce qui tourne @cap:suivre-execution/ecran allume la case Work quand UNE conversation de sa section tourne le rail dit ce qui tourne @cap:suivre-execution/ecran n’allume rien sur Work quand aucune conversation ne tourne le rail dit ce qui tourne @cap:suivre-execution/ecran NE POSE RIEN sur Runs, quoi qu’il tourne le rail dit ce qui tourne @cap:suivre-execution/ecran pose la puce A DROITE, du meme bord que la pastille le rail dit ce qui tourne @cap:suivre-execution/ecran EMPILE le point et la pastille, meme sur une seule case copyText @cap:suivre-execution/ecran uses the clipboard API when the context is secure copyText @cap:suivre-execution/ecran over http on a LAN IP (no clipboard API) still copies the exact text copyText @cap:suivre-execution/ecran when the API refuses (document not focused), the fallback copies copyText @cap:suivre-execution/ecran when nothing can copy, it throws: the caller must not claim a copy every Copy button works over http on a LAN IP @cap:suivre-execution/ecran CopyButton (run id): copies the value and says so, no red toast every Copy button works over http on a LAN IP @cap:suivre-execution/ecran CopyButton (run id): when nothing can copy, the toast is red, never green every Copy button works over http on a LAN IP @cap:suivre-execution/ecran CopyablePath: copies the value and says so, no red toast every Copy button works over http on a LAN IP @cap:suivre-execution/ecran CopyablePath: when nothing can copy, the toast is red, never green every Copy button works over http on a LAN IP @cap:suivre-execution/ecran SetUrl: copies the value and says so, no red toast every Copy button works over http on a LAN IP @cap:suivre-execution/ecran SetUrl: when nothing can copy, the toast is red, never green buildConversationThread — le travail sous sa ligne de résumé la provenance du résultat @cap:suivre-execution/ecran un résultat machine (du JSON) ne sort pas brut : la dernière prose reste la réponse buildConversationThread — le travail sous sa ligne de résumé la provenance du résultat @cap:suivre-execution/ecran marqué prose, un résultat en JSON lisible EST la réponse (#154) buildConversationThread — le travail sous sa ligne de résumé la provenance du résultat @cap:suivre-execution/ecran marqué relay, le texte des délégués sort aussi : c’est ce qui a été livré buildConversationThread — le travail sous sa ligne de résumé la provenance du résultat @cap:suivre-execution/ecran marqué prose, un résultat égal à la prose ne la double pas knownHint — le geste lu en base, rendu au type @cap:suivre-execution/ecran « switch_model » est un geste que cet écran connaît knownHint — le geste lu en base, rendu au type @cap:suivre-execution/ecran aucun geste écrit : rien à rendre knownHint — le geste lu en base, rendu au type @cap:suivre-execution/ecran un geste inconnu n’est pas rendu au type — il vaut le silence knownHint — le geste lu en base, rendu au type @cap:suivre-execution/ecran un code d’erreur n’est pas un geste : l’écran ne déduit plus (#193) knownHint — le geste lu en base, rendu au type @cap:suivre-execution/ecran les héritages de `Object.prototype` ne sont pas des gestes hintSentence — ce que l’écran DIT @cap:suivre-execution/ecran « switch_model » se dit en une phrase, en anglais hintSentence — ce que l’écran DIT @cap:suivre-execution/ecran aucun geste, aucune phrase hintSentence — ce que l’écran DIT @cap:suivre-execution/ecran un geste que cet écran ne connaît pas se TAIT, il ne s’affiche pas en slug hintSentence — ce que l’écran DIT @cap:suivre-execution/ecran « toString » ne rend pas la méthode héritée originOfRun — un run MCP @cap:suivre-execution/ecran nomme l’appelant quand il s’en est donné un originOfRun — un run MCP @cap:suivre-execution/ecran sans étiquette, dit « MCP » et rien d’inventé originOfRun — un run MCP @cap:suivre-execution/ecran les autres canaux ne changent pas le fil d’une conversation @cap:suivre-execution/ecran porte le bouton Stop pendant qu’un tour court le fil d’une conversation @cap:suivre-execution/ecran ne dessine rien quand aucun tour ne court la page d’une session de code @cap:suivre-execution/ecran porte le bouton Stop tant que le process code la page d’une session de code @cap:suivre-execution/ecran ne le dessine PAS pour une session de chat de la CLI DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran inset="default" rend px-4, et aucun autre retrait DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran inset="tight" rend px-3, et aucun autre retrait DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran inset="none" rend px-0, et aucun autre retrait DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran sans prop, le retrait vaut 16 px — le défaut historique du composant DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran le className de l'appelant est toujours rendu — il sert encore à tout le reste DisclosureButton — le retrait horizontal @cap:suivre-execution/ecran insetY="none" rend py-0 et jamais py-3 ; sans prop, py-3 PageShell — la borne du mode pleine hauteur @cap:suivre-execution/ecran borne un écran pleine hauteur ORDINAIRE : c’est le défaut PageShell — la borne du mode pleine hauteur @cap:suivre-execution/ecran la page d’un RUN rend sans la borne PageShell — la borne du mode pleine hauteur @cap:suivre-execution/ecran un run VIVANT ne borne QUE sa rangée d’actions PageShell — la borne du mode pleine hauteur @cap:suivre-execution/ecran un FIL de chat rend sans la borne PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran en-tête, puis barre, puis rangée d’actions, puis contenu PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran « Run now » n’est PAS dans la barre : c’est la faute constatée le 19/09 PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran une barre qui déborde est DEHORS de l’enveloppe à gouttières du corps PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran la fente `aside` pose le panneau HORS de la colonne, sous la barre PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran un écran pleine hauteur ORDINAIRE borne sa colonne ; `fluid` la libère PageShell — l’ordre d’une page de détail @cap:suivre-execution/ecran sans le drapeau, le toolbar reste DANS les gouttières — une page de liste le bouton Stop @cap:suivre-execution/ecran n’existe que tant que le travail court le bouton Stop @cap:suivre-execution/ecran demande confirmation par le dialogue du design system, et arrête le job de tête le bouton Stop @cap:suivre-execution/ecran renonce sans rien arrêter quand on garde le run la rangée d’actions d’un écran de fil @cap:suivre-execution/ecran porte le bouton HORS de la zone qui défile la rangée d’actions d’un écran de fil @cap:suivre-execution/ecran ne dessine aucune rangée quand rien ne court WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran porte le contexte de la page, et rien d’autre WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran ne dessine AUCUN retour : ni libellé, ni chevron, ni lien WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran sans contexte, elle ne se dessine pas du tout — pas de bandeau vide WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran garde sa géométrie : 54 px, un fond, deux filets, ses propres gouttières (#135) WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran la rangée d’actions est un bloc SÉPARÉ : la barre ne la contient pas WorkBar — la barre d’une page de détail @cap:suivre-execution/ecran la rangée d’actions tient le bord DROIT, sous le contexte de la barre CodeProcessDetail — la section Files @cap:suivre-execution/ecran nomme chaque fichier, son geste et son churn CodeProcessDetail — la section Files @cap:suivre-execution/ecran montre la ligne remplacée ET la ligne écrite, chacune de son côté CodeProcessDetail — la section Files @cap:suivre-execution/ecran s’arrête à la borne et dit combien de lignes restent CodeProcessDetail — la section Files @cap:suivre-execution/ecran sans fichier changé, le dit CodeProcessDetail — la section Files @cap:suivre-execution/ecran dit que la liste vient de git quand elle en vient CodeProcessDetail — la section Files @cap:suivre-execution/ecran dit que la liste vient du disque hors depot CodeProcessDetail — la section Files @cap:suivre-execution/ecran un run sans aucun constat le dit, plutot que de se taire CodeProcessDetail — la section Files @cap:suivre-execution/ecran un fichier que git a vu et qu’aucun outil n’a nomme parait, sans diff buildPlateRows — la borne tient AVANT le diff @cap:suivre-execution/ecran ne découpe que ce que la plaque peut dessiner, et compte quand même le reste buildPlateRows — la borne tient AVANT le diff @cap:suivre-execution/ecran une écriture de vingt mille lignes ne construit que la borne, et le dit buildPlateRows — la borne tient AVANT le diff @cap:suivre-execution/ecran un texte plus court que la borne passe entier, et ne cache rien buildPlateRows — la borne tient AVANT le diff @cap:suivre-execution/ecran une réécriture complète compte SÉPARÉMENT l’ancien et le nouveau CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran le corps ne relit PLUS le détail lui-même — c’est la page qui se relit CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran les blocs se suivent : demande, livraison, revue, preuve, fichiers, activité CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran l’en-tête porte l’agent, le projet, le harnais et les sept chiffres CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran la revue montre son verdict, et le constat s’ouvre avec son fichier et sa ligne CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran un process SANS relecture le dit, et sa ligne ne s’ouvre pas CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran ce qui a été livré se lit en haut : fichiers, lignes, preuve CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran un run APPROUVÉ se lit « Delivered · Approved » @cap:verifier-un-livrable/ecran CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran l’activité est LÀ, sans filtre à cliquer, chaque appel dans un bloc du fil CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran un appel déplié montre son entrée et son résultat code-run-view — l’en-tête @cap:suivre-execution/ecran les sept cases, dans l’ordre des autres runs code-run-view — l’en-tête @cap:suivre-execution/ecran une valeur que la donnée ne dit pas s’écrit « — » code-run-view — l’en-tête @cap:suivre-execution/ecran les valeurs connues sont formatées comme sur les autres runs code-run-view — l’en-tête @cap:suivre-execution/ecran l’origine nomme le PROJET quand il est dérivable, jamais une branche inventée code-run-view — l’en-tête @cap:suivre-execution/ecran le harnais et le modèle se lisent ensemble, et rien ne s’écrit sans eux code-run-view — l’en-tête @cap:suivre-execution/ecran le bouton « Files » ne paraît que sur un projet ENREGISTRÉ code-run-view — l’en-tête @cap:suivre-execution/ecran l’état porte le mot de l’étape, et une étape inconnue s’écrit telle quelle code-run-view — ce qui a été livré @cap:suivre-execution/ecran sans fichier ni preuve, il n’y a rien à annoncer code-run-view — ce qui a été livré @cap:suivre-execution/ecran les fichiers, leurs lignes et les commandes de preuve viennent des lignes réelles code-run-view — ce qui a été livré @cap:suivre-execution/ecran un fichier PROMIS non vert interdit « green » ici aussi @cap:verifier-un-livrable/ecran code-run-view — ce qui a été livré @cap:suivre-execution/ecran un run RÉPARÉ ne compte que la dernière preuve, comme les autres écrans code-run-view — l’activité @cap:suivre-execution/ecran un appel devient un bloc du fil, sans carte inventée code-run-view — l’activité @cap:suivre-execution/ecran un appel REFUSÉ par le harnais garde son issue — il ne passe pas pour un succès code-run-view — l’activité @cap:suivre-execution/ecran un tour rend une ligne de modèle ; un tour à deux modèles en rend deux code-run-view — l’activité @cap:suivre-execution/ecran les agents sont ceux du process et de ses délégués, dédoublonnés, avec leur image code-run-view — l’activité @cap:suivre-execution/ecran la ligne de l’activité compte les pas, les agents et la durée RunRow — la ligne repliée @cap:suivre-execution/ecran porte les sept éléments du run, et rien de ses appels RunRow — la ligne dépliée @cap:suivre-execution/ecran demande les appels de CE run au dépliage, et les montre dans l’ordre rendu RunRow — la ligne dépliée @cap:suivre-execution/ecran propose d’en montrer 50 de plus quand le run en a davantage, et les ajoute RunRow — la ligne dépliée @cap:suivre-execution/ecran un run en cours fait avancer le compteur de sa ligne repliée RunRow — suivre un run coûte, et ça s’arrête @cap:suivre-execution/ecran s’espace : après cinq minutes, trois secondes ne demandent plus rien, trente secondes si RunRow — suivre un run coûte, et ça s’arrête @cap:suivre-execution/ecran s’arrête au bout d’une demi-heure, et le DIT RunRow — suivre un run coûte, et ça s’arrête @cap:suivre-execution/ecran ne demande rien quand l’onglet est caché RunsList — la colonne des coûts @cap:suivre-execution/ecran un coût sous le centime met TOUTE la colonne à quatre décimales RunsList — la colonne des coûts @cap:suivre-execution/ecran sans coût sous le centime, deux décimales pour toute la colonne la page de /logs porte le nom de sa case @cap:suivre-execution/ecran s’appelle comme la case du rail qui y mène la page de /logs porte le nom de sa case @cap:suivre-execution/ecran garde son nom À LUI sur l’onglet des logs de service la page de /logs porte le nom de sa case @cap:suivre-execution/ecran s’appelle encore « Runs » quand la lecture ÉCHOUE RunPage — l’ordre du tableau @cap:suivre-execution/ecran les blocs se suivent : demande, réponse, livraison, revue, preuve, activité RunPage — l’ordre du tableau @cap:suivre-execution/ecran la page s’ouvre EN HAUT : sa zone de défilement ne suit pas le bas RunPage — l’ordre du tableau @cap:suivre-execution/ecran le corps garde la largeur d’une page Nodal, et il est centré RunPage — l’ordre du tableau @cap:suivre-execution/ecran la zone de défilement ne pousse plus rien sur les côtés RunPage — l’ordre du tableau @cap:suivre-execution/ecran le récapitulatif de livraison ne propose pas d’ouvrir le run où l’on est déjà RunPage — l’ordre du tableau @cap:suivre-execution/ecran aucun lien vers le run parent ni vers un délégué : ils se lisent dans la chronologie RunPage — l’ordre du tableau @cap:suivre-execution/ecran l’en-tête porte l’agent, la routine, le modèle et les chiffres du run RunPage — l’ordre du tableau @cap:suivre-execution/ecran la réponse est SORTIE du fil : elle se lit sans rien déplier RunPage — l’ordre du tableau @cap:suivre-execution/ecran la revue d’un run d’automatisation le dit, sans prétendre à un verdict RunPage — l’ordre du tableau @cap:suivre-execution/ecran le verdict d’une relecture se montre ICI aussi, pas seulement depuis Code RunPage — l’ordre du tableau @cap:suivre-execution/ecran la page dit DE QUEL run il s’agit RunPage — l’ordre du tableau @cap:suivre-execution/ecran la preuve n’est jamais muette, même quand rien n’a tourné RunPage — l’ordre du tableau @cap:suivre-execution/ecran la chronologie est LÀ, sur un run terminé comme sur un autre RunPage — l’ordre du tableau @cap:suivre-execution/ecran la demande ne se lit pas deux fois : la chronologie ne la reprend pas RunPage — l’ordre du tableau @cap:suivre-execution/ecran une demande qui dit AUTRE CHOSE que la tâche reste dans la chronologie RunPage — un run qui court @cap:suivre-execution/ecran la chronologie est là aussi : on est venu le regarder travailler RunPage — un run qui court @cap:suivre-execution/ecran rien ne sort du fil tant qu’il court : pas de réponse, pas de durée inventée RunPage — arrêter un run @cap:suivre-execution/ecran porte le bouton Stop tant que le run court RunPage — arrêter un run @cap:suivre-execution/ecran ne le porte plus une fois le run terminé RunPage — la réponse est le résultat livré, pas l’annonce (#288) @cap:suivre-execution/ecran avec un résultat qui se lit comme une réponse, c’est lui qui se lit sous l’en-tête RunPage — la réponse est le résultat livré, pas l’annonce (#288) @cap:suivre-execution/ecran sans résultat, la dernière prose sort, comme avant run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran les sept cases sont là, dans l’ordre du détail Code run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran « — » veut dire ABSENT : un coût sans appel tarifé, une durée sans début run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran un vrai ZÉRO s’écrit 0 — un run qui n’a appelé aucun modèle n’est pas une donnée manquante run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran les valeurs connues sont formatées, coût compris run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran un coût de zéro dollar EST un coût — il ne devient pas « — » run-view — les sept chiffres de l’en-tête @cap:suivre-execution/ecran les fichiers se comptent sur les cartes du fil, sans les fichiers seulement lus run-view — d’où vient le run @cap:suivre-execution/ecran une automatisation dit sa routine run-view — d’où vient le run @cap:suivre-execution/ecran une automatisation sans nom de routine dit juste « scheduled » run-view — d’où vient le run @cap:suivre-execution/ecran un run délégué le dit — le nom de l’agent parent n’est pas dans ces données run-view — d’où vient le run @cap:suivre-execution/ecran sinon, le canal, avec les mots du fil run-view — d’où vient le run @cap:suivre-execution/ecran le modèle vient du premier tour qui en nomme un run-view — d’où vient le run @cap:suivre-execution/ecran l’état porte le mot du statut, et un statut inconnu s’écrit tel quel run-view — la demande retirée de la chronologie @cap:suivre-execution/ecran la demande qui répète la tâche quitte le fil — elle titre déjà la page run-view — la demande retirée de la chronologie @cap:suivre-execution/ecran les espaces et les retours à la ligne ne font pas une autre demande run-view — la demande retirée de la chronologie @cap:suivre-execution/ecran une demande qui dit AUTRE chose reste : la carte de tête ne la porte pas run-view — la demande retirée de la chronologie @cap:suivre-execution/ecran un fil sans demande n’est pas touché run-view — la réponse sortie du fil @cap:suivre-execution/ecran un item `answer` sort du fil, et le fil ne le montre plus run-view — la réponse sortie du fil @cap:suivre-execution/ecran sans item `answer`, c’est la DERNIÈRE prose du DERNIER tour qui sort run-view — la réponse sortie du fil @cap:suivre-execution/ecran un `result` qui se lit comme une réponse sort à la place de la prose run-view — la réponse sortie du fil @cap:suivre-execution/ecran SANS marque, un `result` en JSON est pour une machine : c’est la prose qui sort run-view — la réponse sortie du fil @cap:suivre-execution/ecran marqué prose, un `result` en JSON lisible sort quand même (#154) run-view — la réponse sortie du fil @cap:suivre-execution/ecran un run RELU n’a pas de réponse en haut : le bloc Review est sa réponse run-view — la réponse sortie du fil @cap:suivre-execution/ecran un run relu GARDE tout dans sa chronologie : la prose reste dans son tour run-view — la réponse sortie du fil @cap:suivre-execution/ecran sans verdict, la réponse sort comme avant run-view — la réponse sortie du fil @cap:suivre-execution/ecran un run relu qui a fini SANS un mot : son item `answer` quitte quand même le fil run-view — la réponse sortie du fil @cap:suivre-execution/ecran rien ne sort tant que le run court : sa dernière phrase est une étape run-view — la réponse sortie du fil @cap:suivre-execution/ecran #210 — un run relu, sa réponse et son bloc Review @cap:suivre-execution/ecran marqué relay, la réponse reste cachée : le bloc Review la porte déjà run-view — la réponse sortie du fil @cap:suivre-execution/ecran #210 — un run relu, sa réponse et son bloc Review @cap:suivre-execution/ecran marqué prose, un run de code relu GARDE sa phrase finale en haut run-view — la réponse sortie du fil @cap:suivre-execution/ecran #210 — un run relu, sa réponse et son bloc Review @cap:suivre-execution/ecran marqué relay, la réponse est cachée MÊME sans verdict enregistré run-view — la réponse sortie du fil @cap:suivre-execution/ecran #210 — un run relu, sa réponse et son bloc Review @cap:suivre-execution/ecran marqué relay, un item `answer` quitte le fil sans être affiché run-view — la réponse sortie du fil @cap:suivre-execution/ecran #210 — un run relu, sa réponse et son bloc Review @cap:suivre-execution/ecran SANS marque, la règle de 0.8.11 s’applique encore : un verdict cache la réponse run-view — la réponse sortie du fil @cap:suivre-execution/ecran rien ne sort d’un run qui a ÉCHOUÉ : la carte d’échec dit ce qui s’est passé run-view — la réponse sortie du fil @cap:suivre-execution/ecran le récapitulatif de livraison sort lui aussi, quand le fil en porte un run-view — le résumé de l’activité @cap:suivre-execution/ecran compte les blocs, les agents DISTINCTS, et la durée du run run-view — le résumé de l’activité @cap:suivre-execution/ecran un run qui court n’a pas de durée, et la ligne n’en invente pas ActivitySection @cap:suivre-execution/ecran montre la chronologie tout de suite, et rien ne la referme ReviewSection @cap:suivre-execution/ecran avec un verdict, un clic montre le constat, son fichier et sa ligne ReviewSection @cap:suivre-execution/ecran ouvert, le bloc porte le RAPPORT du relecteur, en toutes lettres ReviewSection @cap:suivre-execution/ecran un verdict sans rapport n’en invente pas ReviewSection @cap:suivre-execution/ecran sans verdict, la ligne le dit — et n’est pas un bouton Run budget, à l’écran @cap:suivre-execution/ecran dit ce que font les plafonds enregistrés, et « aucun » pour zéro Run budget, à l’écran @cap:suivre-execution/ecran Save envoie les deux nombres tapés, et la phrase suit Run budget, à l’écran @cap:suivre-execution/ecran une valeur hors des bornes est dite, et rien ne part Run budget, à l’écran @cap:suivre-execution/ecran un tiers voit les plafonds sans pouvoir les changer ConversationFeedView — le travail replié @cap:suivre-execution/ecran la réponse se lit sans déplier ; le travail du run n’est PAS dans la page ConversationFeedView — le travail replié @cap:suivre-execution/ecran un clic sur la ligne met le travail dans la page ConversationFeedView — le travail replié @cap:suivre-execution/ecran la densité « unfolded » ouvre le travail dès le premier rendu ConversationFeedView — le travail replié @cap:suivre-execution/ecran la densité « folded » le referme — le réglage décide, pas le composant ConversationFeedView — le geste qu’un échec appelle @cap:suivre-execution/ecran un geste nommé se dit en une phrase, sous l’échec ConversationFeedView — le geste qu’un échec appelle @cap:suivre-execution/ecran aucun geste, aucune phrase — l’échec reste seul ConversationFeedView — le geste qu’un échec appelle @cap:suivre-execution/ecran l’échec d’un DÉLÉGUÉ porte le même geste, dans le bloc de la délégation ConversationFeedView — le geste qu’un échec appelle @cap:suivre-execution/ecran un délégué SANS geste écrit reste muet, même si son code dit le refus (#193) runSummaryParts @cap:suivre-execution/ecran dit le run entier, dans l’ordre du tableau runSummaryParts @cap:suivre-execution/ecran accorde le singulier runSummaryParts @cap:suivre-execution/ecran ne dessine RIEN de ce qui vaut zéro — jamais « 0 tools » runSummaryParts @cap:suivre-execution/ecran ne dessine ni « $0 » ni tiret quand le coût et la durée manquent RunSummaryRow @cap:suivre-execution/ecran replié, le travail n’est PAS dans la page RunSummaryRow @cap:suivre-execution/ecran un clic met le travail dans la page, et la ligne change de mot RunSummaryRow @cap:suivre-execution/ecran la densité « unfolded » l’ouvre DÈS le premier rendu RunSummaryRow @cap:suivre-execution/ecran un run dont on ne sait RIEN garde sa ligne, sans nombre inventé StatusBar — the run budget in the cost panel (#442) @cap:suivre-execution/ecran names the ceilings the runner holds this run to StatusBar — the run budget in the cost panel (#442) @cap:suivre-execution/ecran says there is none when both are zero, and nothing on a view that is not a run le fil vu du serveur @cap:suivre-execution/ecran la pastille d’une carte d’envoi garde la couleur de son issue le fil vu du serveur @cap:suivre-execution/ecran un échec d’envoi garde sa pastille rouge le fil vu du serveur @cap:suivre-execution/ecran la pastille d’un fichier CRÉÉ sans identifiant d’appel reste verte Wait for the first word @cap:suivre-execution/ecran vide : la plateforme décide, et rien à enregistrer Wait for the first word @cap:suivre-execution/ecran des secondes partent telles quelles ; un champ vidé part en null Wait for the first word @cap:suivre-execution/ecran hors des bornes : dit, et rien ne part |
passed
cancelJobTree @cap:suivre-execution/moteur a head the reaper failed, whose delegate still runs: the delegate is cancelled, the head keeps its status cancelJobTree @cap:suivre-execution/moteur never reaches another workspace, even given one of its job ids migration 0117_agent_jobs_result_kind @cap:suivre-execution/moteur démarre un vrai Postgres et applique les VRAIES migrations 128 moremigration 0117_agent_jobs_result_kind @cap:suivre-execution/moteur result_kind existe, en texte NULLABLE et sans défaut migration 0117_agent_jobs_result_kind @cap:suivre-execution/moteur les deux marques du runner s’écrivent, et NULL reste NULL migration 0117_agent_jobs_result_kind @cap:suivre-execution/moteur un mot hors des deux marques est REFUSÉ, il ne s’écrit pas en silence migration 0135_job_claim_generation @cap:suivre-execution/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0135_job_claim_generation @cap:suivre-execution/moteur leaves agent_jobs.claim_generation a NOT NULL integer defaulting to 0 migration 0135_job_claim_generation @cap:suivre-execution/moteur adds approval_requests.execution_claim (integer) and execution_output (jsonb), both nullable migration 0135_job_claim_generation @cap:suivre-execution/moteur records the migration in the journal drizzle-kit actually reads migration 0116_job_failure_hint @cap:suivre-execution/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0116_job_failure_hint @cap:suivre-execution/moteur agent_jobs.failure_hint existe, en texte et nullable migration 0116_job_failure_hint @cap:suivre-execution/moteur aucune contrainte ne borne les valeurs — un geste inconnu de l’écran s’écrit quand même migration 0116_job_failure_hint @cap:suivre-execution/moteur le rattrapage de la migration touche les refus de fournisseur, et EUX SEULS migration 0126_run_budget @cap:suivre-execution/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0126_run_budget @cap:suivre-execution/moteur les défauts ne changent le comportement de personne migration 0126_run_budget @cap:suivre-execution/moteur accepte les bornes, et REFUSE ce qui est en dehors migration 0126_run_budget @cap:suivre-execution/moteur records the migration in the journal drizzle-kit actually reads a turn cut on the output-token cap is refused @cap:suivre-execution/moteur one-shot: refuses the cut turn, with its billed usage and the calls it held a turn cut on the output-token cap is refused @cap:suivre-execution/moteur streamed: refuses the cut turn the same way a turn cut on the output-token cap is refused @cap:suivre-execution/moteur a cut turn with no parsed tool call is refused too: its text is not a finished answer a turn cut on the output-token cap is refused @cap:suivre-execution/moteur the same calls with a normal finish are returned as before a turn cut on the output-token cap is refused @cap:suivre-execution/moteur a call that offers no tools is not a turn: a capped completion is returned a turn cut on the output-token cap is refused @cap:suivre-execution/moteur under failover the refusal propagates: the next link is never asked a caller that only inspects gets the cut response as is @cap:suivre-execution/moteur inspectOnly: one-shot and streamed return the response with its length finish a caller that only inspects gets the cut response as is @cap:suivre-execution/moteur the tool-call probe judges a well-formed call that hit the cap as well formed text-parsed tool calls keep a cut reply cut (#554) @cap:suivre-execution/moteur a reply stopped on the output cap keeps finishReason length text-parsed tool calls keep a cut reply cut (#554) @cap:suivre-execution/moteur a reply that finished normally becomes tool-calls, as before text-parsed tool calls keep a cut reply cut (#554) @cap:suivre-execution/moteur a reply recovered from its raw body keeps the length the body reported every agent_jobs write of run-scoped code goes through ownJobRow (#566) @cap:suivre-execution/moteur finds the writes it is about (the scan is not empty) every agent_jobs write of run-scoped code goes through ownJobRow (#566) @cap:suivre-execution/moteur no write bypasses ownJobRow outside the named allowlist every agent_jobs write of run-scoped code goes through ownJobRow (#566) @cap:suivre-execution/moteur every allowlist key is used (no stale exception) a chat reply cut on the output-token cap does not act @cap:suivre-execution/moteur streamed: launches no job, stores no reply, answers output_limit_reached a chat reply cut on the output-token cap does not act @cap:suivre-execution/moteur streamed: the same call with a normal finish launches the job, as before a chat reply cut on the output-token cap does not act @cap:suivre-execution/moteur one-shot: launches no job, stores no reply, answers output_limit_reached a chat reply cut on the output-token cap does not act @cap:suivre-execution/moteur one-shot: the same call with a normal finish launches the job, as before an escalation recheck cut on the output-token cap is abandoned @cap:suivre-execution/moteur streamed: the reply stands, stored, and the cut call launches no job an escalation recheck cut on the output-token cap is abandoned @cap:suivre-execution/moteur one-shot: the reply stands, stored, and the cut call launches no job the reply after a refused run_task, cut on the cap, fails the turn @cap:suivre-execution/moteur streamed: no second job, no stored reply, output_limit_reached the reply after a refused run_task, cut on the cap, fails the turn @cap:suivre-execution/moteur one-shot: no second job, no stored reply, output_limit_reached a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur streamed: a reply with 51 run_task calls launches no job and stores no reply a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur streamed: the escalation recheck with 51 calls is abandoned, the reply stands a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur streamed: control, a reply with exactly 50 calls launches its first run_task as before a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur one-shot: a reply with 51 run_task calls launches no job and stores no reply a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur one-shot: the escalation recheck with 51 calls is abandoned, the reply stands a chat turn over the per-turn tool-call budget does not act @cap:suivre-execution/moteur one-shot: control, a reply with exactly 50 calls launches its first run_task as before spawnCliTurn — budget d appels par tour d un runtime CLI @cap:suivre-execution/moteur Claude : le processus est tué à l ouverture du 51e appel, son effet et son résultat n arrivent jamais spawnCliTurn — budget d appels par tour d un runtime CLI @cap:suivre-execution/moteur Codex : le processus est tué à l item.started du 51e appel, son effet et son résultat n arrivent jamais spawnCliTurn — budget d appels par tour d un runtime CLI @cap:suivre-execution/moteur contrôle : au budget exact, la CLI n est pas tuée et l effet a lieu spawnCliTurn — budget d appels par tour d un runtime CLI @cap:suivre-execution/moteur Codex, un seul paquet : le résultat du 50e appel (ouvert avant le cap) arrive, rien du 51e ni de la fin du tour spawnCliTurn — budget d appels par tour d un runtime CLI @cap:suivre-execution/moteur Claude, un seul paquet et des appels parallèles : les appels admis du lot ont leur résultat, pas le 51e runtime CLI : l appel admis qui finit après le cap garde sa ligne d audit @cap:suivre-execution/moteur le 50e appel, ouvert avant le cap et fini après, a sa ligne tool_calls ; le 51e n en a aucune curator — a failed pass is counted as failed, never as run @cap:suivre-execution/moteur a memory pass refused on the output cap: failed 1, ran 0, no memory changed, entity stamped curator — a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur 51 archive_skill calls in one turn: the pass is refused, the skill stays active executeJob un job annulé s’arrête AVANT son prochain appel d’outil, et n’écrit plus rien @cap:suivre-execution/moteur a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur 51 side-effect and read calls (serial path): nothing written, job failed with the code a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur 51 reads (parallel pre-pass path): none of them runs a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur the incident shape, 307 calls with a delegation among them: no child job, nothing written a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur a turn of exactly 50 calls is admitted and runs incident 2026-09-28 replayed: the real 307-call turn runs none of its calls (#564) @cap:suivre-execution/moteur no tool_calls row, nothing sent on Telegram, no child job, the exact code on the job row reliability guards #442: a run past its hours stops before the next call, and says why @cap:suivre-execution/moteur failJob écrit le geste décidé @cap:suivre-execution/moteur le geste décidé est écrit sur la ligne, à côté du code d’erreur failJob écrit le geste décidé @cap:suivre-execution/moteur un échec qui n’appelle aucun geste laisse la colonne vide failJob écrit le geste décidé @cap:suivre-execution/moteur la course perdue n’écrit aucun geste sur une ligne déjà terminale a job turn cut on the output-token cap does not act @cap:suivre-execution/moteur executes none of its tool calls and fails with output_limit_reached a job turn cut on the output-token cap does not act @cap:suivre-execution/moteur the same calls with a normal finish are executed as before la marque de provenance du résultat @cap:suivre-execution/moteur le texte final de l’agent est marqué prose la marque de provenance du résultat @cap:suivre-execution/moteur un texte final qui ressemble à du JSON est marqué prose, pas autre chose la marque de provenance du résultat @cap:suivre-execution/moteur le dernier texte de l’agent, repris faute d’outil de livraison, est marqué prose la marque de provenance du résultat @cap:suivre-execution/moteur les résultats des enfants, recompilés, sont marqués relay la marque de provenance du résultat @cap:suivre-execution/moteur les tâches d’un root, compilées par le cron, sont marquées relay la marque de provenance du résultat @cap:suivre-execution/moteur un root annulé garde la compilation de ses tâches, marquée relay la marque de provenance du résultat @cap:suivre-execution/moteur un résultat vide ne touche pas la marque déjà posée par l’outil de livraison la marque de provenance du résultat @cap:suivre-execution/moteur un job terminé sans marque garde NULL, et n’en reçoit pas une par défaut la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur Stop pendant l’appel A : l’appel B du même tour ne tourne pas, le job finit `cancelled` la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur fauché pendant l’appel A : B ne tourne pas, et `failed` / runner_restarted reste la ligne la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur repris par un AUTRE run pendant A (`pending` puis nouvelle prise) : B ne tourne pas, rien n’est réécrit la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur pré-passe parallèle : annulé pendant la première vague, la seconde ne part pas la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur délégation annulé pendant A, la délégation demandée dans le même tour n’est jamais créée la ligne du job fait autorité avant chaque effet (#566) @cap:suivre-execution/moteur délégation le run REPRIS après la délégation (nouvelle prise) : fauché pendant A, B ne tourne pas aucune écriture du run hors de sa prise (#566, revue Codex passe 1) @cap:suivre-execution/moteur fauché pendant la porte d’approbation : la ligne reste `failed`, jamais `awaiting_approval` aucune écriture du run hors de sa prise (#566, revue Codex passe 1) @cap:suivre-execution/moteur annulé pendant la porte d’approbation : la ligne reste `cancelled`, la transcription est gardée aucune écriture du run hors de sa prise (#566, revue Codex passe 1) @cap:suivre-execution/moteur re-suspension à la reprise (une demande encore en attente) après un fauchage : `failed` reste aucune écriture du run hors de sa prise (#566, revue Codex passe 1) @cap:suivre-execution/moteur repris par un autre run pendant le dernier appel du tour : le point de reprise n’écrase pas sa transcription une ligne illisible pendant l’appel au modèle arrête le run (#566) @cap:suivre-execution/moteur cinq lectures ratées d’affilée : l’appel est coupé, le job échoue `job_row_unreadable` the system prompt written during preparation carries the run’s claim (#566) @cap:suivre-execution/moteur re-claimed during preparation: the other run’s system prompt stands, this run stops readJobAuthority (#566) @cap:suivre-execution/moteur à soi tant que `processing` sous sa prise ; perdu sur tout autre statut ou une autre prise loadTaskLedger @cap:suivre-execution/moteur returns an empty map for an empty/null id list loadTaskLedger @cap:suivre-execution/moteur returns nothing for a root job with no delegated tasks loadTaskLedger @cap:suivre-execution/moteur surfaces the CHILD job tools_used, not the parent prose loadTaskLedger @cap:suivre-execution/moteur collapses repeated tool calls to a ×N count loadTaskLedger @cap:suivre-execution/moteur does NOT surface a still-running (todo/in_progress) task loadTaskLedger @cap:suivre-execution/moteur does NOT surface a voluntarily cancelled task loadTaskLedger @cap:suivre-execution/moteur renders a blocked task as a failure line with the error text loadTaskLedger @cap:suivre-execution/moteur truncates a long result to ~200 chars loadTaskLedger @cap:suivre-execution/moteur bounds to MAX_TASKS_PER_EXCHANGE most recent, in chronological order loadTaskLedger @cap:suivre-execution/moteur separates ledgers by root job id — no cross-exchange leakage loadTaskLedger @cap:suivre-execution/moteur formatTaskLedgerLines maps a full entry list to formatted lines reflection — a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur 51 update_skill calls in one turn: the pass is refused, the skill is untouched runMemoryCuration — a turn over the per-turn tool-call budget runs none of its calls (#564) @cap:suivre-execution/moteur 51 archive_memory calls in one turn: the pass is refused, the fact stays live a tool of a run that lost its job writes nothing on the job row (#566) @cap:suivre-execution/moteur dashboard_publish: refused with job_row_not_held, B’s result and updated_at intact a tool of a run that lost its job writes nothing on the job row (#566) @cap:suivre-execution/moteur dashboard_publish under the run’s own claim still publishes a tool of a run that lost its job writes nothing on the job row (#566) @cap:suivre-execution/moteur the verification intent’s skipped-surface trace: nothing written on B’s row a tool of a run that lost its job writes nothing on the job row (#566) @cap:suivre-execution/moteur the same trace under the run’s own claim is written dashboard_publish — le texte et sa provenance @cap:suivre-execution/moteur publie le texte de l’agent dans le résultat du job dashboard_publish — le texte et sa provenance @cap:suivre-execution/moteur marque cette publication comme la PROSE de l’agent, quelle que soit sa forme listActivityRunsAction @cap:suivre-execution/moteur rend UNE ligne par run, avec le nombre de ses appels (outils ET modèles) listActivityRunsAction @cap:suivre-execution/moteur dit d’où vient la demande, lu sur le canal et la provenance listActivityRunsAction @cap:suivre-execution/moteur ne charge AUCUN appel avec la liste listActivityRunsAction @cap:suivre-execution/moteur pagine des RUNS : une page de 2 ne rend que deux runs, la suivante le troisième listActivityRunsAction @cap:suivre-execution/moteur le filtre par outil garde les RUNS qui ont appelé cet outil, une fois chacun listRunCallsAction @cap:suivre-execution/moteur rend les appels d’UN run, outils et modèles ENTRELACÉS dans l’ordre du temps listRunCallsAction @cap:suivre-execution/moteur à date ÉGALE, l’id tranche : l’ordre ne change pas d’un chargement à l’autre listRunCallsAction @cap:suivre-execution/moteur ne rend que les appels de CE run listRunCallsAction @cap:suivre-execution/moteur pagine DANS un run : 50 appels, puis les dix suivants listRunCallsAction @cap:suivre-execution/moteur #150 : la CARTE, l’entrée et la sortie d’un appel sont masquées ici aussi listRunCallsAction @cap:suivre-execution/moteur refuse un run qui n’est pas de cette entité le fil d’une conversation masque ses lignes d’audit @cap:suivre-execution/moteur la clé n’atteint ni la sortie brute, ni l’entrée, ni la carte récapitulatif de livraison — un chemin masqué n’efface pas un fichier @cap:suivre-execution/moteur compte DEUX fichiers dont les chemins ne diffèrent que par un jeton, et les montre masqués récapitulatif de livraison — un chemin masqué n’efface pas un fichier @cap:suivre-execution/moteur AUCUN chemin brut n’arrive dans la liste affichée récapitulatif de livraison — un chemin masqué n’efface pas un fichier @cap:suivre-execution/moteur le MÊME fichier écrit deux fois compte une seule fois, jeton ou pas récapitulatif de livraison — un chemin masqué n’efface pas un fichier @cap:suivre-execution/moteur une ligne SANS chemins bruts garde l’ancienne identité : le chemin présenté le fil d’un travail masque ses lignes d’outils @cap:suivre-execution/moteur la clé n’atteint ni l’entrée, ni la sortie brute, ni la carte le fil d’un travail masque ses lignes d’outils @cap:suivre-execution/moteur la ligne STOCKÉE reste intacte — le runner la relit pour reprendre redactPresented @cap:suivre-execution/moteur masque une chaîne SECRÈTE à toute profondeur et rend la structure intacte redactPresented @cap:suivre-execution/moteur laisse passer ce qui n’est pas une chaîne, et une charge absente redactPresented @cap:suivre-execution/moteur ne masque pas les NOMS de champs : un champ nommé comme un jeton reste lisible redactAuditRow @cap:suivre-execution/moteur masque la sortie brute, l’entrée et la carte de la même ligne redactAuditRow @cap:suivre-execution/moteur une ligne sans sortie garde son absence de sortie canStopRun — ce qui est encore arrêtable @cap:suivre-execution/moteur vit dans un module que le serveur peut lire canStopRun — ce qui est encore arrêtable @cap:suivre-execution/moteur accepte les quatre statuts vivants et refuse tout le reste |
| Resume a conversation required Can I come back tomorrow and pick up where we left off? screen passed · engine passed
|
passed
B — remonter dans l’historique tient : on n’est pas ramené en bas @cap:reprendre-conversation/ecran le groupe de dossiers @cap:reprendre-conversation/ecran rend une ligne par dossier, et AUCUNE ne navigue le groupe de dossiers @cap:reprendre-conversation/ecran ne rend AUCUNE ligne pour un canal sans conversation 76 morele groupe de dossiers @cap:reprendre-conversation/ecran rend la ligne MCP dès qu’un run est venu de dehors, et la met en DERNIER le groupe de dossiers @cap:reprendre-conversation/ecran ne rend AUCUNE ligne MCP tant qu’aucun run n’est venu de dehors le groupe de dossiers @cap:reprendre-conversation/ecran N’ÉCRIT AUCUN NOMBRE sur un dossier de CANAL le groupe de dossiers @cap:reprendre-conversation/ecran n’écrit rien non plus quand il en attend BEAUCOUP dans un canal le groupe de dossiers @cap:reprendre-conversation/ecran n’en écrit pas davantage sur MCP, qui est un endroit d’où arrive du travail le groupe de dossiers @cap:reprendre-conversation/ecran écrit le nombre sur « NODAL CHATS », le seul dossier qui le garde le groupe de dossiers @cap:reprendre-conversation/ecran compte un LIVRABLE À VÉRIFIER dans la même pastille qu’une approbation le groupe de dossiers @cap:reprendre-conversation/ecran ne rend PAS de pastille à zéro — pas même un « 0 » le groupe de dossiers @cap:reprendre-conversation/ecran plafonne la pastille à « 9+ » au-delà de neuf le groupe de dossiers @cap:reprendre-conversation/ecran allume le point d’un dossier où un run tourne, SANS y écrire de nombre le groupe de dossiers @cap:reprendre-conversation/ecran marque le dossier ouvert, et lui seul le groupe de dossiers @cap:reprendre-conversation/ecran hors de /chat, aucun dossier n’est marqué — seule l’URL en désigne un le compte porté par le lien « Chat » @cap:reprendre-conversation/ecran affiche le total des attentes des dossiers les derniers fils d’un dossier @cap:reprendre-conversation/ecran ne montre RIEN d’un CANAL tant que personne ne l’a déplié les derniers fils d’un dossier @cap:reprendre-conversation/ecran OUVRE « Nodal chats » au chargement, et lui SEUL les derniers fils d’un dossier @cap:reprendre-conversation/ecran déplie CINQ fils, dans l’ordre de la liste, chacun vers son fil les derniers fils d’un dossier @cap:reprendre-conversation/ecran un RUN du dossier MCP s’allume sur sa page, et n’a pas le menu d’un fil les derniers fils d’un dossier @cap:reprendre-conversation/ecran ferme le sous-menu par « See all », vers la liste du dossier les derniers fils d’un dossier @cap:reprendre-conversation/ecran replie ce qu’on vient de déplier les derniers fils d’un dossier @cap:reprendre-conversation/ecran ne lit qu’UNE fois pour TOUS les dossiers les derniers fils d’un dossier @cap:reprendre-conversation/ecran dit qu’un dossier est vide, plutôt que de le laisser muet les derniers fils d’un dossier @cap:reprendre-conversation/ecran DIT qu’il n’a pas pu lire, au lieu d’afficher un dossier vide la ligne d’un dossier PLIE, elle ne mène nulle part @cap:reprendre-conversation/ecran déplie au clic sur le libellé, sans naviguer la ligne d’un dossier PLIE, elle ne mène nulle part @cap:reprendre-conversation/ecran laisse « See all » être le SEUL chemin vers la liste du dossier la ligne d’un dossier PLIE, elle ne mène nulle part @cap:reprendre-conversation/ecran donne à « See all » une flèche vers la droite le point d’un fil @cap:reprendre-conversation/ecran est ROUGE quand une demande ATTEND, et rien d’autre n’est rouge le point d’un fil @cap:reprendre-conversation/ecran prend la couleur de l’ACTIVITÉ sur un fil NON LU, et ne BAT pas le point d’un fil @cap:reprendre-conversation/ecran pose le point DEVANT le titre, dans la colonne de l’icône du dossier le sous-menu se relit @cap:reprendre-conversation/ecran éteint le point du fil qu’on OUVRE, sans rechargement le sous-menu se relit @cap:reprendre-conversation/ecran allume le point d’un fil qui REÇOIT, sur la cadence de la barre la relecture du sous-menu s’arrête @cap:reprendre-conversation/ecran laisse tomber une réponse PÉRIMÉE, arrivée après une plus récente la relecture du sous-menu s’arrête @cap:reprendre-conversation/ecran s’ARRÊTE quand on replie tout, et repart frais au dépliage suivant le point d’une ligne du panneau @cap:reprendre-conversation/ecran est ROUGE sur un espace de travail qui a du non-lu, GRIS sinon le point d’une ligne du panneau @cap:reprendre-conversation/ecran en met un d’ACTIVITÉ sur les agents, et aucun sur les automatisations le point d’une ligne du panneau @cap:reprendre-conversation/ecran est ROUGE sur une demande en attente, GRIS sur une décision rendue le point d’une ligne du panneau @cap:reprendre-conversation/ecran garde le point ROUGE sur une demande en attente le point d’une ligne du panneau @cap:reprendre-conversation/ecran ne lit PAS les approbations en attente une seconde fois le panneau Work @cap:reprendre-conversation/ecran liste les espaces de travail SANS dossier à déplier le panneau Work @cap:reprendre-conversation/ecran garde « See all » sous le plafond, mais JAMAIS sur une section vide le panneau Work @cap:reprendre-conversation/ecran DÉPLIE « Nodal chats » au chargement, et laisse les canaux pliés le panneau Work @cap:reprendre-conversation/ecran n’affiche un canal que lorsqu’il est branché folderThreads @cap:reprendre-conversation/ecran garde les ONZE premiers fils d’un dossier, et pas le douzième folderThreads @cap:reprendre-conversation/ecran ne promet PAS d’autres fils quand il n’y en a pas folderThreads @cap:reprendre-conversation/ecran garde l’ORDRE de la liste, qui est celui de la lecture folderThreads @cap:reprendre-conversation/ecran range chaque fil sous SON dossier, même mêlés folderThreads @cap:reprendre-conversation/ecran ne fabrique AUCUN dossier pour qui n’a pas de fil folderThreads @cap:reprendre-conversation/ecran transporte l’état de chaque fil, sans y toucher threadCallsFor @cap:reprendre-conversation/ecran appelle la personne dès qu’une demande attend, ou qu’un run tourne threadCallsFor @cap:reprendre-conversation/ecran appelle la personne sur un fil NON LU, même au repos (#209) threadCallsFor @cap:reprendre-conversation/ecran se tait quand il n’y a ni demande, ni run, ni non-lu la ligne d’une conversation @cap:reprendre-conversation/ecran mène au fil, et porte son identifiant pour qu’on la retrouve la ligne d’une conversation @cap:reprendre-conversation/ecran dit l’agent, le nom du chat et le dernier mot la ligne d’une conversation @cap:reprendre-conversation/ecran montre la VRAIE image de l’agent quand il en a une la ligne d’une conversation @cap:reprendre-conversation/ecran sans aperçu, aucune seconde ligne — et sans heure, aucune heure la ligne d’une conversation @cap:reprendre-conversation/ecran une question demandée s’écrit, et rien d’autre ne s’allume la ligne d’une conversation @cap:reprendre-conversation/ecran une approbation en attente s’écrit sur fond d’alerte la ligne d’une conversation @cap:reprendre-conversation/ecran un run qui tourne : un POINT, jamais un nombre la ligne d’une conversation @cap:reprendre-conversation/ecran au repos, la ligne ne porte AUCUN signe la ligne d’une conversation @cap:reprendre-conversation/ecran sans fil désigné, pas de lien — et la ligne le DIT la ligne d’une conversation @cap:reprendre-conversation/ecran la géométrie de la planche : 56 px, gouttière 14, marges 0/16 une ligne NON LUE @cap:reprendre-conversation/ecran écrit son titre plus gras que celui d’une ligne lue, à la même taille une ligne NON LUE @cap:reprendre-conversation/ecran porte le poids sur le NOM DE L’AGENT quand la ligne en montre un une ligne NON LUE @cap:reprendre-conversation/ecran ne dessine AUCUN mot « Unread », ni pastille de plus une ligne NON LUE @cap:reprendre-conversation/ecran laisse les trois signes dire ce qu’ils disent, non lue ou non la ligne SANS agent : le dossier « Nodal chats » @cap:reprendre-conversation/ecran ni avatar ni nom d’agent — le titre est la ligne la ligne SANS agent : le dossier « Nodal chats » @cap:reprendre-conversation/ecran le titre porte la graisse et la couleur de la ligne principale la ligne SANS agent : le dossier « Nodal chats » @cap:reprendre-conversation/ecran le signe de ce qui s’y passe ne bouge pas, lui la ligne SANS agent : le dossier « Nodal chats » @cap:reprendre-conversation/ecran sans fil désigné, elle le dit aussi le dossier « Nodal chats » : sa barre d’actions @cap:reprendre-conversation/ecran « New conversation » MÈNE à l’écran vide, et n’écrit RIEN (#248) le dossier « Nodal chats » : sa barre d’actions @cap:reprendre-conversation/ecran le lien est là MÊME quand le dossier est vide — c’est là qu’il sert le dossier « Nodal chats » : sa barre d’actions @cap:reprendre-conversation/ecran le dossier ne parle plus du ROOT : c’est l’écran d’arrivée qui le dit le dossier « Nodal chats » : sa barre d’actions @cap:reprendre-conversation/ecran la recherche filtre sur le TITRE le dossier « Nodal chats » : supprimer @cap:reprendre-conversation/ecran « Select » fait apparaître les cases, une par ligne le dossier « Nodal chats » : supprimer @cap:reprendre-conversation/ecran « Delete » DEMANDE, et ne supprime qu’après confirmation le dossier « Nodal chats » : supprimer @cap:reprendre-conversation/ecran « Cancel » sort du mode et décoche tout un dossier de CANAL n’a pas cette barre @cap:reprendre-conversation/ecran la vue d’un canal ne rend pas la liste qui la porte |
passed
migration 0112_conversation_reads @cap:reprendre-conversation/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0112_conversation_reads @cap:reprendre-conversation/moteur conversation_reads existe, et sa clé primaire est (user_id, conversation_id) migration 0112_conversation_reads @cap:reprendre-conversation/moteur un second marqueur de la même personne AVANCE le premier, il ne s’empile pas 138 moremigration 0112_conversation_reads @cap:reprendre-conversation/moteur le fil supprimé emporte ses marqueurs migration 0112_conversation_reads @cap:reprendre-conversation/moteur la personne supprimée emporte ses marqueurs executeJob a parent failed by failJob: its children compiled into result never reach the next turn as the agent reply (#562) @cap:reprendre-conversation/moteur runner_notes has one writer @cap:reprendre-conversation/moteur normalizes each line exactly as result is normalized runner_notes has one writer @cap:reprendre-conversation/moteur every value written to runnerNotes comes from runnerNotesValue loadThreadHistory @cap:reprendre-conversation/moteur returns [] when there are no prior jobs in the thread loadThreadHistory @cap:reprendre-conversation/moteur returns [] for non-conversational channels (api, cron, etc.) loadThreadHistory @cap:reprendre-conversation/moteur includes a FAILED job that delivered a user-facing reply (ask-and-wait continuity) loadThreadHistory @cap:reprendre-conversation/moteur still skips a FAILED job with no user-facing result (silent internal failure) loadThreadHistory @cap:reprendre-conversation/moteur returns 6 ModelMessages in chronological order for 3 prior completed jobs loadThreadHistory @cap:reprendre-conversation/moteur skips jobs with null result (hard fails — runner crash, LLM down) loadThreadHistory @cap:reprendre-conversation/moteur excludes the current job from history loadThreadHistory @cap:reprendre-conversation/moteur truncates a long message keeping BOTH head and tail (the conclusion survives) loadThreadHistory @cap:reprendre-conversation/moteur drops oldest pairs when the total char budget is exceeded — never an assistant orphan loadThreadHistory @cap:reprendre-conversation/moteur extracts the assistant reply from telegram_send_message when result is null loadThreadHistory @cap:reprendre-conversation/moteur concatenates multiple telegram_send_message tool calls with a double newline loadThreadHistory @cap:reprendre-conversation/moteur falls back to the last assistant text content when no send-message tool call is present loadThreadHistory @cap:reprendre-conversation/moteur prefers result over the messages fallback when result is non-empty loadThreadHistory @cap:reprendre-conversation/moteur isolates threads by chat_id — other chats do not leak in loadThreadHistory @cap:reprendre-conversation/moteur WhatsApp relit ses tours précédents, en forme TEXTE à deux messages loadThreadHistory @cap:reprendre-conversation/moteur relit un tour vieux de TROIS JOURS quand il est dans la même conversation loadThreadHistory @cap:reprendre-conversation/moteur un tour d'une AUTRE conversation du même chat_id n'est pas relu loadThreadHistory @cap:reprendre-conversation/moteur un job ENFANT de la conversation n'est pas un tour loadThreadHistory @cap:reprendre-conversation/moteur neuf tours dans la conversation : les HUIT plus récents sont relus (MAX_TURNS) loadThreadHistory @cap:reprendre-conversation/moteur emits a 3-message tool-call block for telegram (user → assistant tool-call → tool-result) loadThreadHistory @cap:reprendre-conversation/moteur ignores tool-calls from injected history when extracting a prior job reply loadThreadHistory @cap:reprendre-conversation/moteur appends an action ledger line when the prior job used a state-changing tool loadThreadHistory @cap:reprendre-conversation/moteur does NOT append a ledger line when the prior job only used send tools loadThreadHistory @cap:reprendre-conversation/moteur does NOT append a ledger line when tools_used is null/empty loadThreadHistory @cap:reprendre-conversation/moteur surfaces a delegated task-board child's REAL tool calls, not the parent's prose loadThreadHistory @cap:reprendre-conversation/moteur does NOT surface a delegated task that has not finished yet loadThreadHistory @cap:reprendre-conversation/moteur bounds the delegated-task ledger to 3 entries per exchange loadThreadHistory @cap:reprendre-conversation/moteur combines the state-changing ledger AND the delegated-task ledger on the same exchange loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur on telegram (tool-call shape): no assistant part carries a ledger line, the runner record does loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur on whatsapp (text shape): no assistant part carries a ledger line, the runner record does loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur a relay result (children recompiled by the runner) is never replayed as what the agent sent loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur keeps a prose result as the agent reply (its own words) loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur what the model reads of a record is the runner mark and the entries, no runner prose (#576, P2 c) loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur a failure explanation the runner recorded as its own (runner_notes) is the runner’s, not the agent reply loadThreadHistory — runner-written lines are attributed to the runner (#562) @cap:reprendre-conversation/moteur result_kind NULL is UNKNOWN provenance: a completed job from before 0117 keeps its result as the agent reply (#576, pass 2) runner_notes is written DB-safe by every producer @cap:reprendre-conversation/moteur starts a real Postgres and applies the REAL migrations runner_notes is written DB-safe by every producer @cap:reprendre-conversation/moteur the declared-deliverable door and failJob land, with the normalized line in runner_notes migration 0137 fills runner_notes on rows written before it @cap:reprendre-conversation/moteur starts a real Postgres and applies the REAL migrations migration 0137 fills runner_notes on rows written before it @cap:reprendre-conversation/moteur a pre-0137 notice goes to the runner record on replay, the agent keeps its words migration 0137 fills runner_notes on rows written before it @cap:reprendre-conversation/moteur multi-line producer output is caught whole: a stderr tail, an error code with a detail l’attente d’un délégué dit le canal de sa conversation @cap:reprendre-conversation/moteur rend le canal du fil sur la demande du délégué, et `null` sur celle sans fil l’attente d’un délégué dit le canal de sa conversation @cap:reprendre-conversation/moteur rend toujours le canal du job à côté — il reste la règle sans conversation le dossier compte ce que sa ligne affiche @cap:reprendre-conversation/moteur allume la pastille du dossier Telegram pour la question d’un délégué le dossier compte ce que sa ligne affiche @cap:reprendre-conversation/moteur fait porter au lien « Channels » le même chiffre que la pastille le dossier compte ce que sa ligne affiche @cap:reprendre-conversation/moteur ne compte pas dans un dossier ce que sa liste ne montre pas : l’accueil reste dehors le dossier compte ce que sa ligne affiche @cap:reprendre-conversation/moteur pose la MÊME pastille sur la ligne de la conversation le dossier compte ce que sa ligne affiche @cap:reprendre-conversation/moteur allume le point vert du dossier pour un délégué qui TOURNE sur le fil l'attente porte d'où elle vient @cap:reprendre-conversation/moteur rend le canal du job sur chaque approbation en attente les dossiers lus en base @cap:reprendre-conversation/moteur ne rend que les canaux qui portent une conversation listable les dossiers lus en base @cap:reprendre-conversation/moteur compte par dossier les runs qui TOURNENT, sans ceux qui attendent la personne les dossiers lus en base @cap:reprendre-conversation/moteur dit sur QUELLES conversations un run tourne — et seulement celles-là les dossiers lus en base @cap:reprendre-conversation/moteur ne compte plus les runs vivants : la case Logs n’a plus de point les dossiers lus en base @cap:reprendre-conversation/moteur ne met dans AUCUN COMPTE ce qui tourne hors d’une conversation de Work les dossiers lus en base @cap:reprendre-conversation/moteur ne compte pour Work que les conversations que la section peut lister l’attente dit SA conversation @cap:reprendre-conversation/moteur rend la conversation du job sur chaque approbation en attente l’attente dit SA conversation @cap:reprendre-conversation/moteur rend le `kind` de la demande, lu sur la colonne l'attribution d'une attente à son dossier @cap:reprendre-conversation/moteur range une demande sur son canal, et pas ailleurs l'attribution d'une attente à son dossier @cap:reprendre-conversation/moteur range une demande du dashboard dans « Nodal chats », jamais dans un canal l'attribution d'une attente à son dossier @cap:reprendre-conversation/moteur ne range PAS une demande d’un run programmé : une automation n’est pas un dialogue l'attribution d'une attente à son dossier @cap:reprendre-conversation/moteur ne range dans AUCUN dossier ce qui ne vient d’aucun d’eux l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur range dans le dossier du canal de la conversation, pas dans celui du job l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur fait compter au total du menu exactement ce que la pastille affiche l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur ouvre le dossier du canal de la conversation même sans conversation lue l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur retombe sur le canal du job quand le travail n’a pas de conversation l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur suit la conversation même quand le job a un canal de dossier, lui aussi l'attente suit le canal de SA CONVERSATION @cap:reprendre-conversation/moteur ne range nulle part un travail dont la conversation n’a aucun dossier les dossiers qui existent @cap:reprendre-conversation/moteur donne un dossier à chaque canal qui porte des conversations : Nodal chats en tête, puis l’ordre de la maquette les dossiers qui existent @cap:reprendre-conversation/moteur n’invente pas de dossier pour un canal sans conversation les dossiers qui existent @cap:reprendre-conversation/moteur montre quand même le dossier d’un canal qui porte une attente sans conversation lue les dossiers qui existent @cap:reprendre-conversation/moteur garde « Nodal chats » même vide — c’est une destination, pas un contenu les dossiers qui existent @cap:reprendre-conversation/moteur nomme et lie chaque dossier le point vert, et ce qu’il ne compte pas @cap:reprendre-conversation/moteur s’allume là où un run tourne, et nulle part ailleurs le point vert, et ce qu’il ne compte pas @cap:reprendre-conversation/moteur ne fait JAMAIS monter la pastille : un run n’attend pas la personne le point vert, et ce qu’il ne compte pas @cap:reprendre-conversation/moteur reste éteint à zéro run le point vert, et ce qu’il ne compte pas @cap:reprendre-conversation/moteur compte comme « en cours » tout statut vivant SAUF l’attente d’approbation le dossier ouvert @cap:reprendre-conversation/moteur s’allume sur le `folder=` de l’URL le dossier ouvert @cap:reprendre-conversation/moteur n’allume rien sur un fil ouvert — son URL ne dit pas d’où il vient le dossier ouvert @cap:reprendre-conversation/moteur n’allume AUCUN dossier sur la page des runs programmés : Scheduled a son propre lien le compte du lien « Chat » @cap:reprendre-conversation/moteur vaut exactement la somme des pastilles rendues en dessous le compte du lien « Chat » @cap:reprendre-conversation/moteur ne compte pas ce qui n’est dans aucun dossier le compte du lien « Chat » @cap:reprendre-conversation/moteur vaut zéro quand rien n’attend — le lien ne porte alors aucun chiffre threadDotTone @cap:reprendre-conversation/moteur garde le ROUGE pour ce qui attend une réponse, et pour cela seul threadDotTone @cap:reprendre-conversation/moteur fait parler L’ATTENTE la première quand les deux sont vrais threadDotTone @cap:reprendre-conversation/moteur se tait quand rien ne se passe threadDotTone @cap:reprendre-conversation/moteur ne dit jamais autre chose que ce que `threadCallsFor` annonce ouvrir un fil pose son marqueur @cap:reprendre-conversation/moteur écrit le marqueur de CETTE personne sur CE fil, et sur aucun autre ouvrir un fil pose son marqueur @cap:reprendre-conversation/moteur rouvrir AVANCE le marqueur au lieu d’en empiler un second ouvrir un fil pose son marqueur @cap:reprendre-conversation/moteur un fil qui n’appartient pas à l’entité ne laisse AUCUNE trace de lecture ce que « non lu » veut dire @cap:reprendre-conversation/moteur un fil JAMAIS ouvert est non lu ce que « non lu » veut dire @cap:reprendre-conversation/moteur un fil ouvert APRÈS sa dernière activité est lu ce que « non lu » veut dire @cap:reprendre-conversation/moteur un fil qui REPART après l’ouverture redevient non lu ce que « non lu » veut dire @cap:reprendre-conversation/moteur le marqueur d’une AUTRE personne ne rend rien lu le non-lu ne coûte AUCUNE requête par fil @cap:reprendre-conversation/moteur répond pour DOUZE fils avec exactement le même nombre de requêtes que pour deux la lecture du sous-menu @cap:reprendre-conversation/moteur ne rend que CINQ chats par canal, les plus récents, sur une base qui en porte douze la lecture du sous-menu @cap:reprendre-conversation/moteur ne rend que CINQ conversations de « Nodal chats », avec leur titre la lecture du sous-menu @cap:reprendre-conversation/moteur rend AUTANT de lignes qu’on lui en demande, et pas plus la borne est dans le SQL ÉMIS @cap:reprendre-conversation/moteur classe les chats DANS leur canal et coupe la fenêtre en base la borne est dans le SQL ÉMIS @cap:reprendre-conversation/moteur DEMANDE son ordre, au lieu de le tenir du plan d’exécution la borne est dans le SQL ÉMIS @cap:reprendre-conversation/moteur borne « Nodal chats » par un limit, et pas après coup un fil que personne n’a nommé @cap:reprendre-conversation/moteur s’appelle « Untitled », et le nom vient du chemin PARTAGÉ ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur pose l’attente sur SA conversation, et sur aucune autre ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur une question passe avant une approbation sur la MÊME conversation ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur une attente couvre le point vert : la ligne dit ce qui appelle la personne ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur une demande sans conversation ne se pose sur AUCUNE ligne ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur un `kind` inconnu ne devient pas une pastille au hasard ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur au repos, la ligne ne porte RIEN ce qui attend la personne, ligne par ligne @cap:reprendre-conversation/moteur le run qui tourne s’allume sur SA conversation la forme d’une ligne @cap:reprendre-conversation/moteur un chat de canal : l’agent, le nom du chat, le dernier mot, le lien la forme d’une ligne @cap:reprendre-conversation/moteur un salon Discord garde son croisillon, un groupe Telegram n’en prend pas la forme d’une ligne @cap:reprendre-conversation/moteur un chat sans fil courant désigné n’ouvre RIEN, plutôt qu’un lien deviné la forme d’une ligne @cap:reprendre-conversation/moteur une conversation de Nodal : SON TITRE, et ni agent ni dernier message la forme d’une ligne @cap:reprendre-conversation/moteur un chat de CANAL garde son agent et son dernier mot — seul Nodal chats change la forme d’une ligne @cap:reprendre-conversation/moteur un titre démesuré est borné, et le dit par ses points de suspension la forme d’une ligne @cap:reprendre-conversation/moteur un titre d’une ligne n’est PAS coupé — l’écran s’en charge la forme d’une ligne @cap:reprendre-conversation/moteur un fil que personne n’a nommé s’écrit « Untitled », jamais vide la forme d’une ligne @cap:reprendre-conversation/moteur sans dernier mot, la seconde ligne n’existe pas l’heure d’une ligne @cap:reprendre-conversation/moteur aujourd’hui : l’heure l’heure d’une ligne @cap:reprendre-conversation/moteur hier : le JOUR, même dix minutes plus tôt — le calendrier, pas 24 h l’heure d’une ligne @cap:reprendre-conversation/moteur six jours en arrière : encore le jour ; sept : la date l’heure d’une ligne @cap:reprendre-conversation/moteur une autre année porte son année ; l’année courante ne la porte pas l’heure d’une ligne @cap:reprendre-conversation/moteur sans date, RIEN — jamais un tiret qu’on lirait comme une valeur la vue d’un dossier @cap:reprendre-conversation/moteur sans `folder=`, montre TOUT, sous le titre de la page la vue d’un dossier @cap:reprendre-conversation/moteur sur un canal, ne montre QUE ce canal — pas les conversations de Nodal la vue d’un dossier @cap:reprendre-conversation/moteur sur « Nodal chats », ne montre QUE les conversations de Nodal la vue d’un dossier @cap:reprendre-conversation/moteur sur MCP, ne montre QUE les runs venus de dehors la vue d’un dossier @cap:reprendre-conversation/moteur ne montre de RUNS dans aucun autre dossier la vue d’un dossier @cap:reprendre-conversation/moteur sur un canal que la base ne connaît pas, redevient la page entière la vue d’un dossier @cap:reprendre-conversation/moteur sur un dossier que le menu ne propose pas, redevient la page entière la phrase sous le titre d’un dossier @cap:reprendre-conversation/moteur dit les trois chiffres quand les trois existent la phrase sous le titre d’un dossier @cap:reprendre-conversation/moteur accorde « conversation » au singulier la phrase sous le titre d’un dossier @cap:reprendre-conversation/moteur TAIT chaque chiffre nul plutôt que d’écrire zéro la phrase sous le titre d’un dossier @cap:reprendre-conversation/moteur ne dit RIEN quand tout est à zéro la phrase sous le titre d’un dossier @cap:reprendre-conversation/moteur nomme des RUNS dans le dossier MCP, jamais des conversations |
| Talk from elsewhere required Can I talk to it from Telegram rather than from the screen? screen passed · engine passed
|
passed
A — allowlist renders: owner badged, pending has Approve/Deny, member has Revoke @cap:parler-par-canal-externe/ecran le dossier MCP liste les runs venus de dehors @cap:parler-par-canal-externe/ecran affiche chaque run avec son titre, et mène à la page du run le dossier MCP liste les runs venus de dehors @cap:parler-par-canal-externe/ecran dit sur la ligne ce qui attend la personne, et ce qui tourne 18 morele dossier MCP liste les runs venus de dehors @cap:parler-par-canal-externe/ecran n’offre NI composition NI création — ce ne sont pas des conversations le dossier MCP liste les runs venus de dehors @cap:parler-par-canal-externe/ecran dit qu’il n’y a rien plutôt que de montrer une boîte vide la liste se charge page par page @cap:parler-par-canal-externe/ecran ne propose « Load more » que s’il reste quelque chose la liste se charge page par page @cap:parler-par-canal-externe/ecran demande la suite AVEC le curseur, et l’ajoute sous les lignes déjà là la liste se charge page par page @cap:parler-par-canal-externe/ecran ne double AUCUNE ligne quand la page suivante en renvoie une déjà là la liste se charge page par page @cap:parler-par-canal-externe/ecran DIT qu’une page n’a pas pu être lue, plutôt que de s’arrêter en silence sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran n’affiche aucune case tant qu’on n’est pas en sélection sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran « Delete » DEMANDE, et ne supprime qu’après confirmation sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran ne coche QUE les runs terminés, « Select all » compris sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran dit POURQUOI un run ne peut pas être coché sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran « Cancel » sort du mode et décoche tout sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran DIT ce que l’action a vraiment supprimé, pas ce qu’on avait coché sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran GARDE la ligne que l’action a refusée, et retire les autres sélectionner et supprimer des runs @cap:parler-par-canal-externe/ecran DIT quand la chaîne est trop profonde, et ne retire aucune ligne DeliveriesCard @cap:parler-par-canal-externe/ecran une ligne par envoi : son canal, son destinataire, son sort DeliveriesCard @cap:parler-par-canal-externe/ecran le message n’est PAS dans la page avant qu’on ouvre la ligne DeliveriesCard @cap:parler-par-canal-externe/ecran un envoi refusé dit sa raison, telle que le runner l’a écrite DeliveriesCard @cap:parler-par-canal-externe/ecran un envoi dont le texte est inconnu garde sa ligne, sans bouton |
passed
a cancel and a child birth serialize @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the real migrations a cancel and a child birth serialize @cap:parler-par-canal-externe/moteur 1. a child born deep in the tree while the cancel runs is seen and cancelled by it a cancel and a child birth serialize @cap:parler-par-canal-externe/moteur 2. a birth arriving while the cancel holds the parent waits, then is refused 129 moreaddTelegramBotCommands @cap:parler-par-canal-externe/moteur adds the missing commands after the owner's own, which it keeps addTelegramBotCommands @cap:parler-par-canal-externe/moteur writes nothing when the menu already has every command Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur names every messaging channel the product ships, and where they are set up Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur does not offer a channel the agent is already bound to Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur does not offer a channel that already has a binding, enabled or not Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur answers from the bindings it is given, whichever field carries them Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur says nothing about channels when the bindings are unknown Layer 2bis — channels and automations @cap:parler-par-canal-externe/moteur names the automations from the product registry, not from a list written here /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on telegram cancels the root run and its live delegate, closes the pending approval, creates no job, and leaves another conversation of the same channel running /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on telegram stops nothing when the sender is not authorized on this channel /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on telegram on a thread with nothing running: stops nothing, creates no job and no conversation /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on telegram a sentence that starts with /stop is a message for the agent, not the command /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on discord cancels the root run and its live delegate, closes the pending approval, creates no job, and leaves another conversation of the same channel running /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on discord stops nothing when the sender is not authorized on this channel /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on discord on a thread with nothing running: stops nothing, creates no job and no conversation /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on discord a sentence that starts with /stop is a message for the agent, not the command /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on slack cancels the root run and its live delegate, closes the pending approval, creates no job, and leaves another conversation of the same channel running /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on slack stops nothing when the sender is not authorized on this channel /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on slack on a thread with nothing running: stops nothing, creates no job and no conversation /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on slack a sentence that starts with /stop is a message for the agent, not the command /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on whatsapp cancels the root run and its live delegate, closes the pending approval, creates no job, and leaves another conversation of the same channel running /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on whatsapp stops nothing when the sender is not authorized on this channel /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on whatsapp on a thread with nothing running: stops nothing, creates no job and no conversation /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on whatsapp a sentence that starts with /stop is a message for the agent, not the command /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on a Telegram group `/stop@<this bot>` — what the command menu sends in a group — stops the conversation /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on a Telegram group a bare `/stop` in a group passes the group filter, like `/new` /stop from a channel ends every run of the conversation, without a model @cap:parler-par-canal-externe/moteur on a Telegram group `/stop@<another bot>` is not for this bot: nothing stops a task claimed before a stop spawns no child after it @cap:parler-par-canal-externe/moteur the cancel lands between the claim and the insert: no child row, nothing executed, the task stays cancelled a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: stop_conversation_run, called by a later head of the conversation, cuts the earlier CLI run a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: stop_conversation_run, called by a later head of the conversation, cuts the earlier CLI run a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row another writer sets to failed cuts the turn, and the run writes nothing over it a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row another writer sets to failed cuts the turn, and the run writes nothing over it a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row another writer sets to pending cuts the turn, and the run writes nothing over it a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row another writer sets to pending cuts the turn, and the run writes nothing over it a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row set to cancelled while the turn is being prepared never spawns the CLI a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row set to cancelled while the turn is being prepared never spawns the CLI a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row set to failed while the turn is being prepared never spawns the CLI a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row set to failed while the turn is being prepared never spawns the CLI a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row that cannot be read any more cuts the turn and fails the run, saying so a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row that cannot be read any more cuts the turn and fails the run, saying so a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a row taken by ANOTHER run between two tool effects cuts the process before the second a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a row taken by ANOTHER run between two tool effects cuts the process before the second a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur claude-code: a stale run that exits after the job was re-claimed does not overwrite the newer run’s session a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur codex: a stale run that exits after the job was re-claimed does not overwrite the newer run’s session a job served by a CLI runtime acts only while its row says processing @cap:parler-par-canal-externe/moteur a CLI job nobody cancels runs its turn to the end executeJob #567: the head job of a conversation stops the delegate an earlier message started @cap:parler-par-canal-externe/moteur handleTelegramUpdate — private chats @cap:parler-par-canal-externe/moteur creates a telegram-channel job for the receiving agent handleTelegramUpdate — private chats @cap:parler-par-canal-externe/moteur skips updates with no message body handleTelegramUpdate — private chats @cap:parler-par-canal-externe/moteur skips messages with no text runTelegramPoller #602: /stop creates no job and is acknowledged by a reaction on the message, never by text @cap:parler-par-canal-externe/moteur a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur telegram: the whole tree is listed, the caller’s own run and other conversations are not a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur discord: the whole tree is listed, the caller’s own run and other conversations are not a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur telegram: stopping one run cancels its delegate and closes its approval and question, nothing else a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur discord: stopping one run cancels its delegate and closes its approval and question, nothing else a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur with no run_id, every run of the conversation stops — the zombie delegate too — and a later list is empty a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur the stop result says how EACH cancelled job stops, by its runtime: nodal head, claude-code delegate a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur the stop result says how EACH cancelled job stops, by its runtime: nodal head, codex delegate a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur a run of ANOTHER conversation is refused, and left running a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur the caller’s own run is never stopped by the tool a later message sees and stops the runs of its conversation @cap:parler-par-canal-externe/moteur a job that is no turn of a conversation says it has no scope, instead of an empty list le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur compte les runs de tête venus de dehors, et eux seuls le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur liste ces runs, les plus récents d’abord, avec leur tâche le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur remonte la question d’un délégué jusqu’au canal ET au run de tête le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur allume la pastille du dossier MCP pour cette question le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur pose la MÊME pastille sur la LIGNE du run, par le job de tête le dossier MCP lit ce que la base en dit @cap:parler-par-canal-externe/moteur rend un job de tête comme sa propre tête — sans remonter quoi que ce soit le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur range un run de l’API et un run du serveur MCP dans le MÊME dossier le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur compte la question d’un DÉLÉGUÉ de ce run, qui ne dit rien de lui-même le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur ne remonte PAS la chaîne quand le job se range déjà lui-même le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur ne range pas un travail de Telegram dans le dossier MCP le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur n’existe que si un run est venu de dehors le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur n’existe PAS parce qu’une conversation porte ce canal — il tient à des RUNS le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur FERME la liste des dossiers, après les canaux le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur se nomme « MCP » et mène à sa propre vue le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur allume son point vert quand un de ces runs tourne le dossier MCP — ce qui arrive de dehors @cap:parler-par-canal-externe/moteur est actif quand l’URL le désigne, et lui seul la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur rend les runs du plus RÉCENT au plus ancien la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur ne promet pas de suite quand tout tient sur une page la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur reprend APRÈS la ligne du curseur, sans doublon ni trou la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur met une ligne SANS DATE en tête, et ne la revoit plus ensuite la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur repart du DÉBUT sur un curseur illisible, plutôt que de rendre une page vide la liste du dossier MCP se lit par pages @cap:parler-par-canal-externe/moteur parcourt tout le dossier sans jamais revoir la même ligne supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur refuse un run qui TOURNE, et le dit supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur ne touche PAS au run d’un autre espace, même nommément supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur SUPPRIME les uns et NOMME celui qu’il laisse — une sélection mixte supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur fait la marche, la vérification et la suppression dans UNE transaction supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur REFUSE plutôt que de laisser des orphelins quand la chaîne est trop profonde supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur emporte la DESCENDANCE du run, et ce qui pend à elle supprimer des runs du dossier MCP @cap:parler-par-canal-externe/moteur retire la ligne de la liste, et n’emporte aucune autre deux vraies pages, sans doublon ni trou @cap:parler-par-canal-externe/moteur rend une PREMIÈRE page pleine, et promet la suite deux vraies pages, sans doublon ni trou @cap:parler-par-canal-externe/moteur reprend à la 51e, sans revoir ni sauter une ligne deux vraies pages, sans doublon ni trou @cap:parler-par-canal-externe/moteur ne perd rien en parcourant tout le dossier page après page le curseur de la liste des runs @cap:parler-par-canal-externe/moteur désigne une LIGNE — sa date et son identifiant, pas un rang le curseur de la liste des runs @cap:parler-par-canal-externe/moteur sait désigner une ligne SANS date, celles que l’ordre range en dernier le curseur de la liste des runs @cap:parler-par-canal-externe/moteur refait le tour sans rien perdre, sur un identifiant qui contient des tirets le curseur de la liste des runs @cap:parler-par-canal-externe/moteur rend `null` — donc « repars du début » — pour ce qui ne désigne rien ce qu’un run laisse supprimer @cap:parler-par-canal-externe/moteur laisse supprimer un run TERMINÉ, quelle qu’en soit l’issue ce qu’un run laisse supprimer @cap:parler-par-canal-externe/moteur refuse un run qui avance encore ce qu’un run laisse supprimer @cap:parler-par-canal-externe/moteur refuse AUSSI un run arrêté sur une demande ce qu’un run laisse supprimer @cap:parler-par-canal-externe/moteur compte un statut ABSENT comme vivant la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur rend le job lui-même quand personne ne l’a délégué la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur remonte un délégué jusqu’au canal de son run de tête la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur remonte plusieurs niveaux, jusqu’au plafond de délégation du produit la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur ne devine pas une tête quand un maillon manque la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur ne rend rien pour un job absent de la lecture la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur ne tourne pas en rond sur une chaîne qui se mord la queue la tête d’une chaîne de délégation @cap:parler-par-canal-externe/moteur s’arrête au plafond plutôt que de remonter indéfiniment « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur écrit le canal du tableau de bord, pas celui de l’API « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur ne tombe donc PAS dans le dossier MCP « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur tandis qu’un run venu de dehors y tombe, lui « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur ne laisse plus aucune tâche du tableau de bord parmi les runs de dehors « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur continue de se lire « Dashboard » dans Activity, comme avant « Send task » écrit d’où la demande part @cap:parler-par-canal-externe/moteur compte son attente dans « Nodal chats », le dossier de ce qui part d’ici la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur ouvre la page du RUN, et porte la tâche comme titre la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur garde l’ordre reçu — le plus récent d’abord, celui de la lecture la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur date la ligne du DÉPART du run la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur n’écrit pas de tiret quand la date manque la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur aplatit le markdown d’une tâche et ne garde que sa première ligne la ligne d’un run venu de dehors @cap:parler-par-canal-externe/moteur nomme un run dont la tâche est vide plutôt que de laisser un blanc le titre d’un run ne montre aucun secret @cap:parler-par-canal-externe/moteur masque une clé collée dans la tâche le titre d’un run ne montre aucun secret @cap:parler-par-canal-externe/moteur la masque même écrite en gras — le markdown est aplati AVANT le titre d’un run ne montre aucun secret @cap:parler-par-canal-externe/moteur ne laisse pas passer le DÉBUT d’une clé par la coupe le titre d’un run ne montre aucun secret @cap:parler-par-canal-externe/moteur laisse une tâche ordinaire mot pour mot ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur fait remonter la question d’un DÉLÉGUÉ sur la ligne de son run de tête ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur montre la QUESTION d’abord quand une approbation attend aussi ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur ne pose sur aucune ligne une demande dont la chaîne n’a pas pu être remontée ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur ne pose pas la demande d’un autre run sur cette ligne ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur allume le point vert sur un run qui avance, et sur lui seul ce qu’un run attend, et ce qu’il fait @cap:parler-par-canal-externe/moteur dit qu’un run arrêté sur une approbation attend, même sans demande lisible |
| Capability | Screen | Engine |
|---|---|---|
| Give tools required Can I decide exactly what this agent is allowed to do? screen passed · engine passed
|
passed
Agent edit page — Tools & Connectors section @cap:assigner-outils/ecran Scenario A — Tools & Connectors section renders with the test connector Agent edit page — Tools & Connectors section @cap:assigner-outils/ecran Scenario B — checking connector checkbox creates assignment row in DB Agent edit page — Tools & Connectors section @cap:assigner-outils/ecran Scenario C — unchecking connector removes assignment from DB 20 moreAgent edit page — Tools & Connectors section @cap:assigner-outils/ecran Scenario D — Enable all button keeps enabledOperations=null in DB an owner names two commands, reads them back, then removes the list @cap:assigner-outils/ecran Tools tab lists every tool group the catalogue declares @cap:assigner-outils/ecran CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran two lines are saved as two entries CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran an emptied field saves null, never an empty list CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran "Block all commands" saves an empty list, never null CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran blank lines and stray spaces are not entries CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran the same entry written twice is saved once CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran two entries differing only in case are BOTH kept CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran says how a command must be written once a list exists CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran the three states are said in words CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran says what the list does not govern CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran renders the message of a refused save, next to the field CommandAllowlistSection — what the owner saves @cap:assigner-outils/ecran a non-owner cannot change the list, and is told why TeamChangeSection — what the owner saves @cap:assigner-outils/ecran renders the saved value: off stays off until someone turns it on TeamChangeSection — what the owner saves @cap:assigner-outils/ecran renders an agent whose owner already turned it on TeamChangeSection — what the owner saves @cap:assigner-outils/ecran turning it on sends mayChangeTeam: true for this agent TeamChangeSection — what the owner saves @cap:assigner-outils/ecran turning it back off sends mayChangeTeam: false TeamChangeSection — what the owner saves @cap:assigner-outils/ecran a refused save shows the reason and leaves the switch where it was TeamChangeSection — what the owner saves @cap:assigner-outils/ecran says what off actually does, so the setting is not read as a style choice |
passed
migration 0108_agent_command_allowlist @cap:assigner-outils/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0108_agent_command_allowlist @cap:assigner-outils/moteur leaves agents.command_allowlist as a NULLABLE text[] — the column an upgraded install gets migration 0108_agent_command_allowlist @cap:assigner-outils/moteur accepts the three states the allowlist can be in: NULL, empty, populated 108 moremigration 0111_agent_may_change_team @cap:assigner-outils/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0111_agent_may_change_team @cap:assigner-outils/moteur leaves agents.may_change_team a NOT NULL boolean defaulting to false migration 0111_agent_may_change_team @cap:assigner-outils/moteur turns the setting OFF on an agent row that predates the column migration 0111_agent_may_change_team @cap:assigner-outils/moteur records the migration in the journal drizzle-kit actually reads buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur on every job shape: delegated worker, root with and without send tools, cron, max depth buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur keeps the Telegram etiquette for the job that can follow it, and only for it buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur lists as built-in only the built-ins the job holds buildSystemPrompt — the whole prompt names only held tools, on real configurations (#559) @cap:assigner-outils/moteur 'skill WITHOUT scripts authorized': delegated worker, root on its channel, cron root buildSystemPrompt — the whole prompt names only held tools, on real configurations (#559) @cap:assigner-outils/moteur 'skill WITH scripts authorized': delegated worker, root on its channel, cron root buildSystemPrompt — the whole prompt names only held tools, on real configurations (#559) @cap:assigner-outils/moteur the skills block names run_skill_script exactly when the job holds it buildSystemPrompt — the whole prompt names only held tools, on real configurations (#559) @cap:assigner-outils/moteur root holding only ["attach_connector"]: each configured resource names only the tool of its own kind buildSystemPrompt — the whole prompt names only held tools, on real configurations (#559) @cap:assigner-outils/moteur root holding only ["attach_mcp"]: each configured resource names only the tool of its own kind resolveAgentToolNames — plain worker agent @cap:assigner-outils/moteur returns the always-on set and nothing MCP/meta-tool related resolveAgentToolNames — plain worker agent @cap:assigner-outils/moteur throws for an unknown agent id (fail loud) executeJob the stored prompt names telegram_send_message only for the job that holds it (#559) @cap:assigner-outils/moteur executeJob a resumed job keeps its stored prompt when its tools are unchanged, and rewrites it when a tool was withdrawn (#559) @cap:assigner-outils/moteur the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur four parallel calls of one unavailable tool: each gets its error, the model recovers the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur several unavailable tools in one turn spend one chance, not one per call the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur a valid call in the same batch runs, and the batch still spends one chance the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur the incident shape: unavailable sends next to return_result, the result is delivered the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur a turn that repeats the mistake after the budget fails the job, and none of its calls runs the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur the budget survives a suspension: after resume, the next unavailable turn fails and its valid call never runs the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur SDK rejections and unavailable calls spend the same budget: two then one, the fourth fails the unavailable-tool budget counts turns, not calls (#560) @cap:assigner-outils/moteur unavailable calls then an SDK rejection: the rejection past the budget fails the job may_change_team — the tool list of a real run @cap:assigner-outils/moteur off: the three team tools are absent, the other granted meta-tools are not may_change_team — the tool list of a real run @cap:assigner-outils/moteur on: the same agent, same grants, receives the three may_change_team — the tool list of a real run @cap:assigner-outils/moteur off: a run that calls attach_agent is told the tool is not available, and no assignment row appears isShellProgram @cap:assigner-outils/moteur names a shell as a shell, whatever the spelling of the entry isShellProgram @cap:assigner-outils/moteur reads the PROGRAM of a multi-word entry, not the whole string isShellProgram @cap:assigner-outils/moteur names the LAUNCHERS too, which are not shells but start anything isShellProgram @cap:assigner-outils/moteur leaves node alone — running a snippet IS the intended use isShellProgram @cap:assigner-outils/moteur leaves ordinary programs alone isShellProgram @cap:assigner-outils/moteur is not fooled by a path, which the allowlist refuses anyway isShellProgram @cap:assigner-outils/moteur ignores an empty entry rather than calling it a shell isShellProgram @cap:assigner-outils/moteur exposes the list so a message can name what was refused metaToolsForAgent @cap:assigner-outils/moteur drops create_agent, attach_agent and detach_agent when the setting is off metaToolsForAgent @cap:assigner-outils/moteur keeps every other meta-tool the grants enable metaToolsForAgent @cap:assigner-outils/moteur returns the full granted list when the setting is on metaToolsForAgent @cap:assigner-outils/moteur never ADDS a tool the grants refuse — the setting can only take away metaToolsForAgent @cap:assigner-outils/moteur leaves an agent with no grants at all with nothing, either way metaToolsForAgent @cap:assigner-outils/moteur the workspace defaults still hand out the three only when the agent may isTeamChangingMetaTool @cap:assigner-outils/moteur names the three team tools and nothing else tokenizeSimpleCommand @cap:assigner-outils/moteur splits on whitespace tokenizeSimpleCommand @cap:assigner-outils/moteur groups an argument with double quotes, quotes excluded tokenizeSimpleCommand @cap:assigner-outils/moteur treats a single quote INSIDE double quotes as an ordinary character tokenizeSimpleCommand @cap:assigner-outils/moteur keeps an empty double-quoted argument, which is not nothing tokenizeSimpleCommand @cap:assigner-outils/moteur tolerates extra whitespace tokenizeSimpleCommand @cap:assigner-outils/moteur leaves a shell character alone INSIDE double quotes, where nothing reads it tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses chaining, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a pipe, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a separator, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a redirection out, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a redirection in, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a cmd.exe variable, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a shell variable, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses command substitution, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses the caret, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a bare single quote, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a line break, and says so tokenizeSimpleCommand @cap:assigner-outils/moteur what it refuses, naming the character refuses a double quote that is never closed assertCommandAllowed @cap:assigner-outils/moteur no allowlist configured returns null for null — the caller keeps the shell, unchanged assertCommandAllowed @cap:assigner-outils/moteur no allowlist configured returns null for undefined assertCommandAllowed @cap:assigner-outils/moteur no allowlist configured refuses everything when the allowlist is an EMPTY array assertCommandAllowed @cap:assigner-outils/moteur allows a one-word entry matching the program assertCommandAllowed @cap:assigner-outils/moteur allows a two-word entry matching the first two tokens assertCommandAllowed @cap:assigner-outils/moteur refuses a program that is not listed assertCommandAllowed @cap:assigner-outils/moteur refuses npx with a package that is not listed assertCommandAllowed @cap:assigner-outils/moteur does not let a longer program pass on a prefix match assertCommandAllowed @cap:assigner-outils/moteur names the refused command and the allowlist in the error assertCommandAllowed @cap:assigner-outils/moteur refuses a command that names no program at all assertCommandAllowed @cap:assigner-outils/moteur how the PROGRAM is spelled — Windows only accepts the .exe suffix and a different case assertCommandAllowed @cap:assigner-outils/moteur how the PROGRAM is spelled — Windows only accepts the .cmd suffix on a multi-word entry assertCommandAllowed @cap:assigner-outils/moteur how the PROGRAM is spelled — Windows only keeps the comparison exact off Windows assertCommandAllowed @cap:assigner-outils/moteur how the PROGRAM is spelled — Windows only compares ARGUMENTS exactly on every platform planAllowedRun @cap:assigner-outils/moteur returns null without a list, so the caller keeps the shell planAllowedRun @cap:assigner-outils/moteur resolves the program to an ABSOLUTE path and keeps the arguments planAllowedRun @cap:assigner-outils/moteur refuses a path, even when the list itself names one planAllowedRun @cap:assigner-outils/moteur refuses a program the PATH does not hold, saying which planAllowedRun @cap:assigner-outils/moteur never looks in the current directory: an empty PATH finds nothing planAllowedRun @cap:assigner-outils/moteur drops "." from the PATH, which would mean the current directory planAllowedRun @cap:assigner-outils/moteur resolves only what it can launch, and prefers .exe over a same-named script planAllowedRun @cap:assigner-outils/moteur refuses when the PATH holds only a same-named file it cannot launch planAllowedRun @cap:assigner-outils/moteur refuses a caret inside an argument bound for the batch line planAllowedRun @cap:assigner-outils/moteur a %VAR% never reaches the batch line: the tokenizer refuses it first planAllowedRun @cap:assigner-outils/moteur runs a .cmd through cmd.exe, with the line built here from allowed tokens nodal_docs on an agent whitelist @cap:assigner-outils/moteur is refused to an agent whose list does not carry it nodal_docs on an agent whitelist @cap:assigner-outils/moteur is in the registry and in the always-on list the runner passes les deux textes du propriétaire, sur tout outil du produit @cap:assigner-outils/moteur le registre est bien peuplé (sinon tout ce qui suit passerait à vide) les deux textes du propriétaire, sur tout outil du produit @cap:assigner-outils/moteur chaque outil déclare un titre court, qui n’est pas son identifiant les deux textes du propriétaire, sur tout outil du produit @cap:assigner-outils/moteur chaque outil déclare un résumé rédigé, distinct du texte du modèle les deux textes du propriétaire, sur tout outil du produit @cap:assigner-outils/moteur aucun tiret cadratin dans un texte que lit une personne les deux textes du propriétaire, sur tout outil du produit @cap:assigner-outils/moteur les vingt outils toujours disponibles portent les phrases de l’issue #382 computeToolWhitelist @cap:assigner-outils/moteur returns only the configured tools in the correct order computeToolWhitelist @cap:assigner-outils/moteur appends alwaysOn tools and deduplicates computeToolWhitelist @cap:assigner-outils/moteur returns only alwaysOn tools when configuredTools is empty computeToolWhitelist @cap:assigner-outils/moteur returns empty array when both lists are empty computeToolWhitelist @cap:assigner-outils/moteur throws WhitelistDriftError when a configured tool is not in registry computeToolWhitelist @cap:assigner-outils/moteur throws WhitelistDriftError when an alwaysOn tool is not in registry computeToolWhitelist @cap:assigner-outils/moteur WhitelistDriftError includes agent id and undeclared tools computeToolWhitelist @cap:assigner-outils/moteur returned tool definitions match those in the registry computeToolWhitelist @cap:assigner-outils/moteur capabilityTools: appends extra tool even when not in registry computeToolWhitelist @cap:assigner-outils/moteur capabilityTools: no duplicates when capability tool name matches a configuredTool computeToolWhitelist @cap:assigner-outils/moteur capabilityTools: unregistered capability tool does NOT throw WhitelistDriftError setRunCommandRuleAction @cap:assigner-outils/moteur chaque choix écrit SA règle, et null la retire setRunCommandRuleAction @cap:assigner-outils/moteur hors local-trust, un tiers ne change rien, dans aucun des quatre sens setRunCommandRuleAction @cap:assigner-outils/moteur « Run without asking » n’élargit pas une règle de dossier ; Block la remplace setRunCommandRuleAction @cap:assigner-outils/moteur « Run without asking » ne remplace pas non plus une règle de dossier Block ou Ask setRunCommandRuleAction @cap:assigner-outils/moteur refuse une action inconnue sans rien écrire |
| Give a skill required Can I attach a skill to it, and take it back? screen not tested · engine passed
What a screen test should check: That attaching a skill from an agent's Skills tab, then removing it, shows both in the list AND in the assignment row in the database.
|
not tested
no test at this level |
passed
assignSkillRepo — dedup (DB-2, audit #2) @cap:assigner-skill/moteur repeated assignment of the same (agent, skill) leaves exactly ONE row assignSkillRepo — dedup (DB-2, audit #2) @cap:assigner-skill/moteur the underlying insert is guarded by onConflictDoNothing — a row inserted outside the SELECT check (the race the app-level check cannot close) does not throw and still leaves ONE row |
| Install a skill from the catalogue required Can I take a community skill and keep it up to date? screen passed · engine passed
|
passed
learned-skills page @cap:apprendre-une-skill/ecran renders the Learned Skills page at /learned-skills learned-skills page @cap:apprendre-une-skill/ecran toggle switches the reflection_enabled flag (UI responds) learned-skills page @cap:apprendre-une-skill/ecran no window.confirm / window.alert / window.prompt is called (dialog uses ConfirmDialog) 1 morelearned-skills page @cap:apprendre-une-skill/ecran assignment-mode control renders both options and is interactive |
passed
POST /api/skills/install — provenance du code installé @cap:apprendre-une-skill/moteur refuse un hôte hors allowlist AVANT tout téléchargement POST /api/skills/install — provenance du code installé @cap:apprendre-une-skill/moteur refuse aussi la forme sans schéma, qui passe par un second parcours POST /api/skills/install — provenance du code installé @cap:apprendre-une-skill/moteur refuse un chemin skills.sh incomplet avec un message exploitable 1 morePOST /api/skills/install — provenance du code installé @cap:apprendre-une-skill/moteur renvoie un diagnostic utilisateur, jamais une erreur interne brute |
| Connect a service required Can I connect Notion, Google, Airtable, and see what I am handing over? screen passed · engine passed
|
passed
Connector scope disclosure @cap:connecter-un-service/ecran Google Drive states it reaches the ENTIRE Drive Connector scope disclosure @cap:connecter-un-service/ecran Google Sheets and Docs disclose their reach too Connector scope disclosure @cap:connecter-un-service/ecran a connector whose reach matches its name shows NO disclosure 3 moreConnector scope disclosure @cap:connecter-un-service/ecran la PREMIÈRE connexion est un chemin à part, et il est éprouvé Notion OAuth flow (wizard-driven) @cap:connecter-un-service/ecran connect via wizard → callback → connected status (no Refresh button) Google Drive OAuth flow (wizard-driven) @cap:connecter-un-service/ecran connect via wizard → callback → connected status and toast |
passed
job-with-adapter: Drive connector fully enabled (enabledOperations=null) @cap:connecter-un-service/moteur tool_calls row is written for drive_list_files when LLM calls it |
| Remember required Does it hold on to what I taught it? screen passed · engine passed
|
passed
a fact taught on the screen is kept @cap:se-souvenir/ecran it is written, it survives a reload, and the search finds it again a fact taught on the screen is kept @cap:se-souvenir/ecran archiving a fact takes it out of what the agent is given la rangée d’agents de la page Mémoire dit qu’elle filtre par auteur (#420) @cap:se-souvenir/ecran l’écran dit « Written by », la pastille par défaut « Anyone », et seul l’agent qui a écrit a sa pastille |
passed
selectMemoriesForInjection — DB @cap:se-souvenir/moteur returns [] when budget is 0 selectMemoriesForInjection — DB @cap:se-souvenir/moteur returns top memories under budget, ordered by importance × recency selectMemoriesForInjection — DB @cap:se-souvenir/moteur excludes archived memories 6 moreselectMemoriesForInjection — DB @cap:se-souvenir/moteur relevance-ranks the fetched pool against the query (lower-importance but on-topic wins) selectMemoriesForInjection — DB @cap:se-souvenir/moteur stems the task — a "token" task surfaces a fact containing "tokens" (english config) selectMemoriesForInjection — DB @cap:se-souvenir/moteur surfaces a relevant-but-low-importance fact hidden past MAX_CANDIDATES(200) by the old importance/recency ordering la recherche de la page Mémoire interroge le SERVEUR @cap:se-souvenir/moteur une forme fléchie absente du texte n’est trouvée que par la recherche serveur la recherche de la page Mémoire interroge le SERVEUR @cap:se-souvenir/moteur recherche serveur CASSÉE ⇒ la ligne n’apparaît jamais (la mutation) la recherche de la page Mémoire interroge le SERVEUR @cap:se-souvenir/moteur le filtre client seul ne connaît pas la forme fléchie |
| Capability | Screen | Engine |
|---|---|---|
| Set the autonomy required Can I choose what goes through alone and what asks me first? screen passed · engine passed
|
passed
Approvals tab @cap:regler-autonomie/ecran find an existing agent to navigate to Approvals tab @cap:regler-autonomie/ecran Autonomy tab is visible in the agent editor Approvals tab @cap:regler-autonomie/ecran Autonomy tab renders without errors (empty state or tool list) 87 moreApprovals tab @cap:regler-autonomie/ecran 3-way control is present and interactive when write tools exist Never for this agent, from the conversation @cap:regler-autonomie/ecran confirming sets the kind of action to Never for that agent the shell checklist @cap:regler-autonomie/ecran a new agent asks for everything; "Never" for deleting is saved and read back Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran allumé rend une piste pleine bg-ok et le bouton à droite Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran éteint rend une piste pleine bg-ink-4 et le bouton à gauche Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran les deux états ne partagent aucune couleur de piste Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran aucun état actif n'est teinté ni atténué — c'est ce qui se lisait « désactivé » Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran disabled est le SEUL état atténué, et il porte vraiment l’attribut Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran aria-checked suit checked, et l’aria de l’appelant arrive au bouton Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran chaque taille rend sa géométrie, et pas celle de l’autre Switch — un seul look, sans ambiguïté @cap:regler-autonomie/ecran le focus se voit par un anneau, pas par un changement de piste Switch — le mode image (readOnly) @cap:regler-autonomie/ecran ne rend aucun contrôle : ni <button>, ni rôle d'interrupteur, ni aria-checked Switch — le mode image (readOnly) @cap:regler-autonomie/ecran se nomme elle-même, au lieu de compter sur un voisin qui n'existe pas Switch — le mode image (readOnly) @cap:regler-autonomie/ecran porte l'état en attribut, pour que la ligne puisse le styler et le test le lire Switch — le mode image (readOnly) @cap:regler-autonomie/ecran l'image porte exactement les couleurs du contrôle qu'elle montre Switch — le mode image (readOnly) @cap:regler-autonomie/ecran n'a ni curseur ni anneau de focus : il n'y a rien à actionner Switch — le mode image (readOnly) @cap:regler-autonomie/ecran une image de contrôle désactivé a bien l’air désactivée Switch — ce que fait le contrôle @cap:regler-autonomie/ecran un clic appelle onChange une fois Switch — ce que fait le contrôle @cap:regler-autonomie/ecran désactivé, le clic ne déclenche rien Switch — ce que fait le contrôle @cap:regler-autonomie/ecran le clavier marche parce que c’est un vrai <button>, pas un div les textes de l'onglet Approvals @cap:regler-autonomie/ecran ouvre sur ce que le propriétaire décide ici les textes de l'onglet Approvals @cap:regler-autonomie/ecran dit la règle par défaut et quand un changement prend effet les textes de l'onglet Approvals @cap:regler-autonomie/ecran dit ce que devient un outil bloqué les textes de l'onglet Approvals @cap:regler-autonomie/ecran présente les outils natifs, et les rend par label et summary les textes de l'onglet Approvals @cap:regler-autonomie/ecran dit pourquoi return_result ne se bloque pas les textes de l'onglet Approvals @cap:regler-autonomie/ecran porte les trois décisions du curseur les textes de l'onglet Approvals @cap:regler-autonomie/ecran rend une operation de connecteur par ses textes de proprietaire, jamais par sa description les textes de l'onglet Approvals @cap:regler-autonomie/ecran montre encore le nom et la description d'un connecteur pas encore repris les textes de l'onglet Approvals @cap:regler-autonomie/ecran dit ce que sont les commandes, et la liste qui les borne les textes de l'onglet Approvals @cap:regler-autonomie/ecran dit ce que l'agent peut faire de son équipe, et ce qu'être en lecture seule veut dire une règle confinée à un dossier @cap:regler-autonomie/ecran nomme le dossier sur la ligne, au lieu de laisser lire « partout » une règle confinée à un dossier @cap:regler-autonomie/ecran ne dit rien pour une règle sans condition, et le dit pour sa voisine une règle confinée à un dossier @cap:regler-autonomie/ecran avertit AVANT d'enregistrer, et n'écrit rien tant que personne n'a répondu une règle confinée à un dossier @cap:regler-autonomie/ecran enregistre le choix une fois la perte acceptée une règle confinée à un dossier @cap:regler-autonomie/ecran garde la règle telle quelle quand on renonce une règle confinée à un dossier @cap:regler-autonomie/ecran avertit AUSSI pour « Ask for approval », pas seulement pour « Block » une règle confinée à un dossier @cap:regler-autonomie/ecran n'annonce aucun élargissement pour « Run without asking », que le serveur refuse une règle confinée à un dossier @cap:regler-autonomie/ecran ne retire pas le dossier de la ligne avant la réponse du serveur une règle confinée à un dossier @cap:regler-autonomie/ecran nomme le dossier même sur une ligne qui ne peut pas être bloquée une règle confinée à un dossier @cap:regler-autonomie/ecran une relecture n'écrase pas une écriture encore en vol une règle confinée à un dossier @cap:regler-autonomie/ecran n'affiche pas les règles de l'agent précédent quand on change d'agent une règle confinée à un dossier @cap:regler-autonomie/ecran relâche la ligne quand la promesse d’enregistrement rejette une règle confinée à un dossier @cap:regler-autonomie/ecran prévient avant que la ligne Run commands ne remplace une règle de dossier une règle confinée à un dossier @cap:regler-autonomie/ecran dit ce que la règle de dossier fait vraiment, et ce que le geste en fera une règle confinée à un dossier @cap:regler-autonomie/ecran Run without asking par-dessus une règle de dossier ne promet pas un remplacement : le serveur tranche une règle confinée à un dossier @cap:regler-autonomie/ecran nomme le dossier dans le nom accessible du curseur une règle confinée à un dossier @cap:regler-autonomie/ecran nomme le dossier sur une ligne de CONNECTEUR, pas seulement sur un outil natif une règle confinée à un dossier @cap:regler-autonomie/ecran nomme le dossier sur une ligne de SERVEUR MCP une règle confinée à un dossier @cap:regler-autonomie/ecran enregistre sans rien demander quand la règle n'a pas de dossier les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran annonce combien le serveur expose, et ne les montre que sur demande les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran sans règle sur l'outil exact, la ligne suit le serveur les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran montre la valeur d'une règle déjà posée sur un outil exact les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran enregistre sur le NOM EXACT de l'outil, pas sur le motif du serveur les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran « Follow the server » supprime la règle de l’outil les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran ne liste que les outils que l'agent a vraiment les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran la ligne du serveur dit sa portée, pas un instantané les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran sans liste blanche, la ligne du serveur parle bien de tout le serveur les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran nomme les règles restées sur des outils que l'agent ne tient plus les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran accorde la phrase quand DEUX règles traînent les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran ne dit rien de tel pour une règle posée sur un outil que l'agent tient les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran sur une règle de dossier, « Follow the server » dit ce qui sera supprimé les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran dit, une fois, qu'une règle d'outil bat celle du serveur Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran sans règle, AUCUN choix n’est allumé, et la ligne dit qui décide Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran chaque règle allume SON choix Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran Block et Ask s’enregistrent sans confirmation, et envoient LEUR action Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran « Run without asking » demande d’abord, et n’écrit rien avant la réponse Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran « Let the workspace autonomy decide » retire la règle Run commands : les trois choix de tout outil (#468) @cap:regler-autonomie/ecran un refus du serveur remet le choix d’avant une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran affiche le titre et le résumé, et jamais le texte du modèle une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran garde l'identifiant technique sous le résumé une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran dit l'accès en mots, pas en jargon une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran offre les trois décisions, dans les mots du propriétaire une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran remonte la décision choisie une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran nomme le dossier auquel la règle est confinée, à côté du curseur une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran ne dit aucun dossier quand la règle n'en porte pas une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran remplace le curseur par la raison quand l'outil ne peut pas être bloqué ShellChecklistSection @cap:regler-autonomie/ecran an agent nobody configured asks for every kind of action ShellChecklistSection @cap:regler-autonomie/ecran says what a reading can promise: a script run from a file is not read (review of PR #474) ShellChecklistSection @cap:regler-autonomie/ecran shows what is stored ShellChecklistSection @cap:regler-autonomie/ecran a click saves that kind of action with that state, and the row says it ShellChecklistSection @cap:regler-autonomie/ecran a refused save puts the row back and says why ShellChecklistSection @cap:regler-autonomie/ecran a non-owner reads the rows and cannot change them ShellChecklistSection @cap:regler-autonomie/ecran a stored value the engine cannot read is said, not shown as defaults runCommandsTruth: what really happens to a command (#464) @cap:regler-autonomie/ecran says the truth under destructive_gate, where no rule means ordinary commands run runCommandsTruth: what really happens to a command (#464) @cap:regler-autonomie/ecran says full autonomy does not cover the shell runCommandsTruth: what really happens to a command (#464) @cap:regler-autonomie/ecran reads the rule before the level, and the brake before Run without asking runCommandsTruth: what really happens to a command (#464) @cap:regler-autonomie/ecran names the folder of a confined rule, and says the workspace decides elsewhere |
passed
le cas de l'issue #357, de bout en bout @cap:regler-autonomie/moteur un serveur autonome, un seul de ses outils bloqué : le blocage gagne le cas de l'issue #357, de bout en bout @cap:regler-autonomie/moteur une règle d'outil posée pour TOUT LE MONDE bat aussi le serveur de l'agent le cas de l'issue #357, de bout en bout @cap:regler-autonomie/moteur sans règle sur l'outil exact, c'est bien celle du serveur qui décide 16 moreexecuteTool — fully_autonomous workspace @cap:regler-autonomie/moteur control: a safe-by-default tool suspends when NOT fully_autonomous executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur fully_autonomous ne relaxe PAS run_command → approbation quand même executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur fully_autonomous ne relaxe PAS un outil de script de skill non plus executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur …mais une RÈGLE EXPLICITE auto_approve exécute bien (le Yolo reste la clé) executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur fully_autonomous relaxe toujours un outil ORDINAIRE (le correctif borne, il ne gèle pas) executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur an EXPLICIT require_approval rule still wins under fully_autonomous executeTool — fully_autonomous workspace @cap:regler-autonomie/moteur the catastrophic hardline floor still forces approval under fully_autonomous l'onglet Approvals reçoit la condition, pas seulement l'action @cap:regler-autonomie/moteur rend la condition et le LIBELLÉ du dossier, pas son chemin l'onglet Approvals reçoit la condition, pas seulement l'action @cap:regler-autonomie/moteur rend null sur une règle sans condition, et rien d'autre ne change l'onglet Approvals reçoit la condition, pas seulement l'action @cap:regler-autonomie/moteur tranche entre deux libellés visant le MÊME dossier, toujours de la même façon l'onglet Approvals reçoit la condition, pas seulement l'action @cap:regler-autonomie/moteur nomme le CHEMIN quand le dossier a été détaché de l’agent setAgentShellPolicyAction @cap:regler-autonomie/moteur stores one kind of action at a time, keeping the others setAgentShellPolicyAction @cap:regler-autonomie/moteur refuses a kind of action or a state the engine would not read setAgentShellPolicyAction @cap:regler-autonomie/moteur an agent of another workspace is not found, and nothing is written setAgentShellPolicyAction @cap:regler-autonomie/moteur sets several kinds to one state in one write, or none of them getAutoRunPauseAction gives the workspace autonomy (#464) @cap:regler-autonomie/moteur reads it from root_grants |
| Approve or refuse required Does it really wait for me when it is supposed to wait? screen passed · engine passed
|
passed
approvals in the conversation @cap:approuver-une-action/ecran a delegate's pending approval is answered from the conversation la pastille d’« Approvals » n’a pas bougé @cap:approuver-une-action/ecran garde son plafond à 99 la pastille d’« Approvals » n’a pas bougé @cap:approuver-une-action/ecran écrit le nombre tel quel en deçà 76 morela case Approvals du rail @cap:approuver-une-action/ecran OUVRE UN PANNEAU depuis la v2, au lieu de seulement naviguer la case Approvals du rail @cap:approuver-une-action/ecran porte le NOMBRE de demandes en attente, et RIEN à zéro la case Approvals du rail @cap:approuver-une-action/ecran est la SEULE case du rail à compter quelque chose la case Approvals du rail @cap:approuver-une-action/ecran DIT ce que le nombre compte, au lieu de le coller au libellé la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran APPROUVER fait disparaître le nombre, sans attendre le tour de cadence la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran relit APRÈS la réponse du serveur, jamais avant la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran une réponse EN ÉCHEC laisse le nombre en place la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran REJETER la fait tomber aussi — répondre non est une réponse la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran APPROUVER POUR CE DOSSIER la fait tomber, après la règle conditionnée la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran RÉPONDRE À UNE QUESTION de la page la fait tomber la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran RÉPONDRE DEPUIS LE FIL la fait tomber — la troisième surface la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran une lecture qui LÈVE garde le dernier nombre connu, et le dit la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran une RÉPONSE MAL FORMÉE ne coince pas le bouton de celui qui a répondu la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran ATTEND la relecture : le bouton ne revient pas sur l’ancien nombre la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran RETIENT AUSSI les autres boutons de décision le temps de la lecture la pastille du rail tombe dès la réponse @cap:approuver-une-action/ecran APPROUVER DEPUIS LA CLOCHE la fait tomber — la quatrième surface la carte dit quelle règle a décidé @cap:approuver-une-action/ecran rend la chaîne dans l’ordre, la première gagnante et les autres écrasées la carte dit quelle règle a décidé @cap:approuver-une-action/ecran nomme le dossier d’une règle conditionnée la carte dit quelle règle a décidé @cap:approuver-une-action/ecran sans aucune règle, montre la posture propre de l’outil la carte dit quelle règle a décidé @cap:approuver-une-action/ecran Change remplace le bouton par le sélecteur et enregistre au bon scope la carte dit quelle règle a décidé @cap:approuver-une-action/ecran Change sur une règle de dossier GARDE le dossier la carte dit quelle règle a décidé @cap:approuver-une-action/ecran une relecture qui ne retrouve pas la demande le DIT la carte dit quelle règle a décidé @cap:approuver-une-action/ecran une ligne d’agent écrit une règle d’agent approuver pour ce dossier @cap:approuver-une-action/ecran le bouton n’existe pas quand l’agent n’a aucun dossier approuver pour ce dossier @cap:approuver-une-action/ecran avec un seul dossier, il existe et n’offre aucun choix approuver pour ce dossier @cap:approuver-une-action/ecran avec deux dossiers, le choix est offert et c’est LUI qui part approuver pour ce dossier @cap:approuver-une-action/ecran une règle non écrite laisse la demande en attente ce que la carte écrit, en anglais @cap:approuver-une-action/ecran titre lisible, raison de l’agent, effet et provenance ce que la carte écrit, en anglais @cap:approuver-une-action/ecran le bouclier d’en-tête porte la couleur d’alerte du dessin ce que la carte écrit, en anglais @cap:approuver-une-action/ecran dit en anglais que l’agent n’a pas donné de raison ce que la carte écrit, en anglais @cap:approuver-une-action/ecran n’offre plus aucun « Always », et la décision tient en trois boutons ce que la carte écrit, en anglais @cap:approuver-une-action/ecran une demande tranchée, ouverte, garde son corps et perd ses boutons la carte a deux états, Open et Close @cap:approuver-une-action/ecran Open rend le bloc de demande : effet, provenance et arguments la carte a deux états, Open et Close @cap:approuver-une-action/ecran Close cache CE BLOC et RIEN d’autre la carte a deux états, Open et Close @cap:approuver-une-action/ecran un reclic sur la ligne d’agent revient à Open la carte a deux états, Open et Close @cap:approuver-une-action/ecran une demande en attente arrive en Open, une demande tranchée en Close la carte a deux états, Open et Close @cap:approuver-une-action/ecran « Tool input » a son propre pli, replié par défaut et indépendant la carte a deux états, Open et Close @cap:approuver-une-action/ecran l’en-tête porte la pastille de statut, et plus « View job » la carte a deux états, Open et Close @cap:approuver-une-action/ecran le titre des règles est du texte courant, pas du mono la carte a deux états, Open et Close @cap:approuver-une-action/ecran `defaultOpen` ouvre une demande tranchée, c’est ce que `?show=` demande la carte a deux états, Open et Close @cap:approuver-une-action/ecran répondue sous les yeux, la carte passe en Close sans attendre une navigation la carte a deux états, Open et Close @cap:approuver-une-action/ecran une QUESTION porte sa question et ses options dans la ligne de raison la carte ne perd ni son échéance ni sa garde @cap:approuver-une-action/ecran une QUESTION en attente montre encore quand elle expire la carte ne perd ni son échéance ni sa garde @cap:approuver-une-action/ecran un outil garde son échéance en Close, là où le bloc de demande s’en va la carte ne perd ni son échéance ni sa garde @cap:approuver-une-action/ecran une demande EXPIRÉE n’offre aucun bouton de décision la carte ne perd ni son échéance ni sa garde @cap:approuver-une-action/ecran « Open Run » n’est rendu qu’une fois, en Open comme en Close la carte dit ce que la liste de l’agent a vu (#464) @cap:approuver-une-action/ecran nomme chaque sorte d’action lue la carte dit ce que la liste de l’agent a vu (#464) @cap:approuver-une-action/ecran rien quand la liste n’y est pour rien « Never for this agent » (#470) @cap:approuver-une-action/ecran n'existe que sur une carte que la liste de l'agent a retenue « Never for this agent » (#470) @cap:approuver-une-action/ecran dit ce qui change, puis passe chaque sorte à Never AVANT de refuser « Never for this agent » (#470) @cap:approuver-une-action/ecran un réglage non écrit ne refuse rien : la demande reste en attente, et la carte le dit « Never for this agent » (#470) @cap:approuver-une-action/ecran réglages écrits mais refus échoué : la carte dit que les réglages sont en place la page des approbations suit la barre @cap:approuver-une-action/ecran NE RELIT PAS la page au montage : le serveur vient de la rendre la page des approbations suit la barre @cap:approuver-une-action/ecran RELIT la page quand une demande ARRIVE pendant qu’on la regarde la page des approbations suit la barre @cap:approuver-une-action/ecran RELIT la page quand une demande PART, répondue ailleurs la page des approbations suit la barre @cap:approuver-une-action/ecran NE RELIT PAS quand les attentes sont les mêmes la page des approbations suit la barre @cap:approuver-une-action/ecran relit quand une demande en REMPLACE une autre, à compte égal la page des approbations suit la barre @cap:approuver-une-action/ecran RELIT TOUT DE SUITE si le serveur a rendu un AUTRE ensemble la page des approbations suit la barre @cap:approuver-une-action/ecran ne relit PAS quand le serveur a rendu le MÊME ensemble la page des approbations suit la barre @cap:approuver-une-action/ecran la PAGE le monte vraiment, et lui donne ce qu’elle a rendu la page des approbations suit la barre @cap:approuver-une-action/ecran la signature ne dépend pas de l’ORDRE des lignes approvals in the conversation (#469) @cap:approuver-une-action/ecran reads this conversation's pending approvals and shows the card, not the questions approvals in the conversation (#469) @cap:approuver-une-action/ecran "Approve once" answers from the thread: the card leaves and the thread is re-read approvals in the conversation (#469) @cap:approuver-une-action/ecran nothing pending: nothing in the thread approvals in the conversation (#469) @cap:approuver-une-action/ecran a new request anywhere re-reads; a poll with the same ids does not approvals in the conversation (#469) @cap:approuver-une-action/ecran once the rail list is full, every poll re-reads: an older request may have been answered approvals in the conversation (#469) @cap:approuver-une-action/ecran a read that lands after the answer does not bring the card back l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran nomme le dossier et ne rien écrire tant que la boîte est ouverte l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran confirmer envoie le drapeau explicite, sur le motif du serveur l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran annuler laisse la règle de dossier intacte : aucune écriture l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran sans limite de dossier, aucune boîte en plus et aucun drapeau l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran « pour tous mes agents » dit une AUTRE phrase, et envoie la portée entité l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran la limite de l’agent survit à une règle d’entité, et la boîte se rouvre l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran après un élargissement sur l’agent, la question ne se repose pas l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran une règle de dossier qui DEMANDE l’approbation n’ouvre pas la boîte l'onglet Connectors ne franchit pas une limite de dossier en silence @cap:approuver-une-action/ecran une limite posée sur UN outil du serveur ne déclenche pas la boîte |
passed
Layer 1 — baseline discipline dit la règle de `purpose` une fois, sans nommer aucun outil @cap:approuver-une-action/moteur un outil MCP gaté garde la raison de l’agent @cap:approuver-une-action/moteur la ligne d’approbation porte la phrase, et le serveur ne l’a jamais vue expireStaleApprovals (D3, issue #349) @cap:approuver-une-action/moteur closes a past-deadline pending request and puts its job back to work 93 moreexpireStaleApprovals (D3, issue #349) @cap:approuver-une-action/moteur a second sweep changes nothing: the row is no longer pending expireStaleApprovals (D3, issue #349) @cap:approuver-une-action/moteur does NOT touch a pending request whose deadline is still in the future expireStaleApprovals (D3, issue #349) @cap:approuver-une-action/moteur does NOT rewrite a request a human already decided, deadline or not expireStaleApprovals (D3, issue #349) @cap:approuver-une-action/moteur leaves a cancelled job terminal: an expired request never resurrects it task-board children and the conversation @cap:approuver-une-action/moteur a task-board child is born with its creator job conversation_id, at every depth une demande sans réponse expire, et le travail reprend @cap:approuver-une-action/moteur un outil gaté : la demande passe en `expired`, le job repart, et le modèle lit l'expiration une demande sans réponse expire, et le travail reprend @cap:approuver-une-action/moteur une QUESTION suit la même règle : expirée, elle rend une erreur, pas une réponse inventée approval rules are re-read while the job runs @cap:approuver-une-action/moteur a rule written WHILE the job waits governs the rest of that same run: the second call runs without asking again approval rules are re-read while the job runs @cap:approuver-une-action/moteur witness, same run without the rule: the second call asks again approval rules are re-read while the job runs @cap:approuver-une-action/moteur a rule written BETWEEN two turns, with no approval in between, applies at the next turn approval rules are re-read while the job runs @cap:approuver-une-action/moteur the auto_run_paused brake still bites after a reload: an auto_approve rule stays suspended turn after turn executeJob — approval gate (Bugs A, B, C) an approval-gated call next to return_result: the suspended transcript is valid (#561) @cap:approuver-une-action/moteur un appel approuvé ne tourne qu’une fois quand le job change de run (#566) @cap:approuver-une-action/moteur repris PENDANT l’outil : il ne tourne qu’une fois, et le run suivant dit au modèle que l’issue est inconnue un appel approuvé ne tourne qu’une fois quand le job change de run (#566) @cap:approuver-une-action/moteur repris APRÈS l’outil : le résultat consigné par le premier run est repris, sans seconde exécution un appel approuvé ne tourne qu’une fois quand le job change de run (#566) @cap:approuver-une-action/moteur la demande disparaît au moment de la réserver : l’appel ne tourne pas, le modèle le lit, le job continue la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur ne crée AUCUNE ligne d’approbation quand l’agent n’a pas dit pourquoi la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur le refus dit que RIEN n’est arrêté et que le même appel, avec `purpose`, suffit (#505) la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur une raison faite d’espaces ne compte pas — la carte la lirait comme absente la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur avec la phrase, la ligne existe et PORTE la phrase, mot pour mot la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur un outil gaté par une RÈGLE, et non par sa posture, est tenu à la même règle la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur un appel AUTO-APPROUVÉ ne doit rien : il ne passe devant personne la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur un outil YOLO (règle auto_approve) reste exécutable sans phrase la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur un appel BLOQUÉ garde son refus à lui — la raison n’aurait rien changé la porte d’approbation exige la raison de l’agent @cap:approuver-une-action/moteur une QUESTION posée à la personne n’exige rien : son texte EST le message explainApprovalRules @cap:approuver-une-action/moteur orders every matching rule most specific first, and marks only the first as winning explainApprovalRules @cap:approuver-une-action/moteur reproduces issue #346: an Everyone rule NAMING the tool beats the agent server wildcard explainApprovalRules @cap:approuver-une-action/moteur ignores rules belonging to another agent or another entity explainApprovalRules @cap:approuver-une-action/moteur returns an empty chain when nothing matches, so the caller falls back to the tool default explainApprovalRules @cap:approuver-une-action/moteur hands back the WINNING row even when two rules share an id explainApprovalRules @cap:approuver-une-action/moteur never marks a second winner, whatever the array order explainApprovalRules — the folder condition @cap:approuver-une-action/moteur applies, and wins over everything, when the job works in that folder explainApprovalRules — the folder condition @cap:approuver-une-action/moteur is left out entirely when the job works somewhere else, and the next rule decides explainApprovalRules — the folder condition @cap:approuver-une-action/moteur is inapplicable when the caller supplies no workspaces at all explainApprovalRules — the folder condition @cap:approuver-une-action/moteur matches the same folder written with backslashes and a different case, on win32 explainApprovalRules — the folder condition @cap:approuver-une-action/moteur keeps case significant on a POSIX platform explainApprovalRules — the folder condition @cap:approuver-une-action/moteur treats an empty condition object as no condition normaliseWorkspacePath @cap:approuver-une-action/moteur unifies separators, drops trailing ones and collapses . and .. segments normaliseWorkspacePath @cap:approuver-une-action/moteur lowercases on win32 only normaliseWorkspacePath @cap:approuver-une-action/moteur keeps a bare drive prefix, so C: and D: stay different places normaliseWorkspacePath @cap:approuver-une-action/moteur keeps a UNC path distinct from a POSIX one normaliseWorkspacePath @cap:approuver-une-action/moteur workspaceMatches says no when the list is empty une condition ne change pas de tier @cap:approuver-une-action/moteur un joker conditionne ne bat PAS un block pose sur l agent et l outil exact resolveToolDefaultApproval @cap:approuver-une-action/moteur asks first for every MCP tool, whatever the server resolveToolDefaultApproval @cap:approuver-une-action/moteur asks first for the safe-by-default product tools resolveToolDefaultApproval @cap:approuver-une-action/moteur runs without asking for an ordinary tool the tool-default list the approval card reads @cap:approuver-une-action/moteur agrees with every built-in tool the registry actually holds the tool-default list the approval card reads @cap:approuver-une-action/moteur lists no name the registry does not know, apart from the connector tools it declares the tool-default list the approval card reads @cap:approuver-une-action/moteur stays sorted, so a hand edit never hides a duplicate executeTool — destructive_gate workspace @cap:approuver-une-action/moteur auto-approves ORDINARY run_command (no prompt) executeTool — destructive_gate workspace @cap:approuver-une-action/moteur STILL gates a heavy install (comfy install) — the 13 GB case executeTool — destructive_gate workspace @cap:approuver-une-action/moteur STILL gates a deletion (rm -rf ./build) executeTool — destructive_gate workspace @cap:approuver-une-action/moteur STILL gates a `destructive` riskLevel tool regardless of command executeTool — destructive_gate workspace @cap:approuver-une-action/moteur STILL gates run_skill_script (opaque content — cannot judge ordinary vs heavy) executeTool — destructive_gate workspace @cap:approuver-une-action/moteur an explicit auto_approve rule still overrides the run_skill_script gate la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur REQUIS pour un outil qui demande d’abord par sa posture la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur REQUIS pour un outil qu’une règle de CET agent fait demander d’abord la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur OPTIONNEL pour un outil autonome — la phrase reste à portée de main la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur OPTIONNEL quand une règle Yolo relâche un outil normalement gaté la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur le message porté par le champ requis dit quoi faire, et nomme l’outil la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur ne réécrit pas le `purpose` d’un outil qui en déclare déjà un la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur laisse intact un outil qui POSE une question la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur laisse intact un outil dont l’entrée n’est pas un objet la liste d’outils d’un job expose `purpose` @cap:approuver-une-action/moteur n’altère pas le schéma d’origine — la définition partagée reste la sienne aucun outil livré ne tombe dans ce trou @cap:approuver-une-action/moteur tout outil du registre prend un OBJET en entrée aucun outil livré ne tombe dans ce trou @cap:approuver-une-action/moteur et reçoit donc bien le champ, gaté ou non an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur is answered from that decision: no second card, nothing executed, the model is told an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur a call that differs by more than its purpose is a new request an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur another run asking the same call is asked again: the decision belongs to its run an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur a tool whose own argument is `purpose`: another purpose is another call, the same one is answered an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur once the agent has done something else in the run, the identical call is put to the owner again an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur the identical call executed later (a rule allowed it) makes the old refusal stale an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur the latest refusal answers, not an older one made stale since an identical call the owner already rejected in this run (#492) @cap:approuver-une-action/moteur an EXPIRED request is not a refusal: asking again is allowed run_command gating @cap:approuver-une-action/moteur is registered but NOT always-on run_command gating @cap:approuver-une-action/moteur reaches an agent ONLY when run_command is in the requiredBuiltins union la règle confinée à un dossier @cap:approuver-une-action/moteur écrit condition_json avec le chemin, sans migration la règle confinée à un dossier @cap:approuver-une-action/moteur refuse un dossier qui n’est pas attaché à cet agent la règle confinée à un dossier @cap:approuver-une-action/moteur refuse une condition sur une règle Everyone la règle confinée à un dossier @cap:approuver-une-action/moteur un changement qui RESTREINT retire la condition, et c’est voulu la règle confinée à un dossier @cap:approuver-une-action/moteur un changement qui garde le dossier le GARDE vraiment rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur une autorisation GLOBALE sur le même outil est refusée, et nomme le dossier rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur la bascule Yolo de run_command est refusée plutôt que d’écraser le dossier rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur la bascule Yolo de code_task est refusée de la même façon rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur le motif MCP de l’onglet Connectors est refusé quand il porte une limite de dossier rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur le drapeau explicite, lui, retire la condition et laisse une règle sans dossier rien n’élargit une règle de dossier en silence @cap:approuver-une-action/moteur le drapeau à false ne vaut pas accord la chaîne d’une demande SANS agent @cap:approuver-une-action/moteur lit quand même les règles Everyone, au lieu de dire « Tool default » listApprovalsAction by conversation (#469) @cap:approuver-une-action/moteur returns the pending approvals of the conversation's runs, delegates included, and no other listApprovalsAction by conversation (#469) @cap:approuver-une-action/moteur never shows a request of another workspace, even one carrying the same conversation id listApprovalsAction carries the gate reasons (#464) @cap:approuver-une-action/moteur reads them back, masked la lecture de RECENTS @cap:approuver-une-action/moteur écarte ce qui ATTEND ENCORE, et garde les trois réponses rendues la lecture de RECENTS @cap:approuver-une-action/moteur classe par date de RÉPONSE, la dernière rendue d’abord la lecture de RECENTS @cap:approuver-une-action/moteur retombe sur le nom de l’OUTIL quand l’agent a disparu |
| Run a command required Can I let it run a command on my machine? screen passed · engine passed
|
passed
Run commands: three choices, Block reads back, and no rule lets the workspace decide @cap:executer-une-commande/ecran |
passed
un instantané qui dépasse la borne @cap:executer-une-commande/moteur rend le code `snapshot_timeout` ET les faits mesurés du dossier un instantané qui dépasse la borne @cap:executer-une-commande/moteur dit la phrase actionnable : la taille, le nombre de fichiers, la borne, le geste un instantané qui dépasse la borne @cap:executer-une-commande/moteur le message du refus ajoute la conséquence, jamais une deuxième version de la cause 143 moreun instantané qui dépasse la borne @cap:executer-une-commande/moteur la ligne de journal porte le code et chaque mesure un instantané qui dépasse la borne @cap:executer-une-commande/moteur la borne vient aussi de l’environnement, pour un dossier gros mais légitime un instantané qui dépasse la borne @cap:executer-une-commande/moteur un chemin très long est raccourci PAR LE MILIEU et la phrase finit par le geste une PANNE n’est jamais lue comme une réponse @cap:executer-une-commande/moteur une borne dépassée REJETTE au lieu de rendre une chaîne vide une PANNE n’est jamais lue comme une réponse @cap:executer-une-commande/moteur la chaîne des instantanés ne repart JAMAIS d’un commit racine une LECTURE du magasin ne ment pas non plus @cap:executer-une-commande/moteur `listCheckpoints` LÈVE au lieu de rendre une liste vide une LECTURE du magasin ne ment pas non plus @cap:executer-une-commande/moteur `diffFile` LÈVE au lieu de dire qu’un fichier photographié est hors instantané une LECTURE du magasin ne ment pas non plus @cap:executer-une-commande/moteur la ligne de journal d’une lecture dit son opération une PANNE n’est jamais lue comme une réponse @cap:executer-une-commande/moteur une ref absente est une RÉPONSE : la lecture rend une chaîne vide une LECTURE du magasin ne ment pas non plus @cap:executer-une-commande/moteur un dossier jamais photographié rend TOUJOURS une liste vide une LECTURE du magasin ne ment pas non plus @cap:executer-une-commande/moteur un chemin réellement absent des deux états rend TOUJOURS `not_in_snapshot` un instantané ordinaire ne change pas @cap:executer-une-commande/moteur rend un checkpoint avec son sha, borne par défaut un instantané ordinaire ne change pas @cap:executer-une-commande/moteur rend toujours `null` quand rien n’a bougé, borne explicite ou non un instantané ordinaire ne change pas @cap:executer-une-commande/moteur refuse une borne absurde au lieu de retomber en silence sur le défaut les autres causes portent un AUTRE code @cap:executer-une-commande/moteur `git_missing` quand le binaire est introuvable les autres causes portent un AUTRE code @cap:executer-une-commande/moteur `snapshot_failed` quand le magasin est inutilisable la mesure est bornée et le DIT @cap:executer-une-commande/moteur s’arrête au plafond de fichiers et rend des planchers, pas des totaux la mesure est bornée et le DIT @cap:executer-une-commande/moteur une mesure arrêtée se lit « more than », jamais comme un total la mesure est bornée et le DIT @cap:executer-une-commande/moteur saute EXACTEMENT les dossiers que le magasin met dans son fichier d’exclusion la mesure est bornée et le DIT @cap:executer-une-commande/moteur ne compte pas non plus les FICHIERS que l’instantané exclut la mesure est bornée et le DIT @cap:executer-une-commande/moteur les suffixes exclus sont EXACTEMENT ceux que le magasin écrit comme motifs la mesure est bornée et le DIT @cap:executer-une-commande/moteur ne descend pas dans les dossiers que l’instantané exclut déjà la phrase est bornée SANS perdre son geste @cap:executer-une-commande/moteur une sortie de git interminable est coupée, et le dit les chiffres se lisent pareil partout @cap:executer-une-commande/moteur les octets, en unités que `du -sh` rendrait les chiffres se lisent pareil partout @cap:executer-une-commande/moteur les milliers, sans dépendre de la locale du processus les chiffres se lisent pareil partout @cap:executer-une-commande/moteur les durées, en secondes dès qu’elles en valent une migration 0125_shell_checklist @cap:executer-une-commande/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0125_shell_checklist @cap:executer-une-commande/moteur agents.shell_policy et approval_requests.gate_reasons existent : jsonb, facultatifs migration 0125_shell_checklist @cap:executer-une-commande/moteur la reprise : un agent Yolo (sans condition) garde tout ; les autres restent à NULL migration 0128_shell_policy_retired_kinds @cap:executer-une-commande/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0128_shell_policy_retired_kinds @cap:executer-une-commande/moteur le vrai migrateur applique 0128 : sa ligne d’historique porte l’empreinte du fichier migration 0128_shell_policy_retired_kinds @cap:executer-une-commande/moteur retire les deux sortes, reporte own_script sur inline_code, et laisse les autres lignes migration 0128_shell_policy_retired_kinds @cap:executer-une-commande/moteur retire les raisons des deux sortes sur les demandes, et vide celles qui n’avaient qu’elles run-job : l’instantané AVANT binding.run (P11) un tour refusé par la BORNE nomme la taille du dossier et le geste @cap:executer-une-commande/moteur run_command — the agent checklist reaches the gate (#464) @cap:executer-une-commande/moteur under destructive_gate, a delete suspends the job with the kind of action named splitShellWords @cap:executer-une-commande/moteur keeps a quoted path with a space as one word, and cuts on && and pipes staticShellCategories @cap:executer-une-commande/moteur names the kind of each heavy action staticShellCategories @cap:executer-une-commande/moteur covers exactly what destructive_gate has always gated staticShellCategories @cap:executer-une-commande/moteur a script run from a file is not read, and a path outside is not a kind of action staticShellCategories @cap:executer-une-commande/moteur comfy: the download subcommand downloads, its status, list and cancel siblings do nothing a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur comfy --json model download --url "https://huggingface.co/x/y.safetensors" --relative-path models/checkpoints is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur pip download torch -d wheels is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur pip3 download numpy==2.1 is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur python -m pip download requests is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur hf download black-forest-labs/FLUX.1-dev flux1-dev.safetensors --local-dir models/unet is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur huggingface-cli download stabilityai/sdxl-turbo --local-dir models is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur ollama pull llama3.3 is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git lfs pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git lfs fetch --all is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker pull comfyui/comfyui:latest is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur podman pull docker.io/library/alpine is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur aria2c -x 16 https://example.com/model.safetensors is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur wget https://example.com/a.zip is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git clone https://github.com/comfyanonymous/ComfyUI is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker image pull comfyui/comfyui:latest is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur podman image pull docker.io/library/alpine is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker compose pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker compose -f stack.yml pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker --context remote pull alpine is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git -C models/unet lfs pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git -c lfs.concurrenttransfers=8 lfs fetch --all is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git --no-pager lfs pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git -C repos clone https://github.com/x/y is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker-compose pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur docker-compose -f stack.yml pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur podman-compose pull is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur huggingface-cli --token hf_x download org/model is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur OLLAMA_HOST=127.0.0.1:11435 ollama pull llama3 is a download, not an install a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur pip install pandas is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur python -m pip install torch is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur npm i express is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur pnpm add lodash is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur go install golang.org/x/tools/gopls@latest is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur cargo install ripgrep is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur uv pip install torch is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur comfy node install comfyui-impact-pack is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur comfy install is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur winget install Git.Git is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur brew install ffmpeg is an install, not a download a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur destructive_gate still gates every one of them: the union did not shrink a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur reading or stopping a download is neither (#552), and neither is a version or help check a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur a --help after the arguments does not excuse a delete, a stop or a system change a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur the catastrophic floor lets a bare version or help check through, nothing more a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur git global options do not hide the destructive VCS commands either a command is filed by what it does: fetching is download, installing is install_software (#581) @cap:executer-une-commande/moteur a version check chained to a real action still gates the action resolveShellPolicy @cap:executer-une-commande/moteur asks for everything when nothing is stored resolveShellPolicy @cap:executer-une-commande/moteur keeps what was set and defaults the rest resolveShellPolicy @cap:executer-une-commande/moteur refuses a stored value it cannot read, instead of guessing review of PR #474 (Reviewer A): the program that runs, not a word of the text @cap:executer-une-commande/moteur a MENTION in an argument is not the action (P1, false red) review of PR #474 (Reviewer A): the program that runs, not a word of the text @cap:executer-une-commande/moteur the action is still read where the shell runs it: wrappers, substitutions, paths review of PR #474 (Reviewer A): the program that runs, not a word of the text @cap:executer-une-commande/moteur closes the list gaps: npm i, pnpm add, curl > file, chmod, chown, net stop (P1) review of PR #474 (Reviewer A): the program that runs, not a word of the text @cap:executer-une-commande/moteur inline code is its own kind, whatever it does review of PR #476 (Reviewer C): the program a command really runs @cap:executer-une-commande/moteur pip run as a Python module installs too (P1, a regression against main) review of PR #476 (Reviewer C): the program a command really runs @cap:executer-une-commande/moteur a variable set before the program does not hide it (P2) review of PR #476 (Reviewer C): the program a command really runs @cap:executer-une-commande/moteur curl writing to a file through grouped short options downloads (P2) review of PR #476 (Reviewer C): the program a command really runs @cap:executer-une-commande/moteur iwr downloads like Invoke-WebRequest (P3) le refus NOMME sa cause @cap:executer-une-commande/moteur un run_command refusé rend le code, les chiffres mesurés et le geste le refus NOMME sa cause @cap:executer-une-commande/moteur écrit UNE ligne de journal avec le code et les mesures executeTool — run_command hardline floor @cap:executer-une-commande/moteur Yolo auto-approves an ordinary command (control) executeTool — run_command hardline floor @cap:executer-une-commande/moteur Yolo CANNOT auto-approve a catastrophic command → forced to await approval executeTool — run_command hardline floor @cap:executer-une-commande/moteur floor applies to a chained catastrophic command too a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur the descriptions of every process-starting tool carry the rule, word for word a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_command, several workspaces, at the root: the exact text a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_command, one workspace, at the root: the same rule, without other workspaces a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_command in a sub-folder: the example is right for THAT folder a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur a workspace configured through a junction: its root is still recognised a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur nested workspaces: the deepest one that contains the cwd is named a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_skill_script, skill folder in no workspace: the exact text a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_skill_script, skill folder INSIDE a workspace: says which one a process started by a tool says how it addresses files (#592) @cap:executer-une-commande/moteur run_skill_script, agent with no workspace: only where it ran run_command builtin @cap:executer-une-commande/moteur captures stdout and exit code 0 from a real command run_command builtin @cap:executer-une-commande/moteur captures stderr and a non-zero exit code (returned, not thrown) run_command builtin @cap:executer-une-commande/moteur runs a compound command (&&) as a single call run_command builtin @cap:executer-une-commande/moteur runs in the agent workspace as its working directory run_command builtin @cap:executer-une-commande/moteur resolves an explicit cwd inside the workspace run_command builtin @cap:executer-une-commande/moteur times out and kills a long-running command (with its children) run_command builtin @cap:executer-une-commande/moteur caps very large output (truncated=true, ≤ cap) run_command builtin @cap:executer-une-commande/moteur fails loud when the agent has no workspace configured run_command builtin @cap:executer-une-commande/moteur rejects a cwd that escapes the workspace (path_traversal_blocked) run_command — per-agent command allowlist @cap:executer-une-commande/moteur runs a command that is on the allowlist run_command — per-agent command allowlist @cap:executer-une-commande/moteur refuses a command that is not on the allowlist, and nothing runs run_command — per-agent command allowlist @cap:executer-une-commande/moteur refuses the unlisted half of a compound command that starts with a listed one run_command — per-agent command allowlist @cap:executer-une-commande/moteur leaves behaviour unchanged when no allowlist is configured run_command with a list runs NO shell @cap:executer-une-commande/moteur runs a listed program and returns its real output run_command with a list runs NO shell @cap:executer-une-commande/moteur groups an argument with double quotes, and a single quote inside is just a character run_command with a list runs NO shell @cap:executer-une-commande/moteur refuses chaining: there is no shell to chain with run_command with a list runs NO shell @cap:executer-une-commande/moteur refuses the caret, which five passes of scanner could never read safely run_command with a list runs NO shell @cap:executer-une-commande/moteur refuses a variable, which nothing would expand anyway run_command with a list runs NO shell @cap:executer-une-commande/moteur names the character to remove, so the agent can rewrite its command run_command with a list runs NO shell @cap:executer-une-commande/moteur runs a multi-word entry (npx vitest) through its real launcher run_command with a list runs NO shell @cap:executer-une-commande/moteur resolves the program from the PATH, never from the working directory run_command with a list runs NO shell @cap:executer-une-commande/moteur leaves an agent with NO list on the shell, unchanged the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur "ask" holds the command, with each kind of action and the command named the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur download allowed, install asked: a model or package download runs, an install is held (#581) the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur "never" blocks, tells the agent what, and asks no one the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur an ordinary command runs as before the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur inline code asks, and "never" refuses it the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur what the owner allows runs: a deletion allowed for this agent is not asked the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur a Yolo rule does not lift a "never": the list only hardens the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur a Yolo agent as migration 0125 leaves it runs everything unasked the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur without a checklist (a replay a human approved), the command is not judged again the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur a declared proof is judged the same way: its commands will run unasked later the autonomy checklist at the gate (#464) @cap:executer-une-commande/moteur a mention of rm in a commit message does not refuse the commit (review of PR #474, P1) |
| Work on my files required Can I hand it a folder and find what it wrote there? screen passed · engine passed
|
passed
Dossiers d’un agent @cap:travailler-sur-des-fichiers/ecran choisir un dossier dans Browse… l’ajoute ; un libellé pris se dit et se corrige workspacesSubtitle @cap:travailler-sur-des-fichiers/ecran dit le total, les deux origines, et ce qui attend workspacesSubtitle @cap:travailler-sur-des-fichiers/ecran ne dit RIEN quand rien n’attend, et ne pluralise pas un projet unique 103 more/code @cap:travailler-sur-des-fichiers/ecran redirige vers Workspaces, la seule page des projets la taille d’un espace à l’écran @cap:travailler-sur-des-fichiers/ecran écrit la taille lue et la durée de la dernière photo la taille d’un espace à l’écran @cap:travailler-sur-des-fichiers/ecran dit le PLANCHER quand le comptage s’est arrêté avant la fin la taille d’un espace à l’écran @cap:travailler-sur-des-fichiers/ecran dit qu’il MESURE tant que la lecture n’a pas répondu la taille d’un espace à l’écran @cap:travailler-sur-des-fichiers/ecran DIT un transport qui casse, au lieu de mesurer pour toujours la taille d’un espace à l’écran @cap:travailler-sur-des-fichiers/ecran DIT une lecture en échec, au lieu de laisser la ligne muette DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran une plaque par fichier, REPLIÉE, avec le chemin et « +N −M » DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran le clic déplie la plaque et montre les lignes du diff DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran le second fichier ne redemande rien : un appel par travail DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran deux fichiers au MÊME chemin affiché gardent chacun SON diff DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran les plaques vont de BORD À BORD, directement sous les cellules DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran un travail sans changement de fichier ne dessine aucune plaque DeliveryBlock — le diff de chaque fichier @cap:travailler-sur-des-fichiers/ecran un chargement qui échoue le DIT, il n’affirme pas une absence DeliveryBlock — un média livré se montre, se joue, se télécharge (#490) @cap:travailler-sur-des-fichiers/ecran la piste, l’image et la vidéo à la place du diff, servies par la route du run DeliveryBlock — un média livré se montre, se joue, se télécharge (#490) @cap:travailler-sur-des-fichiers/ecran deux médias au même chemin affiché demandent chacun le sien, par leur rang DeliveryBlock — un média livré se montre, se joue, se télécharge (#490) @cap:travailler-sur-des-fichiers/ecran un média que la route refuse DIT pourquoi, au lieu d’un lecteur muet DeliveryBlock — un média livré se montre, se joue, se télécharge (#490) @cap:travailler-sur-des-fichiers/ecran un fichier vide se dit vide (la route répond 416 sans corps) NewProjectButton — la case git @cap:travailler-sur-des-fichiers/ecran la case existe et elle est DÉCOCHÉE NewProjectButton — la case git @cap:travailler-sur-des-fichiers/ecran sans la cocher, la création ne demande AUCUN dépôt NewProjectButton — la case git @cap:travailler-sur-des-fichiers/ecran cochée, la création demande le dépôt ProjectGitPanel — l’option git @cap:travailler-sur-des-fichiers/ecran l’interrupteur est ÉTEINT tant que personne ne l’a allumé ProjectGitPanel — l’option git @cap:travailler-sur-des-fichiers/ecran dit ce que l’option apporte, et ce qu’elle ne fait pas ProjectGitPanel — l’option git @cap:travailler-sur-des-fichiers/ecran une fois le dépôt posé, l’écran dit QUAND — le fait, pas l’intention ProjectGitPanel — l’option git @cap:travailler-sur-des-fichiers/ecran option ON sur un dossier qui était DÉJÀ un dépôt : aucune date inventée ProjectGitPanel — l’option git @cap:travailler-sur-des-fichiers/ecran hors propriétaire : l’interrupteur est désactivé ET la raison est écrite ProjectPanel @cap:travailler-sur-des-fichiers/ecran s’ouvre par DÉFAUT, à côté des conversations ProjectPanel @cap:travailler-sur-des-fichiers/ecran le bouton le ferme, puis le rouvre ProjectPanel @cap:travailler-sur-des-fichiers/ecran ne se souvient PAS d’une visite à l’autre : ouvert de nouveau, sans flash ProjectPanel @cap:travailler-sur-des-fichiers/ecran `/files` ouvre le panneau, comme toute autre adresse ProjectPanel @cap:travailler-sur-des-fichiers/ecran un stockage qui refuse ne change rien : rien ne le lit ProjectScreen — l’ordre de la page @cap:travailler-sur-des-fichiers/ecran en-tête avec le chemin, puis les actions, puis le contenu, puis le panneau flottant ProjectScreen — l’ordre de la page @cap:travailler-sur-des-fichiers/ecran le corps a la largeur des autres pages, et le panneau est une colonne à côté ProjectScreen — l’ordre de la page @cap:travailler-sur-des-fichiers/ecran AUCUN retour, et les gestes sont à la taille standard ProjectScreen — l’ordre de la page @cap:travailler-sur-des-fichiers/ecran les trois gestes du projet sont sur la rangée d’actions WorkspacesList @cap:travailler-sur-des-fichiers/ecran nomme chaque projet du registre et pointe vers sa page WorkspacesList @cap:travailler-sur-des-fichiers/ecran montre le CHEMIN de chaque ligne, ENTIER, et le garde entier au survol WorkspacesList @cap:travailler-sur-des-fichiers/ecran un chemin LONG est rendu en entier : c’est le CSS qui coupe, pas un compteur WorkspacesList @cap:travailler-sur-des-fichiers/ecran ne dit PLUS l’agent, ni les comptes, ni la dernière activité WorkspacesList @cap:travailler-sur-des-fichiers/ecran sans rien de masqué, AUCUN contrôle « Hidden » ne paraît WorkspacesList @cap:travailler-sur-des-fichiers/ecran chaque ligne porte un DOSSIER, jamais un visage WorkspacesList @cap:travailler-sur-des-fichiers/ecran les deux sortes de lignes sont dans la MÊME liste WorkspacesList @cap:travailler-sur-des-fichiers/ecran un dossier détecté est marqué, n’ouvre AUCUNE page, et porte ses deux gestes WorkspacesList @cap:travailler-sur-des-fichiers/ecran la pastille de preuve dit l’état, sans jamais peindre une absence en rouge WorkspacesList @cap:travailler-sur-des-fichiers/ecran un projet de DOCUMENTS se dit ; le code, cas ordinaire, n’a pas d’étiquette WorkspacesList @cap:travailler-sur-des-fichiers/ecran un projet de DOCUMENTS ne porte AUCUNE pastille de preuve WorkspacesList @cap:travailler-sur-des-fichiers/ecran une ligne SANS date ne porte pas de tiret à sa place WorkspacesList @cap:travailler-sur-des-fichiers/ecran les masqués sont COMPTÉS et retrouvables, jamais effacés WorkspacesList @cap:travailler-sur-des-fichiers/ecran un projet RETIRÉ n’est pas dans la liste, et il est sous « Hidden » WorkspacesList @cap:travailler-sur-des-fichiers/ecran le contrôle « Hidden » est un dépliant annoncé, pas un lien la section Hidden de la page Projects @cap:travailler-sur-des-fichiers/ecran « Hidden (2) » déplie les deux projets retirés, et dit ce que ses gestes font la section Hidden de la page Projects @cap:travailler-sur-des-fichiers/ecran « Show in list » remet le projet dans la liste : `hidden: false`, sur SON chemin la section Hidden de la page Projects @cap:travailler-sur-des-fichiers/ecran un dossier DÉTECTÉ retiré porte le MÊME geste, sur son chemin à lui « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran n’est PAS sur un projet visible : la liste principale n’offre rien de tel « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran apparaît sous « Hidden », à côté de « Show in list », sur le projet du REGISTRE « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran n’est PAS offert sur un dossier DÉTECTÉ masqué : sa ligne n’est qu’un masquage « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran demande confirmation, et la confirmation porte les TROIS faits « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran confirmer appelle l’action sur LE chemin de ce projet « Forget » sur un projet masqué @cap:travailler-sur-des-fichiers/ecran annuler ne ferme pas seulement la question : rien n’est envoyé les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran sans rien d’écarté, AUCUNE section ne paraît les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran elle paraît MÊME SANS projet masqué : c’est le cas qui suit un oubli les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran repliée, elle COMPTE sans mettre un seul chemin dans le DOM les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran dépliée, elle montre chaque chemin, son geste, et DIT ce qu’être écarté veut dire les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran « Detect again » envoie SON chemin à l’action, pas celui de la ligne d’à côté les dossiers écartés de la page Projects @cap:travailler-sur-des-fichiers/ecran le contrôle est un dépliant annoncé, pas un lien activityRows @cap:travailler-sur-des-fichiers/ecran mêle les deux sortes dans UNE liste, de la plus récente à la plus ancienne activityRows @cap:travailler-sur-des-fichiers/ecran une ligne de CONVERSATION ouvre le fil ; une SESSION ouvre la page du run activityRows @cap:travailler-sur-des-fichiers/ecran chaque ligne montre SON agent : il change d’une ligne à l’autre dans un projet activityRows @cap:travailler-sur-des-fichiers/ecran ce qui ATTEND se pose sur la ligne qui le porte, et sur aucune autre activityRows @cap:travailler-sur-des-fichiers/ecran une demande sans conversation NI job de tête ne se pose sur aucune ligne activityRows @cap:travailler-sur-des-fichiers/ecran un run BLOQUÉ sur une approbation le dit, même sans demande enregistrée activityRows @cap:travailler-sur-des-fichiers/ecran un run VIVANT allume son point, un run fini ne l’allume pas activityRows @cap:travailler-sur-des-fichiers/ecran le NON LU d’un fil arrive jusqu’à la ligne ; un run n’est jamais non lu activityRows @cap:travailler-sur-des-fichiers/ecran un fil que personne n’a nommé s’écrit « Untitled », jamais un titre vide sessionTitle @cap:travailler-sur-des-fichiers/ecran nomme le harnais et la provenance sessionTitle @cap:travailler-sur-des-fichiers/ecran sans harnais connu, « Session » — jamais un nom de produit deviné les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran une conversation dit l’agent, la dernière phrase et ses sessions les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran un fil sans session ne dit PAS « 0 sessions inside » les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran le singulier ne s’écrit jamais au pluriel les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran un fil dont rien n’est connu n’écrit pas de sous-ligne du tout les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran une session dit qu’elle est SEULE, et où elle en est les sous-lignes de l’activité @cap:travailler-sur-des-fichiers/ecran un statut que le produit ne connaît pas passe TEL QUEL, jamais traduit au hasard projectFactsLine @cap:travailler-sur-des-fichiers/ecran dit l’agent, le dossier, le dépôt et les deux comptes projectFactsLine @cap:travailler-sur-des-fichiers/ecran un dossier qui n’est PAS un dépôt ne le dit pas — il se tait projectFactsLine @cap:travailler-sur-des-fichiers/ecran un projet NEUF ne compte pas jusqu’à zéro projectFactsLine @cap:travailler-sur-des-fichiers/ecran sans responsable, aucun tiret ne prend sa place — le dossier ouvre la phrase projectFactsLine @cap:travailler-sur-des-fichiers/ecran le singulier ne s’écrit jamais au pluriel FolderPickerModal @cap:travailler-sur-des-fichiers/ecran un double clic ne remet le dossier qu’une fois FolderPickerModal @cap:travailler-sur-des-fichiers/ecran s’ouvre sur startPath, pas sur les racines FolderPickerModal @cap:travailler-sur-des-fichiers/ecran un ajout qui ÉCHOUE (action rejetée) garde la fenêtre ouverte et le dit FolderPickerModal @cap:travailler-sur-des-fichiers/ecran pendant l’ajout, la navigation est verrouillée aussi FolderPickerModal @cap:travailler-sur-des-fichiers/ecran pendant l’ajout, Cancel est désactivé FolderPickerModal @cap:travailler-sur-des-fichiers/ecran pendant l’ajout, Échap ne ferme pas la fenêtre FolderPickerModal @cap:travailler-sur-des-fichiers/ecran un browse qui ÉCHOUE ne laisse pas la fenêtre sur « Loading… » FolderPickerModal @cap:travailler-sur-des-fichiers/ecran un startPath disparu : les racines, et le dire pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran sans libellé tapé : le nom du dossier, POSIX, Windows ou UNC pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran un libellé tapé passe avant le nom du dossier, rogné pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran une racine sans nom : refusée, et dit pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran un libellé déjà porté par l’agent : refusé AVANT le serveur, en le nommant pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran un nom de dossier trop long est coupé à 80, la limite du serveur pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran settled : un rejet devient un échec dit, jamais une exception pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran une racine de lecteur Windows n’a pas de nom non plus pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran labelAfterRefusal : le libellé en cause ne remplit le champ que pour un conflit pickedFolderLabel @cap:travailler-sur-des-fichiers/ecran folderName rend "" pour une racine POSIX |
passed
statusAgainstFrozenIndex names each cause @cap:travailler-sur-des-fichiers/moteur a real read answers the status statusAgainstFrozenIndex names each cause @cap:travailler-sur-des-fichiers/moteur git that hangs past the bound is snapshot_status_timeout statusAgainstFrozenIndex names each cause @cap:travailler-sur-des-fichiers/moteur an output longer than the buffer is snapshot_status_too_large, not a timeout 249 morestatusAgainstFrozenIndex names each cause @cap:travailler-sur-des-fichiers/moteur a git that cannot be launched is git_missing statusAgainstFrozenIndex names each cause @cap:travailler-sur-des-fichiers/moteur an index git refuses is snapshot_status_failed freezeSnapshotIndex @cap:travailler-sur-des-fichiers/moteur copies the index with its date, and leaves nothing behind once released migration 0120_excluded_project_paths @cap:travailler-sur-des-fichiers/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0120_excluded_project_paths @cap:travailler-sur-des-fichiers/moteur carries the four columns the exclusion needs, all required but the id default migration 0120_excluded_project_paths @cap:travailler-sur-des-fichiers/moteur refuses a second exclusion of the same folder in the same space, and allows it in another migration 0120_excluded_project_paths @cap:travailler-sur-des-fichiers/moteur drops the exclusions of a space that is deleted migration 0120_excluded_project_paths @cap:travailler-sur-des-fichiers/moteur records the migration in the journal drizzle-kit actually reads migration 0119_job_checkpoints_snapshot_ms @cap:travailler-sur-des-fichiers/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0119_job_checkpoints_snapshot_ms @cap:travailler-sur-des-fichiers/moteur snapshot_ms existe, entière, NULLABLE et sans défaut migration 0119_job_checkpoints_snapshot_ms @cap:travailler-sur-des-fichiers/moteur l’index qui sert « la dernière photo de cet espace » existe, en DESC migration 0119_job_checkpoints_snapshot_ms @cap:travailler-sur-des-fichiers/moteur une durée négative est REFUSÉE ; zéro et NULL passent, et diffèrent createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur asks OpenRouter /audio/speech for pcm with the model, text and voice, and returns a WAV of those samples createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur reads the sample rate from the answer when it names one createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur a bitrate parameter is not read as the sample rate createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur an odd number of bytes is a cut stream: refused, never wrapped createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur a 200 that is not audio is said, never wrapped into a broken file createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur pcmToWav writes a 16-bit mono RIFF header before the samples createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur sends a Gemini delivery style as provider options, never inside the spoken text createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur adds no Google option for a model that is not Google, nor for an empty style createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur refuses to build without a key createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur withGeminiStyle keeps every field and adds the provider options createOpenRouterSpeech @cap:travailler-sur-des-fichiers/moteur withGeminiStyle merges into a provider field already there, never replaces it (review of PR #488) run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur un tour RÉUSSI dans un projet enregistré rattache le job run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur le binding LÈVE : rien n’a été produit, le job ne porte aucun projet run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur un tour en ERREUR qui n’a RIEN écrit ne rattache pas run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur un tour en ERREUR qui a ÉCRIT rattache quand même run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur un run PÉRIMÉ rattache son job, mais ne déplace pas le projet courant de la conversation run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur une ligne tool_calls d’un outil NON éditeur ne vaut pas écriture run-job : le REGISTRE des projets, APRÈS binding.run (revue passe 27) @cap:travailler-sur-des-fichiers/moteur en mode read, un tour réussi ne rattache rien : rien n’a été écrit run-job : le registre se remplit tout seul (P5b) @cap:travailler-sur-des-fichiers/moteur deux fichiers écrits dans alpha/src : `alpha` (manifeste) est DÉCLARÉ et le job rattaché — pas le terrain run-job : le registre se remplit tout seul (P5b) @cap:travailler-sur-des-fichiers/moteur un tour réussi SANS ligne d’édition dans un terrain à manifeste ne déclare RIEN (passe 32) run-job : le registre se remplit tout seul (P5b) @cap:travailler-sur-des-fichiers/moteur un tour en erreur sans édition ne déclare rien run-job : le registre se remplit tout seul (P5b) @cap:travailler-sur-des-fichiers/moteur une écriture REFUSÉE par le harnais ne situe rien run-job : les écritures d’audit en vol sont attendues avant de lire les chemins (passe 33) @cap:travailler-sur-des-fichiers/moteur une insertion d’audit encore en route quand la CLI se termine est ATTENDUE, puis lue (sans horloge) run-job : les écritures d’audit en vol sont attendues avant de lire les chemins (passe 33) @cap:travailler-sur-des-fichiers/moteur une insertion d’audit qui ne se règle JAMAIS ne gèle pas le tour : borne, code, et le tour finit le cache du scan et les gestes du propriétaire @cap:travailler-sur-des-fichiers/moteur attacher PUIS masquer un dossier imbriqué prend effet tout de suite listCodeProjectsForContext — le registre @cap:travailler-sur-des-fichiers/moteur un projet DÉCLARÉ où personne n’a écrit est annoncé aux agents listCodeProjectsForContext — le registre @cap:travailler-sur-des-fichiers/moteur un projet déclaré ET détecté ne fait qu’UNE entrée, avec son activité observée listCodeProjectsForContext — le registre @cap:travailler-sur-des-fichiers/moteur MASQUER un projet déclaré le retire du contexte, exactement comme un détecté listCodeProjectsForContext — le registre @cap:travailler-sur-des-fichiers/moteur un projet de DOCUMENTS n’entre pas dans la liste des projets de CODE resolveSpeechGenerator @cap:travailler-sur-des-fichiers/moteur no active OpenRouter key: no generator, so the tool says there is no key resolveSpeechGenerator @cap:travailler-sur-des-fichiers/moteur speaks with the active OpenRouter key, decrypted, on OpenRouter /audio/speech resolveSpeechGenerator @cap:travailler-sur-des-fichiers/moteur a key that cannot be decrypted is said as such, not as "no key" la sonde git du workspace @cap:travailler-sur-des-fichiers/moteur un faux git POSÉ DANS LE WORKSPACE n’est pas celui qui répond la sonde git du workspace @cap:travailler-sur-des-fichiers/moteur « aucun git sur le PATH » fait DÉCLINER la sonde, jamais retomber sur le nom nu resolveGitBinary @cap:travailler-sur-des-fichiers/moteur écarte un SHIM BATCH posé devant le vrai binaire resolveGitBinary @cap:travailler-sur-des-fichiers/moteur prend le PREMIER dossier du PATH qui porte le binaire resolveGitBinary @cap:travailler-sur-des-fichiers/moteur sans git sur le PATH, rend null — l’appelant décline et le dit resolveGitBinary @cap:travailler-sur-des-fichiers/moteur un DOSSIER nommé git n’est pas un binaire cheminConstate @cap:travailler-sur-des-fichiers/moteur deux orthographes du même fichier donnent le MÊME chemin cheminConstate @cap:travailler-sur-des-fichiers/moteur un fichier SUPPRIMÉ garde un chemin utilisable : son dossier, résolu cheminConstate @cap:travailler-sur-des-fichiers/moteur un chemin dont RIEN n’existe est rendu tel quel, jamais inventé fusionnerConstats @cap:travailler-sur-des-fichiers/moteur garde une ligne disque DANS un dépôt : git ne voit pas tout fusionnerConstats @cap:travailler-sur-des-fichiers/moteur git passe EN PREMIER : sur un même fichier, c est son mot qui reste a shell write is constated without a git root at the workspace (#590) @cap:travailler-sur-des-fichiers/moteur workspace inside a repo rooted ABOVE it: the file is constated, and the root may send it a shell write is constated without a git root at the workspace (#590) @cap:travailler-sur-des-fichiers/moteur workspace outside any repo: the same a shell write is constated without a git root at the workspace (#590) @cap:travailler-sur-des-fichiers/moteur the script that was already there is not constated as written by this call a shell write is constated without a git root at the workspace (#590) @cap:travailler-sur-des-fichiers/moteur without a checkpoint store nothing covers the workspace, and it is said the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur only what the call wrote is constated the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur a file that was there and is rewritten is modified, not added the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur more than MAX_STATUS_ENTRIES files already there do not hide the one written the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur another job snapshotting between the before and the after does not swallow the write the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur the snapshot index is only read, and no frozen copy is left behind the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur each missing piece says its own reason the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur what the snapshot does not cover is said once per workspace AND per job the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur a deleted file is constated deleted the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur a write in a path the snapshot excludes is not constated the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur more than MAX_STATUS_ENTRIES changes since the snapshot: nothing is constated, and it is said the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur an index that cannot be copied is freeze_failed the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur an index git refuses is snapshot_status_failed, and its copy is released the fallback reads a frozen copy of the snapshot, not the store as is (#590) @cap:travailler-sur-des-fichiers/moteur the same workspace listed twice is frozen once, and no copy is left behind a call whose after is never read leaves no frozen copy (#590) @cap:travailler-sur-des-fichiers/moteur a tool that throws le seam range le constat @cap:travailler-sur-des-fichiers/moteur un run_command qui écrit SANS NOMMER est constaté par git le seam range le constat @cap:travailler-sur-des-fichiers/moteur une SUPPRESSION par le shell est constatée, ce qu’aucun outil ne savait dire le seam range le constat @cap:travailler-sur-des-fichiers/moteur un fichier écrit sous un chemin IGNORÉ ne devient pas un livrable le seam range le constat @cap:travailler-sur-des-fichiers/moteur un renommage RANGÉ DANS L’INDEX fait UNE ligne, avec son nom d’avant le seam range le constat @cap:travailler-sur-des-fichiers/moteur un renommage PAR LE SHELL fait deux lignes — c’est ce que git voit le seam range le constat @cap:travailler-sur-des-fichiers/moteur une commande lancée dans un SOUS-DOSSIER du projet est constatée par git le seam range le constat @cap:travailler-sur-des-fichiers/moteur une cible NOMMÉE sous un chemin ignoré reste dans la liste le seam range le constat @cap:travailler-sur-des-fichiers/moteur un dossier SANS dépôt retombe sur le disque, et la ligne le DIT le seam range le constat @cap:travailler-sur-des-fichiers/moteur un fichier NOMMÉ dans un dépôt n’est pas compté deux fois une ligne par fichier @cap:travailler-sur-des-fichiers/moteur deux ORTHOGRAPHES du même fichier ne font qu’une ligne currentContentWrittenByJob reads the disk last (#505) @cap:travailler-sur-des-fichiers/moteur a file changed while the records are being read is not ours currentContentWrittenByJob reads the disk last (#505) @cap:travailler-sur-des-fichiers/moteur an unchanged file whose last record is this job’s is ours generate_speech @cap:travailler-sur-des-fichiers/moteur writes the audio the generator returns into the folder, and passes model, voice and style generate_speech @cap:travailler-sur-des-fichiers/moteur defaults to Gemini 3.8 Flash TTS and the voice Kore, and adds .wav to a bare name generate_speech @cap:travailler-sur-des-fichiers/moteur never writes outside the agent folders generate_speech @cap:travailler-sur-des-fichiers/moteur refuses another extension: the file is WAV generate_speech @cap:travailler-sur-des-fichiers/moteur says there is no OpenRouter key when the runner provided no generator generate_speech @cap:travailler-sur-des-fichiers/moteur reports the provider error and writes nothing generate_speech @cap:travailler-sur-des-fichiers/moteur refuses text longer than the model takes, and an unknown model, at the schema generate_speech @cap:travailler-sur-des-fichiers/moteur an answer that is not a WAV file is refused, and nothing is written generate_speech @cap:travailler-sur-des-fichiers/moteur writes .WAV as .wav le constat par git @cap:travailler-sur-des-fichiers/moteur liste EXACTEMENT les fichiers du run, avec leur genre le constat par git @cap:travailler-sur-des-fichiers/moteur un fichier ÉCRIT SOUS UN CHEMIN IGNORÉ n’est pas livré le constat par git @cap:travailler-sur-des-fichiers/moteur un fichier DÉJÀ modifié avant le run, modifié encore pendant, est constaté le constat par git @cap:travailler-sur-des-fichiers/moteur une RESTAURATION pendant le run est une écriture, bien qu’elle vide le statut le constat par git @cap:travailler-sur-des-fichiers/moteur un RENOMMAGE fait UNE ligne, pas un ajout plus une suppression le constat par git @cap:travailler-sur-des-fichiers/moteur un COMMIT pendant le run n’invente aucune écriture le constat par git @cap:travailler-sur-des-fichiers/moteur un dossier SANS dépôt ne rend aucune racine — le run retombe sur le disque le constat par git @cap:travailler-sur-des-fichiers/moteur le périmètre est comparé sur les chemins RÉELS, pas sur leur graphie le constat par git @cap:travailler-sur-des-fichiers/moteur le DOSSIER DU PROJET borne, et un cwd en dessous de lui est couvert le constat par git @cap:travailler-sur-des-fichiers/moteur le périmètre d’un appel PORTE les dossiers de l’agent, pas seulement la cible le constat par git @cap:travailler-sur-des-fichiers/moteur un dépôt IMBRIQUÉ est constaté avec celui qui le contient le constat par git @cap:travailler-sur-des-fichiers/moteur un dépôt au-dessus de TOUT ce qui est passé n’est pas retenu le constat par git @cap:travailler-sur-des-fichiers/moteur un dossier PROFOND rend la racine du dépôt, une seule fois la lecture de git status @cap:travailler-sur-des-fichiers/moteur lit un renommage avec son nom d’avant la lecture de git status @cap:travailler-sur-des-fichiers/moteur lit un chemin à espaces sans le citer la lecture de git status @cap:travailler-sur-des-fichiers/moteur AD est une SUPPRESSION, pas un ajout la lecture de git status @cap:travailler-sur-des-fichiers/moteur une fusion non résolue qui AJOUTE un fichier est un ajout, des deux côtés le delta lui-même @cap:travailler-sur-des-fichiers/moteur un git add ne compte pas : la lettre bouge, le contenu non le delta lui-même @cap:travailler-sur-des-fichiers/moteur une empreinte illisible d’un côté n’est PAS créditée, elle est dite quel git est lancé @cap:travailler-sur-des-fichiers/moteur le binaire est un chemin ABSOLU pris dans le PATH du processus quel git est lancé @cap:travailler-sur-des-fichiers/moteur un faux git POSÉ DANS LE PROJET n’est ni résolu ni appelé les bornes du constat @cap:travailler-sur-des-fichiers/moteur un arbre plus sale que la borne fait DÉCLINER le constat, il ne l’approxime pas D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur shared workspace + existing file + propose_confirm (undefined autonomy) → awaiting_approval D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur shared workspace + existing file + destructive_gate → STILL awaiting_approval D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur shared workspace + NEW file (does not exist yet) → executes, no gate D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur ATTACHED workspace (owner-attached, e.g. Obsidian vault) + existing file + destructive_gate → executes, exempt D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur ATTACHED workspace + existing file + propose_confirm → executes, exempt (never gated regardless of mode) D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur shared workspace + existing file + fully_autonomous → executes, no gate D1 overwrite gate — file_write @cap:travailler-sur-des-fichiers/moteur resume after approval: synthetic auto_approve rule executes without re-gating D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur re-writing a shared file THIS run created runs without asking anyone D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur file_edit on a file this run wrote runs without asking, too D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur a file edited outside Nodal after this run wrote it asks the owner again D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur another run’s later write, recorded BEFORE ours, still asks the owner D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur content another run ALSO recorded is not provably ours: the owner is asked D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur three writes of the same file in one turn: the last content is ours, no approval D1 overwrite gate — a file this run wrote belongs to this run (#505) @cap:travailler-sur-des-fichiers/moteur a shared file no run of ours wrote still asks the owner D1 overwrite gate — the fingerprint is what the tool WROTE, checked again at the write (#505) @cap:travailler-sur-des-fichiers/moteur content an unrecorded writer put there right after our write is not ours D1 overwrite gate — the fingerprint is what the tool WROTE, checked again at the write (#505) @cap:travailler-sur-des-fichiers/moteur a file changed between the gate and the write is not overwritten register_project — le dossier écarté @cap:travailler-sur-des-fichiers/moteur retire l’exclusion du dossier qu’il vient de déclarer register_project — le dossier écarté @cap:travailler-sur-des-fichiers/moteur une panne sur la désexclusion ne fait PAS échouer un projet déjà déclaré register_project — le dossier écarté @cap:travailler-sur-des-fichiers/moteur ne touche QUE le dossier déclaré : les autres exclusions restent addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur écrit la ligne — label découpé, chemin gardé, entité recopiée depuis l’agent addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur refuse l’agent d’un AUTRE espace — et ne lui ajoute aucun répertoire addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur refuse un chemin relatif — c’est la garde qui empêche d’écrire n’importe où addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur accepte les deux formes absolues du parc — POSIX et Windows addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur refuse un agentId qui n’est pas un GUID addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur refuse un label vide, et un label de plus de 80 caractères addAgentWorkspaceAction @cap:travailler-sur-des-fichiers/moteur le même label deux fois : conflit annoncé, et UNE seule ligne en base rapprocherConstat @cap:travailler-sur-des-fichiers/moteur rend la liste du CONSTAT, et lui accroche le diff quand un outil l’a nommé rapprocherConstat @cap:travailler-sur-des-fichiers/moteur un fichier DÉCLARÉ que rien n’a constaté ne paraît plus rapprocherConstat @cap:travailler-sur-des-fichiers/moteur le même fichier vu deux fois ne fait qu’une ligne rapprocherConstat @cap:travailler-sur-des-fichiers/moteur la casse d’un chemin Windows ne dédouble pas le fichier ce qui fait foi pour la liste @cap:travailler-sur-des-fichiers/moteur un run qui a écrit des deux côtés porte les deux mots ce qui fait foi pour la liste @cap:travailler-sur-des-fichiers/moteur aucune ligne de constat se DIT, plutôt que de passer pour un constat ce qui fait foi pour la liste @cap:travailler-sur-des-fichiers/moteur chacun des deux mots a sa phrase resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur retrouve le WAV que le run a écrit, par le chemin que l’encart affiche resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur un chemin que ce run n’a pas livré n’ouvre rien, même s’il existe resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur un fichier écrit hors des dossiers de l’entité n’est pas servi resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur un lien posé dans le dossier ne fait pas sortir la lecture resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur un fichier supprimé depuis le dit : gone, pas « introuvable » resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur seuls les types de la liste fermée se servent : ni SVG, ni texte resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur un chemin relatif se résout dans le SEUL dossier qui le porte, jamais au hasard resolveDeliveredMedia @cap:travailler-sur-des-fichiers/moteur deux fichiers au MÊME chemin affiché : le rang désigne chacun le sien regroupement par fichier @cap:travailler-sur-des-fichiers/moteur le fil et la page de code rendent LES MÊMES rangées pour les mêmes lignes d’audit regroupement par fichier @cap:travailler-sur-des-fichiers/moteur les compteurs somment le diff des deux écritures du fichier regroupement par fichier @cap:travailler-sur-des-fichiers/moteur le GESTE vient de la carte, pas des fragments — il tient plaque repliée regroupement par fichier @cap:travailler-sur-des-fichiers/moteur « written » reste « written » : la carte de file_write ne dit pas si c’est une création regroupement par fichier @cap:travailler-sur-des-fichiers/moteur un fichier seulement LU n’est pas un fichier livré regroupement par fichier @cap:travailler-sur-des-fichiers/moteur un appel REFUSÉ par le harnais n’apporte aucun fragment regroupement par fichier @cap:travailler-sur-des-fichiers/moteur le chemin ABSOLU et le chemin RELATIF du même fichier n’en font qu’un GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur sert le WAV livré, en entier, avec son type et en ligne GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur une plage demandée rend CES octets, en 206 : la lecture avance dans la piste GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur une plage hors du fichier est refusée en 416, avec la taille GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur download=1 le rend en pièce jointe GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur chaque refus a son code : session, travail, fichier GET /api/runs/<jobId>/media @cap:travailler-sur-des-fichiers/moteur une base en panne se dit en 500 db_error, sans détail Postgres registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur refuse un chemin HORS des dossiers de l’espace, et n’écrit rien registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur refuse le dossier d’un AUTRE espace registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur refuse un chemin qui SORT du terrain par `..`, même s’il commence par lui registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur refuse un LIEN posé dans le terrain qui pointe dehors registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur STOCKE le chemin demandé, jamais le chemin résolu registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur refuse un dossier qui n’existe PAS : un projet fantôme ne s’inscrit pas registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur un `.` et des antislashs désignent le MÊME dossier : une seule ligne, chemin canonique registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur ÉCRIT la ligne du registre : enregistrée, de sorte « code », avec son responsable registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur un projet DÉJÀ inscrit n’est pas réinscrit : sa date d’ajout et son nom restent registerDetectedProjectAction @cap:travailler-sur-des-fichiers/moteur une ligne de COMPTABILITÉ (renommée, masquée) devient un projet sans perdre ses gestes getProjectActivityAction @cap:travailler-sur-des-fichiers/moteur rend les conversations ET les runs sans conversation, chacun dans sa liste getProjectActivityAction @cap:travailler-sur-des-fichiers/moteur un run DÉLÉGUÉ n’est pas une ligne : c’est le run de tête qui en porte une getProjectActivityAction @cap:travailler-sur-des-fichiers/moteur refuse une ligne de COMPTABILITÉ : ce n’est pas un projet, elle n’a pas de page getProjectFactsAction @cap:travailler-sur-des-fichiers/moteur compte les conversations et les sessions, et lit `.git` SUR LE DISQUE getProjectFactsAction @cap:travailler-sur-des-fichiers/moteur compte TOUS les runs de tête du projet, portés par un fil ou non getProjectFactsAction @cap:travailler-sur-des-fichiers/moteur un dossier SANS `.git` ne se dit pas dépôt, quelle que soit la sorte du projet createProjectAction — l’option git @cap:travailler-sur-des-fichiers/moteur SANS la case, aucun dépôt n’est posé et la ligne le dit createProjectAction — l’option git @cap:travailler-sur-des-fichiers/moteur AVEC la case, le dossier devient un dépôt et reçoit son .gitignore forgetCodeProjectAction @cap:travailler-sur-des-fichiers/moteur REFUSE un projet qui n’est pas masqué : la ligne est toujours là forgetCodeProjectAction @cap:travailler-sur-des-fichiers/moteur REFUSE une ligne de comptabilité masquée : l’oublier la ramènerait dans la liste forgetCodeProjectAction @cap:travailler-sur-des-fichiers/moteur un projet d’un AUTRE espace n’existe pas pour cette session forgetCodeProjectAction @cap:travailler-sur-des-fichiers/moteur masqué : la ligne part, le run et la conversation restent avec leur lien à NULL, le dossier est intact les dossiers écartés @cap:travailler-sur-des-fichiers/moteur OUBLIER écrit le dossier dans les écartés, avec son chemin tel qu’il est stocké les dossiers écartés @cap:travailler-sur-des-fichiers/moteur un oubli REFUSÉ n’écarte rien : la transaction porte les deux ou aucune les dossiers écartés @cap:travailler-sur-des-fichiers/moteur la liste rend ce qui a été écarté, et rien de l’espace d’à côté les dossiers écartés @cap:travailler-sur-des-fichiers/moteur « Detect again » retire la ligne, et un second clic le DIT au lieu de réussir en silence les dossiers écartés @cap:travailler-sur-des-fichiers/moteur un dossier écarté de l’espace d’à côté n’est pas réactivable d’ici les dossiers écartés @cap:travailler-sur-des-fichiers/moteur oublier DEUX FOIS le même dossier n’échoue pas : une seule ligne d’exclusion initGitRepository @cap:travailler-sur-des-fichiers/moteur pose un vrai dépôt et son .gitignore initGitRepository @cap:travailler-sur-des-fichiers/moteur le .gitignore couvre les dépendances, la sortie de build et les secrets initGitRepository @cap:travailler-sur-des-fichiers/moteur un dossier DÉJÀ dépôt n’est pas retouché initGitRepository @cap:travailler-sur-des-fichiers/moteur un .gitignore déjà écrit dans un dossier neuf n’est pas écrasé initGitRepository @cap:travailler-sur-des-fichiers/moteur la question est CE DOSSIER-CI, pas « suis-je dans un dépôt » initGitRepository @cap:travailler-sur-des-fichiers/moteur un dossier qui n’existe pas ne fait pas planter l’écran : l’échec est RENDU quel git est lancé @cap:travailler-sur-des-fichiers/moteur le binaire est un chemin ABSOLU, et un faux posé dans le projet ne l’est pas setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur ON pose le dépôt, et la ligne porte l’intention ET la date setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur ON sur un dossier DÉJÀ dépôt ne retouche rien, et le DIT setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur OFF ne supprime rien, et garde la DATE de pose setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur un id HORS REGISTRE ne fait rien : ni ligne, ni dossier touché setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur un projet d’une AUTRE entité est introuvable, pas « interdit » setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur une ligne de COMPTABILITÉ n’est pas un projet : refusée setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur hors PROPRIÉTAIRE, rien n’est posé setCodeProjectInitGitAction @cap:travailler-sur-des-fichiers/moteur la ligne visée est bien celle de CETTE entité, par son id la règle du projet listé @cap:travailler-sur-des-fichiers/moteur un projet RETIRÉ n’est pas listé ; un projet ordinaire l’est la règle du projet listé @cap:travailler-sur-des-fichiers/moteur les DEUX lecteurs vont la chercher au même endroit la règle du projet listé @cap:travailler-sur-des-fichiers/moteur personne ne RÉÉCRIT la règle à côté le POINT d’un espace de travail @cap:travailler-sur-des-fichiers/moteur allume le point sur ce qui a bougé depuis la dernière ouverture le POINT d’un espace de travail @cap:travailler-sur-des-fichiers/moteur n’invente AUCUN point sur un projet sans conversation la lecture du dossier Workspaces @cap:travailler-sur-des-fichiers/moteur rend ce qu’on lui demande, et pas plus, sur une base qui en porte douze la lecture du dossier Workspaces @cap:travailler-sur-des-fichiers/moteur classe par date d’ENREGISTREMENT, le plus récent d’abord la lecture du dossier Workspaces @cap:travailler-sur-des-fichiers/moteur REFUSE un plafond absurde, au lieu de lire sans borne la lecture du dossier Workspaces @cap:travailler-sur-des-fichiers/moteur écarte un projet MASQUÉ et un dossier jamais enregistré la barre et la page lisent la même règle @cap:travailler-sur-des-fichiers/moteur la barre n’a pas le masqué ; la page le lit, et le range hors de la liste la taille d’un espace et le coût de son filet @cap:travailler-sur-des-fichiers/moteur dit l’ABSENCE du dossier partagé plutôt que de le peser zéro la taille d’un espace et le coût de son filet @cap:travailler-sur-des-fichiers/moteur compte les octets RÉELLEMENT sur le disque la taille d’un espace et le coût de son filet @cap:travailler-sur-des-fichiers/moteur remonte la durée de la DERNIÈRE photo de cet espace la taille d’un espace et le coût de son filet @cap:travailler-sur-des-fichiers/moteur dit ILLISIBLE quand un FICHIER occupe le chemin du dossier partagé la taille d’un espace et le coût de son filet @cap:travailler-sur-des-fichiers/moteur dit « pas chronométrée » pour une photo d’avant la colonne les phrases d’une empreinte @cap:travailler-sur-des-fichiers/moteur dit le PLANCHER quand le comptage s’est arrêté avant la fin les phrases d’une empreinte @cap:travailler-sur-des-fichiers/moteur ne dit PAS le plancher quand le comptage est allé au bout les phrases d’une empreinte @cap:travailler-sur-des-fichiers/moteur distingue un dossier illisible d’un dossier absent les phrases d’une empreinte @cap:travailler-sur-des-fichiers/moteur donne les millisecondes sous la seconde la fraîcheur par espace @cap:travailler-sur-des-fichiers/moteur rend la photo d’un espace SILENCIEUX, même noyée sous celles d’un actif mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur un dossier détecté DÉJÀ au registre ne fait qu’UNE ligne, et garde SA date mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur la fusion se fait par IDENTITÉ, pas par égalité de texte : deux casses, une ligne mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur un dossier écrit et JAMAIS déclaré devient une ligne « detected », sans id ni page mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur MASQUER retire un dossier détecté de la liste ; il reste retrouvable derrière « Hidden » mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur un projet de DOCUMENTS ne porte AUCUNE pastille : il n’a rien à prouver mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur un projet du REGISTRE masqué SORT de la liste, et se retrouve derrière « Hidden » mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur le SOUS-TITRE ne compte pas un dossier détecté que la page ne montre pas mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur les DEUX sortes de masqués sont dans la MÊME section, registre et détection mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur le nom choisi par le propriétaire l’emporte sur celui du dossier, même détecté mergeWorkspaces @cap:travailler-sur-des-fichiers/moteur l’ordre est celui de la DATE, registre et détection mêlés mergeWorkspaces, les dossiers écartés @cap:travailler-sur-des-fichiers/moteur un dossier ÉCARTÉ ne paraît pas, même si un agent y écrit encore mergeWorkspaces, les dossiers écartés @cap:travailler-sur-des-fichiers/moteur l’exclusion se lit par IDENTITÉ : deux casses du même dossier, un seul écart mergeWorkspaces, les dossiers écartés @cap:travailler-sur-des-fichiers/moteur un dossier écarté puis RÉ-ENREGISTRÉ se liste : l’exclusion ne masque pas le registre mergeWorkspaces, les dossiers écartés @cap:travailler-sur-des-fichiers/moteur sans exclusion, la détection est ENTIÈRE — le défaut ne cache rien groupSessionsByProject @cap:travailler-sur-des-fichiers/moteur une session sans dossier dérivable n’invente aucun projet groupSessionsByProject @cap:travailler-sur-des-fichiers/moteur la date retenue est la PLUS ANCIENNE écriture vue, pas la dernière |
| Verify a deliverable required Is what it claims to have produced really there? screen flaky · engine passed
|
flaky see the run
Proof commands — la page du projet @cap:verifier-un-livrable/ecran A — configurer puis approuver, hash écrit EN BASE Proof commands — la page du projet @cap:verifier-un-livrable/ecran B — éditer une commande approuvée retire l’approbation Proof commands — la page du projet @cap:verifier-un-livrable/ecran C — le cap de cinq est visible : l’ajout disparaît 67 moreProof commands — la page du projet @cap:verifier-un-livrable/ecran D — non-owner : champs désactivés, pilule owner only, pas d’approbation Proof commands — la page du projet @cap:verifier-un-livrable/ecran E — un échec serveur ne ment pas Proof commands — la page du projet @cap:verifier-un-livrable/ecran G — RIEN ne déborde du panneau, chemin long et commande longue comprises Proof commands — la page du projet @cap:verifier-un-livrable/ecran F — /code mène à Projects : la liste a disparu, le panneau est sur le projet getCodingProcessDetailAction — verification (T24) les fichiers PROMIS non verts du pipeline remontent, et eux seuls @cap:verifier-un-livrable/ecran VerificationSection — la ligne repliée @cap:verifier-un-livrable/ecran repliée par défaut : aucune commande dans la page avant le clic VerificationSection — la ligne repliée @cap:verifier-un-livrable/ecran la ligne porte le verdict d’ensemble : rouge dès qu’une séquence n’est pas verte VerificationSection — la ligne repliée @cap:verifier-un-livrable/ecran un verdict VERT est dessiné en vert — jamais dans la couleur des skills VerificationSection — la ligne repliée @cap:verifier-un-livrable/ecran sans preuve, la ligne dit ce qui manque et ne montre aucun verdict VerificationSection — l’origine d’une preuve @cap:verifier-un-livrable/ecran nomme le rôle et l’agent quand la preuve vient d’un relecteur VerificationSection — l’origine d’une preuve @cap:verifier-un-livrable/ecran ne dit RIEN d’une preuve lancée par le job lui-même VerificationSection — l’origine d’une preuve @cap:verifier-un-livrable/ecran un agent effacé laisse son rôle, jamais un nom de remplacement CodeProcessDetail — un process de code se lit comme un run @cap:suivre-execution/ecran un run APPROUVÉ se lit « Delivered · Approved » @cap:verifier-un-livrable/ecran code-run-view — ce qui a été livré @cap:suivre-execution/ecran un fichier PROMIS non vert interdit « green » ici aussi @cap:verifier-un-livrable/ecran le réglage des tours de réparation @cap:verifier-un-livrable/ecran rend la valeur courante comme le segment actif, et la dit en une phrase le réglage des tours de réparation @cap:verifier-un-livrable/ecran zéro ne se lit PAS comme un tour : la phrase change avec la valeur le réglage des tours de réparation @cap:verifier-un-livrable/ecran cliquer un segment envoie CE nombre à l’action le réglage des tours de réparation @cap:verifier-un-livrable/ecran un refus de l’action remet la valeur d’avant sous les yeux le réglage des tours de réparation @cap:verifier-un-livrable/ecran les trois budgets s’affichent avec les nombres REÇUS le réglage des tours de réparation @cap:verifier-un-livrable/ecran un invité voit le réglage, et ne peut pas y toucher la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran écrit le verdict ENREGISTRÉ, pas la prose qui dit le contraire la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran porte ses CONSTATS, et tait les gravités absentes la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran écrit « Approved » tout court quand la revue n’a rien trouvé la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran montre le RÉSUMÉ enregistré dans le corps, une fois la délégation ouverte la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran retombe sur la PROSE quand rien n’a été enregistré la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran retombe sur la prose aussi quand le champ est ABSENT — un fil d’avant #170 la ligne de verdict d’une délégation @cap:verifier-un-livrable/ecran ne dessine AUCUNE ligne quand il n’y a ni verdict ni prose de verdict deliverySummary — ce que le modèle compte un fichier PROMIS jamais constaté interdit « green » et se NOMME dans la preuve @cap:verifier-un-livrable/ecran DeliveryBlock — le verdict à côté @cap:verifier-un-livrable/ecran dit « Delivered » ET « Changes requested », jamais l’un à la place de l’autre DeliveryBlock — le verdict à côté @cap:verifier-un-livrable/ecran un approve se lit « Delivered · Approved », pastille verte DeliveryBlock — le verdict à côté @cap:verifier-un-livrable/ecran sans relecture, la ligne ne porte aucun mot de relecture et garde « Verified » DeliveryBlock — le verdict à côté @cap:verifier-un-livrable/ecran un verdict que l’écran ne connaît pas s’affiche tel quel, jamais avalé DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran nomme la commande et dit que rien n’a été observé DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran un run arrêté dit « Stopped », un run tombé « Failed », quoi qu’ils aient écrit DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran porte le bouton Stop à côté d’« Open run » tant que le run court, et plus après DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran tant que le run court, les preuves se comptent et rien n’est « Verified » DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran « Open run » est un bouton, seul au bord droit du pied DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran tant que le run court, l’en-tête dit « Working » dans la couleur de Running, sans crochet DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran un run qui attend une approbation dit « Waiting for you », sans spinner DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran liveKind : working, waiting, ou rien DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran montre douze commandes au plus, et COMPTE le reste DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran ne compte rien quand la liste de commandes tient en entier DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran dit « Delivered » et tait l’aveu quand la commande a été constatée DeliveryBlock — une commande non constatée @cap:verifier-un-livrable/ecran ne dessine aucune section Commands quand le travail n’en a fait tourner aucune DeliveryBlock — pourquoi la commande a tourné @cap:verifier-un-livrable/ecran la phrase de l’agent se lit au-dessus de la commande DeliveryBlock — pourquoi la commande a tourné @cap:verifier-un-livrable/ecran sans phrase, la commande reste seule DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran un verdict rouge se DIT, et le crochet reste vert DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran un verdict vert se dit aussi, en vert DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran une preuve passée APRÈS une réparation le dit à côté du mot DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran une preuve rouge après réparation le dit aussi, et reste en warn DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran deux réparations s’accordent au pluriel DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran zéro réparation, et une surface qui n’a pas lu la colonne, ne disent RIEN DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran aucune preuve déclarée, aucun mot DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran un run arrêté dit son issue ET le sort de ses preuves DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran la ligne de mots ne pousse pas la boite DeliveryBlock — le verdict de preuve en toutes lettres @cap:verifier-un-livrable/ecran tant que le run court, la preuve se compte et ne conclut pas la section Commands @cap:verifier-un-livrable/ecran une commande qui a lâché porte « exit 1 » dans la couleur de l’attention la section Commands @cap:verifier-un-livrable/ecran une commande qui a rendu 0 ne porte AUCUNE issue la section Commands @cap:verifier-un-livrable/ecran une commande refusée par une règle porte « blocked » la section Commands @cap:verifier-un-livrable/ecran le titre dit ce que la liste est, et ce que Proof est la section Commands @cap:verifier-un-livrable/ecran les trois issues cohabitent dans la même liste, chacune sur sa ligne la ligne et sa plaque, sous la borne de la plaque @cap:verifier-un-livrable/ecran autant de rangées vertes que de « + », autant de rouges que de « − » la ligne et sa plaque, sous la borne de la plaque @cap:verifier-un-livrable/ecran une réécriture qui garde le gros du fichier ne peint pas tout en vert la ligne et sa plaque, sous la borne de la plaque @cap:verifier-un-livrable/ecran une écriture entière est verte de bout en bout, et le dit ProjectVerificationPanel — une couleur ne contredit pas son mot @cap:verifier-un-livrable/ecran « Approved » est VERT, et d’aucune couleur d’alerte ProjectVerificationPanel — une couleur ne contredit pas son mot @cap:verifier-un-livrable/ecran « Declared by the agent » l’est aussi : c’est la PROVENANCE qui change, pas l’état ProjectVerificationPanel — une couleur ne contredit pas son mot @cap:verifier-un-livrable/ecran ce qui n’est PAS acquis garde sa couleur : ambre en attente, neutre sans rien |
passed
le git du magasin de checkpoints @cap:verifier-un-livrable/moteur git() : lire le journal LÈVE quand la résolution dit « aucun git » le git du magasin de checkpoints @cap:verifier-un-livrable/moteur gitRaw() : le `--numstat` d’un diff binaire LÈVE, il ne rend pas « inchangé » le git du magasin de checkpoints @cap:verifier-un-livrable/moteur gitRawCapped() : le diff EN FLUX LÈVE, il ne rend pas un texte vide 220 morele git du magasin de checkpoints @cap:verifier-un-livrable/moteur ensureStore() : le dépôt nu n’est PAS créé quand la résolution dit « aucun git » le git du magasin de checkpoints @cap:verifier-un-livrable/moteur « aucun git sur le PATH » fait LEVER le magasin jusqu’au propriétaire le git du magasin de checkpoints @cap:verifier-un-livrable/moteur un faux git POSÉ DANS LE WORKSPACE ne photographie rien à la place du vrai migration 0118_agent_jobs_deliverable_check_due @cap:verifier-un-livrable/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0118_agent_jobs_deliverable_check_due @cap:verifier-un-livrable/moteur deliverable_check_due_at existe, horodatée, NULLABLE et sans défaut migration 0118_agent_jobs_deliverable_check_due @cap:verifier-un-livrable/moteur l’index qui sert la pastille existe, et il est PARTIEL migration 0118_agent_jobs_deliverable_check_due @cap:verifier-un-livrable/moteur le fait se pose, se relit, et se relâche quand la personne a regardé migration 0129_deliverable_declared @cap:verifier-un-livrable/moteur démarre un vrai Postgres et applique les VRAIES migrations migration 0129_deliverable_declared @cap:verifier-un-livrable/moteur declared existe : booléen, NOT NULL, défaut false migration 0129_deliverable_declared @cap:verifier-un-livrable/moteur une ligne non nommée vaut false ; une ligne déclarée se relit true migration 0121_entities_proof_repair_attempts @cap:verifier-un-livrable/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0121_entities_proof_repair_attempts @cap:verifier-un-livrable/moteur la colonne est un entier requis, et son défaut est UN tour — ce que #375 fait déjà migration 0121_entities_proof_repair_attempts @cap:verifier-un-livrable/moteur accepte les quatre valeurs offertes, et REFUSE tout ce qui est en dehors migration 0121_entities_proof_repair_attempts @cap:verifier-un-livrable/moteur records the migration in the journal drizzle-kit actually reads un serveur Postgres par run, une base par fichier @cap:verifier-un-livrable/moteur startRealPostgres rend une base sur le serveur du run, pas un cluster neuf un serveur Postgres par run, une base par fichier @cap:verifier-un-livrable/moteur deux bases du même serveur ne se voient pas, et stop() ne supprime que la sienne migration 0115_verification_runs_source @cap:verifier-un-livrable/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0115_verification_runs_source @cap:verifier-un-livrable/moteur leaves verification_runs.source a NOT NULL text defaulting to job migration 0115_verification_runs_source @cap:verifier-un-livrable/moteur refuses an origin outside the two the code knows migration 0115_verification_runs_source @cap:verifier-un-livrable/moteur turns an existing proof row into a job-sourced one migration 0115_verification_runs_source @cap:verifier-un-livrable/moteur records the migration in the journal drizzle-kit actually reads delivery_blocked @cap:verifier-un-livrable/moteur pose le code sur un request_changes — le parent ne peut pas conclure « livré » delivery_blocked @cap:verifier-un-livrable/moteur ne bloque RIEN sur un approve — le champ est présent et nul delivery_blocked @cap:verifier-un-livrable/moteur ne bloque RIEN sur une délégation qui n’est pas une revue reviewBlocksDelivery @cap:verifier-un-livrable/moteur ne bloque que sur request_changes, et jamais sur une absence de relecture run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur write : le binding LÈVE, la ligne d’état existe quand même (dirty 1, verified NULL) et les verrous sont rendus run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur read : aucune intention, aucune ligne code_projects run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur tous les dossiers attachés : deux workspaces ⇒ deux lignes, clés croissantes run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur échec d’intention ⇒ le CLI ne démarre pas, le job reste non terminal, les verrous sont rendus run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur write : l’époque du projet monte DEUX fois — à l’intention, puis à la sortie de la CLI (#101) run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur write : le binding LÈVE — l’époque monte quand même, la CLI a pu écrire avant de tomber run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur read : aucune intention, donc aucune montée — la ligne code_projects n’existe même pas run-job : l’intention AVANT binding.run @cap:verifier-un-livrable/moteur job déjà terminal (annulé) ⇒ le CLI ne démarre pas run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur pas de jobId ⇒ aucune ligne, code journalisé, et le tour va quand même jusqu’à binding.run run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur write : le tour fait vieillir le projet (époque 1) bien qu’aucune intention ne soit posée (#101) run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur write : le binding LÈVE — le projet vieillit quand même, la CLI a pu écrire avant de tomber run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur Stop avant le `result` de Claude : la réponse gardée est le texte déjà dit (#456) @cap:parler-a-un-agent/moteur run-chat : le jumeau, sans jobId @cap:verifier-un-livrable/moteur read : rien n’est écrit, donc rien ne vieillit — pas même une ligne code_projects un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur le MP4 promis n’existe pas : tour de réparation, toujours absent, le run ÉCHOUE et le dit un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur le MP4 promis est là et c’est un MP4 : completed, preuve verte sur le fichier un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur un fichier présent mais qui n’est PAS ce qu’il prétend être échoue aussi, sur son en-tête un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur réparé en changeant de fichier : la liste corrigée REMPLACE l’ancienne, completed (revue Codex, passe 3) un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur un texte DÉJÀ publié par un outil de livraison reçoit la ligne d’arrêt, écrite AVEC l’échec (revue Codex, passe 3) un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur réparé SANS répéter la liste (champ omis) : la promesse tient, le brouillon rouge fait échouer un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur zéro réparation accordée par l’espace : échec DIRECT, sans tour de plus un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur un chemin qui ne désigne rien de ses dossiers : UN renvoi à l’agent, puis l’échec un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur la racine déclare l’image que son délégué a écrite hors de ses dossiers : completed, preuve verte (#588) un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur renvoyé, l’agent répond en TEXTE SEUL : la déclaration reste due, le run échoue (revue Codex) un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur renvoyé, l’agent rappelle return_result en OMETTANT le champ : la promesse tient, le run échoue (revue Codex de la PR #523) un livrable DÉCLARÉ est vérifié avant le succès @cap:verifier-un-livrable/moteur renvoyé, l’agent rappelle return_result SANS le fichier (il le retire) : la dette est soldée, completed un livrable déclaré DANS un projet de code reste un fichier @cap:verifier-un-livrable/moteur absent : le run ÉCHOUE et la ligne nomme le fichier du projet et « not found » un livrable déclaré DANS un projet de code reste un fichier @cap:verifier-un-livrable/moteur présent, en-tête MP4 valide : completed, et la preuve a lu LE FICHIER SANS livrable déclaré, rien ne change @cap:verifier-un-livrable/moteur une preuve rouge NON déclarée reste observée : réparation, puis completed quand même la porte de finalisation, pour toute porte qui l’appelle @cap:verifier-un-livrable/moteur un texte déjà publié reste, SUIVI de la ligne ; la ligne part vers le canal à outil un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur un run qui a PRODUIT un livrable pose le fait, avec son statut terminal un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur un livrable seulement VISÉ, jamais écrit, ne réclame aucun regard un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur un livrable dans le PÉRIMÈTRE mais non visé ne réclame aucun regard un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur un run SANS aucun livrable ne pose rien un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur le livrable d’un DÉLÉGUÉ fait attendre le run de TÊTE, pas le délégué un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur une chaîne qui BOUCLE ne pose rien, le DIT, et laisse le run finir un livrable de ce run attend un regard @cap:verifier-un-livrable/moteur remonte la chaîne sur DEUX niveaux de délégation executeJob — une preuve rouge rejoue UN tour @cap:verifier-un-livrable/moteur le second tour part avec la commande rouge et sa sortie, et coûte UNE reprise executeJob — la reprise de réparation survit au checkpoint @cap:verifier-un-livrable/moteur un tour de réparation suspendu garde son chain_count à 1 une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur premier rouge : le job n’est PAS terminal, repair_attempts passe à 1, le brief porte la commande et sa sortie une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur rouge une SECONDE fois : completed, red_streak à 1, aucun troisième tour une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur verte après réparation : completed, verdict green, red_streak à zéro une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur un job ANNULÉ n’entre jamais en réparation une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur une preuve qui EXPIRE n’ouvre aucune réparation : c’est une panne, pas du code à corriger une preuve rouge rouvre le run pour UN tour @cap:verifier-un-livrable/moteur une porte qui ne sait pas rouvrir son job garde le comportement de PR① la borne de réparation est un réglage de l’espace @cap:verifier-un-livrable/moteur à zéro, aucune réparation : le run finit rouge tout de suite, comme avant #375 la borne de réparation est un réglage de l’espace @cap:verifier-un-livrable/moteur à deux, le run reçoit DEUX tours, puis le rouge est le dernier mot la borne de réparation est un réglage de l’espace @cap:verifier-un-livrable/moteur à trois, un vert au deuxième tour arrête la boucle : on ne consomme pas la réserve le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur une sortie plus longue que la borne garde la FIN, et la troncature est annoncée le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur une commande muette le dit, plutôt que de rendre une section vide le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur sans aucune commande rouge, il refuse plutôt que de composer un brief vide code-project — runProof @cap:verifier-un-livrable/moteur preuve verte : verdict green, onCommandDone appelé une fois au rang 0, exitCode 0 code-project — runProof @cap:verifier-un-livrable/moteur séquence [ok, exit 1, ok] ⇒ rangs 0 et 1 seulement, verdict red, la 3e n’a jamais tourné code-project — runProof @cap:verifier-un-livrable/moteur la preuve tourne HORS transaction : une lecture de code_projects passe pendant une preuve de 3 s code-project — runProof @cap:verifier-un-livrable/moteur écriture de run en panne ⇒ le verdict survit, un code est journalisé (best-effort) code-project — runProof @cap:verifier-un-livrable/moteur timeout ⇒ verdict infra_error, exitCode null (jamais confondu avec un rouge) l’intention d’un autre job, posée AVANT la preuve (#101) @cap:verifier-un-livrable/moteur les cinq pas de l’issue : A ne finit PAS vert sur un contenu que B a remplacé pendant sa preuve l’intention d’un autre job, posée AVANT la preuve (#101) @cap:verifier-un-livrable/moteur A seul : personne d’autre n’écrit, la preuve reste opposable et le job finit vert l’intention d’un autre job, posée AVANT la preuve (#101) @cap:verifier-un-livrable/moteur A puis B EN SÉRIE : l’écriture de B est finie avant que A ne commence, A prouve l’arbre courant et finit vert l’intention d’un autre job, posée AVANT la preuve (#101) @cap:verifier-un-livrable/moteur B seul : le job qui a écrit prouve son propre arbre et finit vert recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur écrit les deux commandes du relecteur sous le job RELU, avec leur résultat réel recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur classe un timeout et une panne de lancement en infra_error, jamais en rouge recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur n'écrit RIEN pour un appel qui n'a pas tourné recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur masque les secrets de la sortie enregistrée recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur un second verdict ne double pas la trace — la dernière lecture remplace la première recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur sans parent, la preuve reste sous le job qui l’a lancée recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur REFUSE d’écrire quand le job relu est d’un AUTRE espace recordReviewerVerificationRuns @cap:verifier-un-livrable/moteur un refus n’efface pas la trace d’une relecture déjà enregistrée reviewerVerificationRecord @cap:verifier-un-livrable/moteur lit la commande de run_skill_script avec ses arguments reviewerVerificationRecord @cap:verifier-un-livrable/moteur rend null sur une sortie qui ne décrit aucun processus pathsDeclaredByCliWrite @cap:verifier-un-livrable/moteur lit un chemin par appel chez Claude Code, une écriture pathsDeclaredByCliWrite @cap:verifier-un-livrable/moteur lit PLUSIEURS fichiers chez Codex, avec leur genre pathsDeclaredByCliWrite @cap:verifier-un-livrable/moteur un genre INCONNU est traité en écriture, et DIT pathsDeclaredByCliWrite @cap:verifier-un-livrable/moteur le même genre inconnu ne se dit qu’UNE fois pathsDeclaredByCliWrite @cap:verifier-un-livrable/moteur un outil qui n’écrit pas, ou une entrée informe, ne déclare rien fragmentDiffCounts @cap:verifier-un-livrable/moteur compte exactement les lignes signées du script, sur des formes différentes fragmentDiffCounts @cap:verifier-un-livrable/moteur le cas de l’issue : 59 lignes remplacées par 261 dont 250 communes fragmentDiffCounts @cap:verifier-un-livrable/moteur une écriture sans texte précédent compte TOUT son contenu comme ajouté fragmentDiffCounts @cap:verifier-un-livrable/moteur au-delà de la borne, elle dit le remplacement en bloc que le script dessine readProofRepairAttempts @cap:verifier-un-livrable/moteur laisse passer les quatre valeurs offertes, telles quelles readProofRepairAttempts @cap:verifier-un-livrable/moteur rabat sur la borne la PLUS PROCHE, jamais sur le défaut readProofRepairAttempts @cap:verifier-un-livrable/moteur ce qui n’est pas un entier vaut le défaut — une ligne d’avant la colonne un fichier écrit est classé une seule fois @cap:verifier-un-livrable/moteur file_write — le dossier DEVIENT un projet après le hook : la carte garde la clé de l’état un fichier écrit est classé une seule fois @cap:verifier-un-livrable/moteur file_write — le projet DISPARAÎT après le hook : la carte ne porte pas une clé orpheline un fichier écrit est classé une seule fois @cap:verifier-un-livrable/moteur file_edit — le dossier DEVIENT un projet après le hook : la carte garde la clé de l’état un fichier écrit est classé une seule fois @cap:verifier-un-livrable/moteur file_edit — le projet DISPARAÎT après le hook : la carte ne porte pas une clé orpheline return_result.deliverables — le schéma @cap:verifier-un-livrable/moteur accepte une liste de chemins et la rend telle quelle return_result.deliverables — le schéma @cap:verifier-un-livrable/moteur reste optionnel — un succès sans fichier ne déclare rien return_result.deliverables — le schéma @cap:verifier-un-livrable/moteur refuse un chemin vide return_result.deliverables — le schéma @cap:verifier-un-livrable/moteur la description dit à TOUT agent de lister chaque fichier livré declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un fichier qu’une commande devait produire devient un livrable DÉCLARÉ, sale, typé document declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur SOUS un projet de code, le fichier déclaré reste un FICHIER — la ligne du projet n’est pas celle qui le prouve declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un fichier ÉCRIT par file_write puis déclaré retombe sur LA MÊME ligne declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un chemin irrésolu n’écrit RIEN, et rend la raison du résolveur des outils de fichiers declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un agent SANS dossier ne peut rien déclarer — dit, pas ignoré declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur les cases de vérification de l’espace ne s’appliquent pas : une promesse n’est pas une écriture declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un job déjà terminal ne reçoit plus rien declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur deux fois le même chemin fait UNE ligne declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur un dossier configuré par un AUTRE nom que son chemin réel (lien, nom court DOS) : écrit puis déclaré, UNE ligne, clé du nom configuré declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur une nouvelle liste REMPLACE la précédente : ce qui n’est plus nommé cesse d’être déclaré (revue Codex) declareDeliverables — une ligne d’état par fichier promis @cap:verifier-un-livrable/moteur une liste VIDE retire toute promesse ; la ligne et sa preuve restent a file my delegate produced is mine to declare (#588) @cap:verifier-un-livrable/moteur declaring it writes a declared document row on MY job, keyed by its real path a file my delegate produced is mine to declare (#588) @cap:verifier-un-livrable/moteur declaring a replaced file or another run’s output stays unresolved, and nothing is written a file my delegate produced is mine to declare (#588) @cap:verifier-un-livrable/moteur a child cannot make a path outside its own folders declarable: it has no such descendant a file my delegate produced is mine to declare (#588) @cap:verifier-un-livrable/moteur a failed read is its own code, not a path the resolver refused l’intention de mutation, posée par executeTool un shell qui n’écrit RIEN ne produit rien — son cwd ne le crédite plus (#102) @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool un HARNAIS : les fichiers qu’il RAPPORTE sont constatés sur le disque (#102) @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool un SECOND run n’hérite pas des fichiers du premier @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool une SUPPRESSION rapportée est constatée par l’absence @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool un fichier VIDÉ est une écriture, pas une absence @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool un fichier RAPPORTÉ que le disque ne porte pas n’est pas constaté, et c’est dit @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool un FICHIER écrit dans le même projet, lui, le produit @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool et `declare_verification` le DIT au lieu d’accuser une panne (#102) @cap:verifier-un-livrable/moteur l’intention de mutation, posée par executeTool le code de sortie d’un shell ne décide de RIEN, dans un sens ni dans l’autre @cap:verifier-un-livrable/moteur l’empreinte d’une écriture constatée @cap:verifier-un-livrable/moteur une réécriture de MÊME TAILLE sous une horloge grossière est constatée l’empreinte d’une écriture constatée @cap:verifier-un-livrable/moteur un fichier VRAIMENT inchangé ne devient pas une écriture l’empreinte d’une écriture constatée @cap:verifier-un-livrable/moteur un fichier absent qui apparaît, et un fichier qui disparaît, sont deux changements observedDeliverableKeys — la règle de projet de l’intention @cap:verifier-un-livrable/moteur un projet DÉCLARÉ sans manifeste : la clé constatée est celle que l’intention salit observedDeliverableKeys — la règle de projet de l’intention @cap:verifier-un-livrable/moteur le prédicat ne peut plus être oublié — le compilateur refuse l’appel un fichier illisible @cap:verifier-un-livrable/moteur n’est pas une écriture constatée — le refus de lecture ne se confond pas avec l’absence un fichier illisible @cap:verifier-un-livrable/moteur illisible AVANT et écrit APRÈS : l’écriture est constatée quand même un fichier dont l’ÉTAT lui-même est refusé @cap:verifier-un-livrable/moteur un `stat` refusé n’est pas une absence, donc pas une écriture un fichier dont l’ÉTAT lui-même est refusé @cap:verifier-un-livrable/moteur un fichier VRAIMENT supprimé reste un changement le seam monte l’époque APRÈS l’écriture @cap:verifier-un-livrable/moteur un file_write réussi laisse l’époque à 2 : une montée pour l’intention, une pour l’écriture le seam monte l’époque APRÈS l’écriture @cap:verifier-un-livrable/moteur une ÉDITION qui n’écrit rien (old_string absent) monte l’époque quand même — la tentative reste conservative le seam monte l’époque APRÈS l’écriture @cap:verifier-un-livrable/moteur deux écritures dans le même tour font QUATRE montées — chacune périme la preuve de la précédente bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur ne monte QUE les livrables qui ont une ligne code_projects (epoch non nul) bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur une clé vue deux fois ne monte l’époque qu’UNE fois bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur la ligne a disparu entre l’intention et l’écriture : DIT par un code, jamais recréée bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur des livrables mais pas d’espace : DIT par un code, jamais un 0 muet bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur aucun livrable et aucune entité : rien à dire, et rien n’est dit bumpEpochsAfterWrite, la règle seule @cap:verifier-un-livrable/moteur ne LÈVE jamais : une base en panne se dit par un code et rend 0 le premier manifeste d’un dépôt neuf est du code @cap:verifier-un-livrable/moteur le fichier écrit qui est lui-même un manifeste classe son dossier projet de code le premier manifeste d’un dépôt neuf est du code @cap:verifier-un-livrable/moteur tout marqueur de la liste partagée compte, sauf `.git`, qui est un dossier le premier manifeste d’un dépôt neuf est du code @cap:verifier-un-livrable/moteur un fichier ordinaire dans un dossier neuf reste un document le premier manifeste d’un dépôt neuf est du code @cap:verifier-un-livrable/moteur un manifeste plus profond que la racine résolue suit la racine (#435) le premier manifeste d’un dépôt neuf est du code @cap:verifier-un-livrable/moteur la seconde écriture donne la même réponse que la première : le manifeste est sur le disque le verdict du fil lit l’écriture constatée @cap:verifier-un-livrable/moteur un tour shell qui n’a rien laissé voir le DIT, sans se dire du travail le verdict du fil lit l’écriture constatée @cap:verifier-un-livrable/moteur une écriture CONSTATÉE sur le même tour en fait un travail classifyProduction — pourquoi la commande a tourné @cap:verifier-un-livrable/moteur la phrase de l’entrée voyage avec la commande classifyProduction — pourquoi la commande a tourné @cap:verifier-un-livrable/moteur une entrée SANS phrase ne rend pas de phrase classifyProduction — pourquoi la commande a tourné @cap:verifier-un-livrable/moteur une phrase blanche vaut une absence classifyProduction — pourquoi la commande a tourné @cap:verifier-un-livrable/moteur une phrase qui n’est pas du texte vaut une absence classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une commande qui a lâché porte son code classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une commande qui a rendu 0 porte 0 — l’écran décide de se taire, pas le modèle classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une commande TUÉE par le délai n’a pas de code, et le dit classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une carte illisible laisse l’issue INCONNUE, jamais un zéro de repli classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une commande refusée par une règle est listée, dite « blocked », et ne produit rien classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur un script de skill refusé est nommé par son script, pas par l’outil classifyProduction — l’issue de la commande @cap:verifier-un-livrable/moteur une erreur qui n’est pas un refus de règle reste muette le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur lit la ligne `review_verdict`, pas la prose qui dit le contraire le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur garde le DERNIER appel, même tour et même heure le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur ne rend RIEN quand le délégué n’a enregistré aucun verdict le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur une ligne abîmée n’emporte pas le fil : la délégation arrive quand même le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur un appel d’un autre outil, plus récent, n’efface pas le verdict le fil remonte le verdict enregistré d’un délégué @cap:verifier-un-livrable/moteur un refus APRÈS un succès retire le verdict : le dernier appel décide, même vide la pastille compte un livrable à vérifier @cap:verifier-un-livrable/moteur ne compte rien tant qu’aucun run n’a livré la pastille compte un livrable à vérifier @cap:verifier-un-livrable/moteur range chaque run qui attend dans le dossier d’où il vient regarder éteint l’attente @cap:verifier-un-livrable/moteur ouvrir le FIL éteint son run, et lui seul regarder éteint l’attente @cap:verifier-un-livrable/moteur ouvrir le RUN éteint son attente, et lui seul la lecture de la pastille est BORNÉE @cap:verifier-un-livrable/moteur ne rapporte jamais plus que son plafond, même avec plus de runs en attente listProofsForPathsAction @cap:verifier-un-livrable/moteur rend le DERNIER verdict de chaque chemin, et rien pour un chemin sans preuve le verdict d’une relecture est masqué avant l’écran @cap:verifier-un-livrable/moteur la page d’un run ne porte la clé NULLE PART, et dit qu’elle masque le verdict d’une relecture est masqué avant l’écran @cap:verifier-un-livrable/moteur le FIL D’UNE CONVERSATION ne porte la clé nulle part non plus le verdict d’une relecture est masqué avant l’écran @cap:verifier-un-livrable/moteur la ligne STOCKÉE reste intacte — l’orchestration la relit pour décider la section Verification montre l’origine d’une preuve @cap:verifier-un-livrable/moteur rend les commandes du relecteur avec leur rôle et le nom de l’agent qui les a lancées le récapitulatif porte le verdict de la relecture @cap:verifier-un-livrable/moteur rend le verdict et le fait qu’il demande des corrections le récapitulatif porte le verdict de la relecture @cap:verifier-un-livrable/moteur rend l’approbation sans rien changer d’autre le récapitulatif porte le verdict de la relecture @cap:verifier-un-livrable/moteur sans relecture, le récapitulatif conclut comme avant lastSequencePerDeliverable @cap:verifier-un-livrable/moteur un livrable réparé ne garde que la séquence qui a suivi la réparation lastSequencePerDeliverable @cap:verifier-un-livrable/moteur les commandes d’une même séquence restent toutes, dans l’ordre lastSequencePerDeliverable @cap:verifier-un-livrable/moteur deux livrables gardent CHACUN leur dernière séquence lastSequencePerDeliverable @cap:verifier-un-livrable/moteur même clé, deux TYPES de livrable : ce sont deux livrables lastSequencePerDeliverable @cap:verifier-un-livrable/moteur la preuve d’un DÉLÉGUÉ sur le même projet n’est pas effacée par celle de sa tête lastSequencePerDeliverable @cap:verifier-un-livrable/moteur la preuve d’un RELECTEUR ne masque pas celle du travail lastSequencePerDeliverable @cap:verifier-un-livrable/moteur à date ÉGALE, la dernière arrivée gagne — le tri reste total lastSequencePerDeliverable @cap:verifier-un-livrable/moteur aucune ligne : aucune ligne lastSequenceViewPerDeliverable @cap:verifier-un-livrable/moteur une date ILLISIBLE ne gagne jamais sur une vraie heure lastSequenceViewPerDeliverable @cap:verifier-un-livrable/moteur entre deux dates illisibles, l’ordre d’arrivée tranche lastSequenceViewPerDeliverable @cap:verifier-un-livrable/moteur sur des séquences déjà groupées, la même règle s’applique workspaceProof @cap:verifier-un-livrable/moteur une approbation en attente passe AVANT le dernier verdict workspaceProof @cap:verifier-un-livrable/moteur un rouge ne se dit pas « Unverified » : les deux états restent distincts workspaceProof @cap:verifier-un-livrable/moteur un vert approuvé est la seule façon d’être « Verified » delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur préfère l’enregistré, quoi que dise le résultat delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur accorde le pluriel des constats delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur garde la règle de prose À LA LETTRE en repli delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur lit le verdict posé sur la LIGNE SUIVANTE (#198) delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur le mot seul porte son SÉPARATEUR, deux-points ou tiret delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur ne promeut PAS une puce en verdict — la décision du milieu ambigu delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur écarte aussi un SOUS-TITRE et une CITATION sous le mot — le choix, écrit delegationVerdictLine, la règle seule @cap:verifier-un-livrable/moteur garde la première ligne quand elle SE SUFFIT, ligne suivante ou pas deliverySummary — le verdict de la relecture @cap:verifier-un-livrable/moteur reporte le dernier verdict du travail, et s’il demande des corrections commandOutcome — ce qu’une ligne dit de son issue @cap:verifier-un-livrable/moteur une sortie à zéro ne dit rien ; tout le reste se dit en un mot les compteurs d’un fichier livré @cap:verifier-un-livrable/moteur le cas de l’issue : 59 lignes remplacées par 261 dont 250 communes ne font pas « +261 −59 » les compteurs d’un fichier livré @cap:verifier-un-livrable/moteur une écriture sans texte précédent compte TOUT son contenu comme ajouté les compteurs d’un fichier livré @cap:verifier-un-livrable/moteur les éditions successives d’un fichier s’additionnent, chacune sur le résultat de la précédente |
| Capability | Screen | Engine |
|---|---|---|
| Schedule a task required Can I ask it to do that every morning? screen passed · engine passed
|
passed
Daily budget field on ScheduleForm @cap:planifier-une-tache/ecran is present with a default of 5 on the New schedule form Daily budget field on ScheduleForm @cap:planifier-une-tache/ecran persists a custom value on create, and an edit updates it le « + » d’un titre de section @cap:planifier-une-tache/ecran n’existe QUE sur CRON et WEBHOOKS dans le panneau Run 18 morele « + » d’un titre de section @cap:planifier-une-tache/ecran PROJECTS en porte un, vers /spaces, et le panneau Work n’en a pas d’autre le « + » d’un titre de section @cap:planifier-une-tache/ecran DIT le geste, et pas le signe la page d’une routine @cap:planifier-une-tache/ecran rend les cinq lignes de réglages depuis la base la page d’une routine @cap:planifier-une-tache/ecran liste SES runs, et mène chacun à sa page de run la page d’une routine @cap:planifier-une-tache/ecran annonce les runs comptés sur la fenêtre et renvoie au reste la page d’une routine @cap:planifier-une-tache/ecran montre ce que la routine a RETENU, au-dessus de ses runs la page d’une routine @cap:planifier-une-tache/ecran ne rend PAS de bloc d’état pour une routine qui n’a rien retenu la page d’une routine @cap:planifier-une-tache/ecran porte les trois gestes de la planche, et AUCUN retour la page d’une routine @cap:planifier-une-tache/ecran empile en-tête, barre de travail, actions, réglages — dans cet ordre la page d’une routine @cap:planifier-une-tache/ecran montre l’agent et l’état DANS la barre de travail la liste des automations ouvre chaque carte @cap:planifier-une-tache/ecran fait du nom d’une routine un lien vers sa page, sans cesser d’être le titre la liste des automations ouvre chaque carte @cap:planifier-une-tache/ecran fait de même pour un webhook le « + » de la barre ouvre le formulaire @cap:planifier-une-tache/ecran `?new=schedule` ouvre « New schedule » dès l’arrivée le « + » de la barre ouvre le formulaire @cap:planifier-une-tache/ecran `?new=webhook` ouvre « New webhook » dès l’arrivée le « + » de la barre ouvre le formulaire @cap:planifier-une-tache/ecran sans agent, rien ne s’ouvre : le bouton est désactivé, le paramètre aussi le « + » de la barre ouvre le formulaire @cap:planifier-une-tache/ecran sans paramètre, rien ne s’ouvre le « + » de la barre ouvre le formulaire @cap:planifier-une-tache/ecran fermer le formulaire ouvert par l’adresse retire le paramètre /scheduled @cap:planifier-une-tache/ecran redirige vers la liste des automatisations, de façon permanente |
passed
runScheduleTick @cap:planifier-une-tache/moteur fires an active schedule with next_run NULL and marks success runScheduleTick @cap:planifier-une-tache/moteur fires when next_run is in the past runScheduleTick @cap:planifier-une-tache/moteur propagates the bot owner chat into the cron job chat_id ONLY when notify_on_success is on 31 morerunScheduleTick @cap:planifier-une-tache/moteur an explicit schedule.chat_id wins over the owner's chat runScheduleTick @cap:planifier-une-tache/moteur leaves chat_id NULL on a cron job when notify_on_success is off, even with a registered owner runScheduleTick @cap:planifier-une-tache/moteur leaves chat_id NULL when the agent has no registered owner (no leak to a stale last-seen chat) runScheduleTick @cap:planifier-une-tache/moteur skips a paused schedule even if next_run is past runScheduleTick @cap:planifier-une-tache/moteur skips a schedule with next_run in the future runScheduleTick @cap:planifier-une-tache/moteur marks failed and pushes next_run far out for a bad cron expression runScheduleTick @cap:planifier-une-tache/moteur idempotency: two concurrent ticks fire each schedule exactly once runScheduleTick @cap:planifier-une-tache/moteur marks failed when the fired job fails runScheduleTick @cap:planifier-une-tache/moteur stamps the fired job with schedule_id and trigger_context.prevRunAt = the PREVIOUS last_run runScheduleTick @cap:planifier-une-tache/moteur trigger_context.prevRunAt is null on a schedule's first-ever run runScheduleTick @cap:planifier-une-tache/moteur fires normally when the schedule has spent under its daily budget today runScheduleTick @cap:planifier-une-tache/moteur holds a schedule that already spent past its daily budget, notifies the owner once, and does not repeat the notice on the next tick while still exhausted runScheduleTick @cap:planifier-une-tache/moteur does not count cost from a previous day toward the budget runScheduleTick @cap:planifier-une-tache/moteur does not count another schedule's cost toward this one's budget runScheduleTick @cap:planifier-une-tache/moteur never counts a non-schedule job (schedule_id NULL) toward any schedule's budget runScheduleTick @cap:planifier-une-tache/moteur accepts budget_exhausted as a valid last_status (migration 0062 CHECK constraint) runScheduleTick @cap:planifier-une-tache/moteur skips firing a due schedule while a previous job for it is still live runScheduleTick @cap:planifier-une-tache/moteur fires normally once the previous live job for the schedule has completed (regression) runScheduleTick @cap:planifier-une-tache/moteur a live job on one schedule does not block a different schedule from firing runScheduleTick @cap:planifier-une-tache/moteur an explicit notify_channel resolves the owner conversation ON THAT CHANNEL, and stamps it into trigger_context runScheduleTick @cap:planifier-une-tache/moteur fails loud with lastStatus notify_unreachable (no fallback to another channel) when the chosen notify_channel has no owner conversation yet, and still fires the job WITHOUT a chatId runScheduleTick @cap:planifier-une-tache/moteur notifyChannel=null (auto) is byte-identical to the pre-B1 owner-chat regression path runScheduleTick @cap:planifier-une-tache/moteur accepts notify_unreachable as a valid last_status (migration 0066 CHECK constraint) les lectures du panneau Run @cap:planifier-une-tache/moteur borne les deux listes, et classe la plus récemment touchée d’abord les lectures du panneau Run @cap:planifier-une-tache/moteur ne laisse PAS sortir le secret d’un webhook les runs d’une automatisation @cap:planifier-une-tache/moteur ne rend que les siens, colonne ou provenance, et jamais ceux d’une autre les runs d’une automatisation @cap:planifier-une-tache/moteur compte sur la FENÊTRE, pas sur tout l’historique les runs d’une automatisation @cap:planifier-une-tache/moteur rattache les runs d’un webhook à SON slug les runs d’une automatisation @cap:planifier-une-tache/moteur ne sert pas une automatisation inconnue comme une page vide les runs d’une automatisation @cap:planifier-une-tache/moteur ne sert pas l’automatisation d’une AUTRE entité, même avec son id exact les runs d’une automatisation @cap:planifier-une-tache/moteur ne rend jamais le secret d’un webhook |
| Trigger on an event required Can I make it react to something happening outside? screen passed · engine passed
|
passed
Webhooks section — full click flow @cap:declencher-sur-evenement/ecran create, copy URL, toggle, rotate, delete, empty state la page d’un webhook @cap:declencher-sur-evenement/ecran dit ce qui le déclenche, sans jamais écrire son secret la page d’un webhook @cap:declencher-sur-evenement/ecran ne dessine PAS de bloc d’état de routine : un webhook n’en a pas 1 morela page d’un webhook @cap:declencher-sur-evenement/ecran mène ses runs à /jobs, et ne promet ni « Run now » ni « Edit » |
passed
POST /webhooks/:slug/:secret — happy path @cap:declencher-sur-evenement/moteur creates an agent_jobs row, increments trigger_count, and fires triggerWorker POST /webhooks/:slug/:secret — happy path @cap:declencher-sur-evenement/moteur returns 400 and creates no row when the trigger has no agentId |
| Capability | Screen | Engine |
|---|---|---|
| See what it costs required Can I know what this chat turn just cost me? screen passed · engine passed
|
passed
Agent budget @cap:voir-le-cout/ecran shows what the agent spent, sets a ceiling, warns, then says the pause StatusBar — cache expiry @cap:voir-le-cout/ecran dit le montant perdu et le nombre de reprises, à côté du coût StatusBar — cache expiry @cap:voir-le-cout/ecran deux reprises se disent au PLURIEL, et le détail nomme les jetons 12 moreStatusBar — cache expiry @cap:voir-le-cout/ecran aucune reprise : la barre n’en dit RIEN — pas de ligne à zéro StatusBar — cache expiry @cap:voir-le-cout/ecran une somme PARTIELLE le dit, avec le mot du segment voisin StatusBar — cache expiry @cap:voir-le-cout/ecran toutes les reprises tarifées : pas de « partial » posé pour rien StatusBar — cache expiry @cap:voir-le-cout/ecran le panneau détaillé nomme les jetons, le montant et la CAUSE StatusBar — cache expiry @cap:voir-le-cout/ecran le panneau compte les jetons même quand le montant est inconnu, et le DIT StatusBar — cache expiry @cap:voir-le-cout/ecran un surcoût inconnu ne s’affiche pas en dollars : les jetons sont comptés, le montant est tu Agent budget, à l’écran @cap:voir-le-cout/ecran montre la dépense du jour et du mois, avec les plafonds posés Agent budget, à l’écran @cap:voir-le-cout/ecran dit la pause quand un plafond est atteint Agent budget, à l’écran @cap:voir-le-cout/ecran Save envoie les trois nombres ; hors bornes, rien ne part budgetStatus @cap:voir-le-cout/ecran rien sous le seuil, et rien sans plafond budgetStatus @cap:voir-le-cout/ecran le mois atteint dit le 1er budgetStatus @cap:voir-le-cout/ecran le seuil du mois prévient quand le jour ne le fait pas |
passed
readAgentSpend @cap:voir-le-cout/moteur adds API calls of every provider and coding-CLI runs, today and this month readAgentSpend @cap:voir-le-cout/moteur the windows start at midnight and on the 1st in the WORKSPACE timezone readAgentBudgetState @cap:voir-le-cout/moteur reads the ceilings, the workspace timezone, and which window is reached 33 morereadAgentBudgetState @cap:voir-le-cout/moteur a stored timezone that is not a real one falls back to the server zone, and still gives a verdict readAgentBudgetState @cap:voir-le-cout/moteur budgetReached: 0 means no ceiling, the day before the month migration 0127_agent_budget @cap:voir-le-cout/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped migration 0127_agent_budget @cap:voir-le-cout/moteur the agent budget columns exist with neutral defaults, and the dead budget is gone migration 0127_agent_budget @cap:voir-le-cout/moteur folds the CLI cap into the daily budget ONLY where it applied migration 0127_agent_budget @cap:voir-le-cout/moteur records the migration in the journal drizzle-kit actually reads reliability guards #447: an agent over its daily budget stops before its next call, and says why @cap:voir-le-cout/moteur makeLlmCallSink @cap:voir-le-cout/moteur writes a full row: reported model wins, failover from chainIndex, provider cost kept makeLlmCallSink @cap:voir-le-cout/moteur persists Anthropic cache WRITES from providerMetadata into cache_creation_tokens makeLlmCallSink @cap:voir-le-cout/moteur writes the ERROR attempt too (the failed primary of a failover pair) makeLlmCallSink @cap:voir-le-cout/moteur unknown-pricing estimate stays NULL, not a misleading 0 agent budget actions @cap:voir-le-cout/moteur reads what the agent spent, API calls and CLI runs together agent budget actions @cap:voir-le-cout/moteur writes the three settings, and a reached ceiling reads back as reached agent budget actions @cap:voir-le-cout/moteur refuses out-of-bounds values and changes nothing agent budget actions @cap:voir-le-cout/moteur outside local-trust a non-owner changes nothing agent budget actions @cap:voir-le-cout/moteur an agent of another workspace is neither read nor written cacheLostOnResume @cap:voir-le-cout/moteur les trois tours du ticket #54 : UNE reprise, 35 200 jetons, et le surcoût au centième de cent cacheLostOnResume @cap:voir-le-cout/moteur le tour 3 ne perd rien : il a relu son cache neuf secondes plus tard cacheLostOnResume @cap:voir-le-cout/moteur le cache a TENU malgré 33 minutes : ce qui a été relu n’a rien coûté de plus cacheLostOnResume @cap:voir-le-cout/moteur trois appels rapprochés ne perdent rien : le cache n’avait pas expiré cacheLostOnResume @cap:voir-le-cout/moteur la frontière est la durée de vie du cache : à la seconde près, avant ne compte pas, après compte cacheLostOnResume @cap:voir-le-cout/moteur rien n’avait été mis en cache : il n’y a rien à perdre cacheLostOnResume @cap:voir-le-cout/moteur « le fournisseur ne dit pas » n’est pas « zéro » : une lecture inconnue ne devient pas une perte cacheLostOnResume @cap:voir-le-cout/moteur un changement de modèle n’est pas une expiration de cache cacheLostOnResume @cap:voir-le-cout/moteur un préfixe plus COURT que ce qui avait été mis en cache n’est pas le même préfixe cacheLostOnResume @cap:voir-le-cout/moteur deux jobs différents ne se suivent pas : chacun a son propre préfixe cacheLostOnResume @cap:voir-le-cout/moteur l’ordre d’arrivée des lignes n’y change rien : la règle range par date cacheLostOnResume @cap:voir-le-cout/moteur un modèle sans prix de cache : les jetons sont comptés, le montant est dit INCONNU cacheLostOnResume @cap:voir-le-cout/moteur sans date ni job, la règle se tait plutôt que de deviner getSpaceConversationAction — cache perdu à la reprise @cap:voir-le-cout/moteur les trois appels du ticket #54 : UNE reprise, 35 200 jetons, 0,1584 $ de surcoût getSpaceConversationAction — cache perdu à la reprise @cap:voir-le-cout/moteur la part perdue se compare à la facture du run : 0,1584 $ sur 0,5617 $ facturés getSpaceConversationAction — cache perdu à la reprise @cap:voir-le-cout/moteur le FIL de la conversation dit le même chiffre : c’est une AUTRE lecture getSpaceConversationAction — cache perdu à la reprise @cap:voir-le-cout/moteur trois appels rapprochés ne perdent RIEN : la ligne ne s’affiche pas |
| Find out how required When I get stuck, can the product explain it to me? screen passed · engine passed
|
passed
Help guides — OAuth wizard (Google Drive) @cap:consulter-l-aide/ecran wizard shows 4 Google API links and format hint Help guides — api_key connector (Apify) @cap:consulter-l-aide/ecran "Where do I get this?" expander reveals console.apify.com link la carte « Help » du rail @cap:consulter-l-aide/ecran reste fermée tant qu’on ne l’ouvre pas 3 morela carte « Help » du rail @cap:consulter-l-aide/ecran ouvre les TROIS liens du produit, chacun dans un nouvel onglet la carte « Help » du rail @cap:consulter-l-aide/ecran n’ouvre qu’UNE carte à la fois, Help ou le compte la carte « Help » du rail @cap:consulter-l-aide/ecran se referme à Échap, et PREND la touche en le faisant |
passed
the documentation index @cap:consulter-l-aide/moteur is exactly what the current pages produce — the committed file, byte for byte the documentation index @cap:consulter-l-aide/moteur skips exactly the subdirectories gen-reference.ts owns, as .gitignore lists them the documentation index @cap:consulter-l-aide/moteur carries one release section per `## v` heading of CHANGELOG.md 63 morethe documentation index @cap:consulter-l-aide/moteur splits the Telegram guide into sections that carry the steps and a working URL the documentation index @cap:consulter-l-aide/moteur strips MDX markup and keeps the words the documentation index @cap:consulter-l-aide/moteur keeps a code span whole, even when it is shaped like a tag the documentation index @cap:consulter-l-aide/moteur protects a code span that wraps across the line break the documentation index @cap:consulter-l-aide/moteur removes a JSX tag that spans several lines the documentation index @cap:consulter-l-aide/moteur never lets a fenced line open a section the documentation index @cap:consulter-l-aide/moteur closes a fence with as many backticks as opened it the documentation index @cap:consulter-l-aide/moteur removes an MDX comment, and leaves ordinary braces alone the documentation index @cap:consulter-l-aide/moteur ships no leftover markup anywhere in the index the documentation index @cap:consulter-l-aide/moteur builds the anchors the site actually serves Layer 1 — baseline discipline carries the platform reflex only when the agent has the tool it names @cap:consulter-l-aide/moteur buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur carries the reflex block on a job, where the agent holds nodal_docs buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur drops the reflex block on a surface that has no builtins buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur says a question about Nodal is never delegated (#455) buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur keeps its promise: nodal_docs answers a version question from the shipped index (#455) buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur follows the whitelist it is given, not a constant buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur names every channel the agent could be given, and both automations buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur stops offering a channel once the agent is bound to it buildSystemPrompt — the platform the agent runs in @cap:consulter-l-aide/moteur never offers to set up a channel whose binding exists but is disabled a CLI-runtime agent is told a question about Nodal is its own (#455) @cap:consulter-l-aide/moteur job path: the prompt the CLI receives carries the rule a CLI-runtime agent is told a question about Nodal is its own (#455) @cap:consulter-l-aide/moteur chat path: the prompt the CLI receives carries the rule a root asked "what changed in 0.9.2" is told the question is its own (#455) @cap:consulter-l-aide/moteur the real LLM request carries the rule, nodal_docs, and the delegation scope rule nodal_docs @cap:consulter-l-aide/moteur answers "configure Telegram" with the Telegram guide and the Channels tab nodal_docs @cap:consulter-l-aide/moteur answers "how do I set up a Telegram bot" with the setup steps, tab and field nodal_docs @cap:consulter-l-aide/moteur answers "cron" with the automations guide nodal_docs @cap:consulter-l-aide/moteur says nothing rather than something, when the documentation has no answer nodal_docs @cap:consulter-l-aide/moteur returns a bounded result — three passages, each clipped nodal_docs @cap:consulter-l-aide/moteur is deterministic — the same question twice gives the same passages nodal_docs @cap:consulter-l-aide/moteur ranks a heading match above a passing mention in the prose nodal_docs @cap:consulter-l-aide/moteur prefers a section that answers the WHOLE question over one that answers half of it loudly nodal_docs @cap:consulter-l-aide/moteur never serves one index the words of another nodal_docs @cap:consulter-l-aide/moteur breaks a tie on the URL, never on the order the index was written in nodal_docs @cap:consulter-l-aide/moteur matches a plural by prefix, and refuses to prefix-match a short word nodal_docs @cap:consulter-l-aide/moteur drops the words every question carries, and keeps the ones that matter nodal_docs @cap:consulter-l-aide/moteur probes sibling first, then the dev layout — the shipped pack, then the repo nodal_docs @cap:consulter-l-aide/moteur rejects an empty question at the schema, before any search nodal_docs @cap:consulter-l-aide/moteur shows its results as a search card, with each passage and its URL nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur answers "what changed in 0.9.2" with the v0.9.2 release section first nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur answers "changelog" and "nouveautés de la 0.9.1" from the release notes nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur answers "changelog 0.8.9" with the v0.8.9 section, whatever the words nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur answers "release notes 0.8.11" with the v0.8.11 section, whatever the words nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur answers "version 0.9.0" with the v0.9.0 section, whatever the words nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "Does Node v22.0 support this connector?" as a question about Nodal releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "Which OAuth version 2.0 does the Gmail connector use?" as a question about Nodal releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "Does the shell step work with ffmpeg 0.9.2?" as a question about Nodal releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "Is Node v0.9.1 enough to run a script?" as a question about Nodal releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur a version word or a "v" makes it a Nodal release question, whatever the number nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur reads EVERY version a question names, and shares the limit between the series nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur a two-part version covers its releases: "version 0.9?" serves a v0.9.x section nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur says a version named WITH the product has no notes ("nodal 0.9.99") nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur says a named version has no release notes, and names the latest, instead of serving its neighbours nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "GPT-5.2" as a question about releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "OAuth 2.0" as a question about releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur does not read "temperature 0.7" as a question about releases nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur reads a "v" before the number as a question about that release nodal_docs answers "what changed in version X" @cap:consulter-l-aide/moteur keeps release notes out of a how-to question: its ranking is the one without them the words a person actually types @cap:consulter-l-aide/moteur answers "remember something for later" with the page that has the answer the words a person actually types @cap:consulter-l-aide/moteur answers "remember this" with the page that has the answer the words a person actually types @cap:consulter-l-aide/moteur answers "for later" with the page that has the answer the words a person actually types @cap:consulter-l-aide/moteur answers "next time" with the page that has the answer the words a person actually types @cap:consulter-l-aide/moteur answers "how do I approve a command" with the page that has the answer the words a person actually types @cap:consulter-l-aide/moteur answers "allow this command" with the page that has the answer the shipped documentation index @cap:consulter-l-aide/moteur loads from the package and covers every channel and the automations |
The label @cap:<slug>/ecran or @cap:<slug>/moteur goes in the title of a describe or of a test, and holds for every case it contains. node apps/qa/porte.mjs refuses a label that names nothing, and a required capability no test claims any more; a label with no level is flagged without blocking, for the duration of the transition.
How many tests the repository carries, how much of the code they actually exercise, and how many user journeys the CI really plays. This is the "code health" page, useful to an engineer, less telling for the product (for that, see Capabilities).
Four numbers: the share of code a test goes through, the number of tests, the share of user scenarios the CI plays, and the number of bench sections. The first one only holds for the measured packages.
80.9%
30,915 lines covered out of 38,220
over 34 measured packages / 34
Up 1.24 point(s) over 7 days.
Every package of the repository is instrumented.
10,054
in 846 files, end-to-end aside
46 / 46
298 cases written · every one of them played
5
run by the CI
A package = a folder of the repository with its own code (the runner, the web app, the tools…). Sorted by what costs the most to ignore: the lines nobody tests.
Sorted by uncovered line count: what sits on top is what costs the most to ignore. An unmeasured package is hatched, it does not have zero, it has nothing. A package left out on purpose says so, and says why.
| Package | Cases | Lines | Line coverage | Branches |
|---|---|---|---|---|
| @nodal-agents/web | 2,818 | 10,068/13,440 |
74.9% |
66.6% |
| @nodal-agents/runner | 1,810 | 6,948/8,057 |
86.2% |
75.4% |
| @nodal-agents/tools | 1,318 | 4,150/4,738 |
87.6% |
73.4% |
| nodal-agents | 289 | 783/1,366 |
57.3% |
55.0% |
| @nodal-agents/db | 309 | 462/727 |
63.5% |
53.2% |
| @nodal-agents/llm | 402 | 1,137/1,359 |
83.7% |
76.6% |
| @nodal-agents/delivery | 178 | 682/823 |
82.9% |
72.1% |
| @nodal-agents/test-kit | 68 | 326/467 |
69.8% |
67.4% |
| @nodal-agents/shared | 373 | 1,001/1,135 |
88.2% |
73.9% |
| @nodal-agents/adapter-notion | 110 | 364/476 |
76.5% |
46.5% |
| @nodal-agents/qa | 513 | 816/903 |
90.4% |
84.0% |
| @nodal-agents/adapter-google-calendar | 12 | 23/105 |
21.9% |
0.0% |
| @nodal-agents/adapter-airtable | 47 | 77/150 |
51.3% |
37.3% |
| @nodal-agents/adapter-cloudflare | 9 | 19/88 |
21.6% |
4.2% |
| @nodal-agents/orchestration | 366 | 933/990 |
94.2% |
81.1% |
| @nodal-agents/adapter-google-drive | 106 | 199/236 |
84.3% |
61.1% |
| @nodal-agents/adapter-gmail | 171 | 415/448 |
92.6% |
58.7% |
| @nodal-agents/checkpoints | 69 | 257/283 |
90.8% |
78.6% |
| @nodal-agents/adapter-google-sheets | 153 | 307/332 |
92.5% |
65.6% |
| @nodal-agents/auth | 92 | 126/148 |
85.1% |
82.0% |
| @nodal-agents/adapter-tavily | 42 | 47/66 |
71.2% |
58.1% |
| @nodal-agents/adapter-outlook-mail | 127 | 238/256 |
93.0% |
71.4% |
| @nodal-agents/adapter-mcp | 64 | 154/170 |
90.6% |
82.6% |
| @nodal-agents/adapter-google-docs | 152 | 220/235 |
93.6% |
68.7% |
| @nodal-agents/adapter-poyo | 22 | 64/78 |
82.0% |
71.7% |
| @nodal-agents/adapter-firecrawl | 54 | 69/79 |
87.3% |
81.0% |
| @nodal-agents/mcp-server | 26 | 62/72 |
86.1% |
92.6% |
| @nodal-agents/memory | 146 | 287/296 |
97.0% |
84.0% |
| @nodal-agents/secrets | 22 | 49/56 |
87.5% |
77.1% |
| @nodal-agents/docs | 61 | 432/438 |
98.6% |
84.9% |
| @nodal-agents/catalog | 37 | 71/73 |
97.3% |
87.5% |
| @nodal-agents/adapter-apify | 70 | 88/89 |
98.9% |
85.1% |
| @nodal-agents/bench | 7 | 18/18 |
100.0% |
92.8% |
| @nodal-agents/runner-adapters | 11 | 23/23 |
100.0% |
100.0% |
What today's measurement holds against the repository, sorted by severity. This list is COMPUTED from the other pages, never written by hand: it changes when the repository changes. It is the page to read when you only have a minute.
An agent opened them and wrote no "Verified" section, so nothing in them was checked against npm, git or a test run. That is exactly how a version that shipped a week earlier became a task on this board.
#579 Cost totals still turn an unknown into a precise number: run summary, CLI pipeline view, refused capped turn
Green and red within their window. No isolated run gives them away: they pass for green every time they pass.
Proof commands — la page du projet @cap:verifier-un-livrable/ecran F — /code mène à Workspaces : la liste a disparu, le panneau est sur le projet Proof commands — la page du projet @cap:verifier-un-livrable/ecran G — RIEN ne déborde du panneau, chemin long et commande longue comprises Approvals tab @cap:regler-autonomie/ecran Autonomy tab is visible in the agent editor Connector scope disclosure Google Drive states it reaches the ENTIRE Drive Connector scope disclosure Google Sheets and Docs disclose their reach too déplier un bloc du fil @cap:parler-a-un-agent/ecran C — déplier DEPUIS LE BAS ne fait pas filer la zone visible Built-in tools — per-tool controls return_result is shown but locked, with the reason Built-in tools — per-tool controls and can be handed back — the restriction is reversible Built-in tools — per-tool controls blocking a built-in tool persists across a reload Built-in tools — per-tool controls the section lists the built-in tools, always — no fixtures needed A — allowlist renders: owner badged, pending has Approve/Deny, member has Revoke Help guides — OAuth wizard (Google Drive) @cap:consulter-l-aide/ecran wizard shows 4 Google API links and format hint Google Drive OAuth flow (wizard-driven) @cap:connecter-un-service/ecran connect via wizard → callback → connected status and toast MCP Connectors page Scenario A — /mcp renders the connected Cogni Cortex server le registre lui-même nomme la preuve attendue exactement là où le dépôt n’en a aucune Airtable OAuth flow (wizard-driven) connect via wizard → callback → connected status Apify api_key connector smoke test marketplace card opens modal; connect with name + apiKey creates active instance Test A — LLM key add + test connection + save navigate to /llm-providers, add a provider, test connection, save, row appears Connector multi-instance can create two instances of the same api_key connector and both appear in Active Connectors Credential reuse — Drive + Gmail share one Google credential connect Drive via wizard → reuse credential for Gmail via dropdown
First half of the runs against the second half. A drift is repaired while it is small; once settled, it becomes the normal nobody argues with any more.
The end-to-end scenarios: a real browser doing what a user would do, open the page, create an agent, connect a service. It is the net closest to real usage, and the most fragile.
46 versioned, and only 6 guard a pull request: the others observe after the fact, or never.
Three groups by cadence: played on every pull request (blocks), every night (observes), by hand (never). The last result is case by case, a journey can be partly green, partly skipped.
These BLOCK a regression before the merge.
| Journey | Cases | Last result | Duration |
|---|---|---|---|
| activity-runs.spec.ts Activity is the list of runs: one row per run, unfolded into its calls. |
4 | 2 green | 15.8 s |
| autonomy-approvals.spec.ts An owner settles, tool by tool, what an agent may do alone and what it must ask for first. |
12 | 3 green 1 skipped | 7.9 s |
| delegation-outcome.spec.ts what the USER sees when a delegation ends. |
5 | 2 green | 2.7 s |
| edrow-narrow.spec.ts EdRow dans une grille ÉTROITE (issue #310). |
5 | 3 green | 1.4 s |
| memory-kept.spec.ts A fact taught on the screen is still there on the next visit, and findable. |
5 | 2 green | 6.2 s |
| smoke.spec.ts Playwright e2e — the boot journey: the dashboard opens, every section is reachable, and an agent can be created and given a task. |
15 | 8 green | 32.4 s |
These OBSERVE it the next day. They guard no pull request.
| Journey | Cases | Last result | Duration |
|---|---|---|---|
| agent-budget.spec.ts le budget d'un agent, réglé dans son onglet Settings et relu en base (#447). |
4 | 1 green | 14.2 s |
| agent-folder-pick-adds.spec.ts valider Browse… ATTACHE le dossier (#461). |
4 | 1 green | 3.7 s |
| agent-recipes.spec.ts "What should this agent do?" → one pre-filled agent. |
4 | 2 green | 3.5 s |
| agent-tool-assignment.spec.ts An owner gives an agent a connector from the agent's edit page, and takes it back. |
8 | 4 green | 11.6 s |
| agents-redesign.spec.ts An owner sees their team on the /agents page: orchestrators as cards, workers as rows they can reorder. |
4 | 1 skipped | 1.0 s |
| airtable-oauth.spec.ts An owner connects Airtable through its consent screen and comes back to a connected account. |
4 | 1 green | 10.8 s |
| apify-apikey.spec.ts An owner installs Apify by pasting an API key, and names the account. |
4 | 1 green | 4.3 s |
| automations-notify-runnow.spec.ts An owner schedules an automation, asks to be told when it succeeds, and runs it once by hand. |
12 | 3 green | 12.2 s |
| brique31-flows.spec.ts An owner adds an LLM key, tests it, and chooses the model an agent will speak with. |
19 | 4 green 1 skipped | 23.8 s |
| chat-approvals.spec.ts an approval is answered in the conversation (#469). |
6 | 2 green | 13.1 s |
| chat-composer-anchored.spec.ts la saisie reste en bas pendant qu'une réponse s'écrit. |
6 | 1 green 1 skipped | 4.6 s |
| chat-live-reattach.spec.ts revenir sur une conversation PENDANT la réponse (#457). |
4 | 1 green | 2.4 s |
| chat-stop.spec.ts Envoyer devient Stop pendant qu'une réponse s'écrit (#456). |
4 | 1 green | 1.7 s |
| code-verification.spec.ts le panneau « Proof commands » d'un projet (plan « Vérifier & Corriger », T22 / D9). see the run |
12 | 5 green 1 flaky 1 skipped | 37.9 s |
| command-allowlist.spec.ts An owner names the commands an agent may start, reads them back, then removes the list. |
8 | 3 green | 17.3 s |
| command-execution-yolo.spec.ts Playwright e2e — "Run commands" on the agent's Autonomy tab. |
4 | 1 green | 8.6 s |
| connector-multi-instance.spec.ts An owner installs the same connector twice, one account for each side of their work. |
4 | 1 green | 10.1 s |
| connector-scope-disclosure.spec.ts Playwright e2e — CONNECTOR-001: how far a connector's token reaches is stated BEFORE the provider's consent screen. |
8 | 4 green | 7.9 s |
| credentials-reuse.spec.ts An owner reuses one Google credential for a second connector instead of pasting it again. |
4 | 1 green | 9.4 s |
| help-guides.spec.ts An owner who does not know where to find a key follows the in-page guide to the right console. |
5 | 2 green | 3.9 s |
| internal-tool-toggles.spec.ts An owner blocks one built-in tool for one agent, and hands it back. |
11 | 4 green | 19.2 s |
| learned-skills.spec.ts An owner sees the skills an agent learned on its own, and chooses whether it keeps learning. |
6 | 4 green | 6.3 s |
| mcp-connectors.spec.ts An owner finds their MCP servers on a page of their own, next to the API connectors. |
6 | 2 green | 4.7 s |
| notify-channel.spec.ts An owner chooses which channel an automation reports to when it succeeds. |
14 | 3 green 1 skipped | 12.2 s |
| notion-internal.spec.ts An owner connects Notion with an internal integration key, alongside the OAuth path. |
3 | 1 green | 5.3 s |
| notion-oauth.spec.ts An owner connects Notion through its consent screen and comes back to a connected account. |
4 | 1 green | 4.5 s |
| oauth-flow.spec.ts An owner connects Google Drive through its consent screen and comes back to a connected account. |
4 | 1 green | 4.6 s |
| run-budget.spec.ts le budget de run de l'espace, et l'attente du premier mot d'un agent, réglés à l'écran et relus en base (#442). |
5 | 2 green | 5.4 s |
| schedule-daily-budget.spec.ts An owner caps what a scheduled task may spend in a day. |
6 | 2 green | 8.6 s |
| settings-network.spec.ts An owner opens the dashboard to the local network, and is told which address to use and that a restart is needed. |
6 | 4 green | 5.7 s |
| settings-verification-surfaces.spec.ts Vérifier & Corriger, T23 — la section « Verification surfaces » de /settings. |
7 | 3 green | 2.8 s |
| shell-checklist.spec.ts what an agent may NOT do with a shell (#464). |
4 | 1 green | 3.9 s |
| telegram-allowlist.spec.ts An owner says which Telegram chats may talk to an agent, approves one, and revokes another. |
5 | 3 green | 17.5 s |
| thread-autoscroll.spec.ts Un fil s'ouvre EN BAS, sur son dernier message. |
9 | 4 skipped | 10.1 s |
| thread-unfold-keeps-scroll.spec.ts déplier un bloc ne déplace pas le lecteur. |
6 | 3 green | 7.1 s |
| thread-unfold-small-block.spec.ts une PETITE boîte dépliée ne fait pas filer le fil, même une seconde plus tard. |
5 | 2 green | 11.5 s |
| tools-tab.spec.ts An owner sees which tools an agent may use, and which ones a skill brings with it. |
9 | 5 green | 21.0 s |
| user-menu.spec.ts A user signs out from the sidebar menu and signs back in. |
5 | 1 skipped | 4.0 s |
| webhooks-flows.spec.ts An owner creates an inbound webhook, copies its URL, rotates its secret, and deletes it. |
5 | 1 green | 4.7 s |
| work-mcp-run-stays-in-work.spec.ts a run from the MCP folder opens in Work. |
4 | 1 green | 8.2 s |
The bench does not ask "is it broken?" but "what CHANGED, and by how much": the size of the prompt, the number of architecture rules, the cost of a turn… Every measurement has an accepted reference value; drifting from it is a regression.
Last run on 29 Sept 2026, 10:12Z: no regression, no section down.
One card per measured section. The baseline is the last accepted value, with the commit that accepted it: that is what the next run will be compared against.
accepted on 10 Sept 2026, 05:25Z
accepted on 08 Aug 2026, 16:26Z
accepted on 10 Sept 2026, 05:25Z
accepted on 10 Sept 2026, 05:25Z
accepted on 10 Sept 2026, 05:25Z
The answer to "what runs the tests, and when". Read from the GitHub Actions workflow files, not from an intention: if a journey is named nowhere, nobody plays it.
How long you wait for a pull request's checks, over the CI's last thirty green runs. It is this number that decides the fate of the tests: when the wait becomes unbearable, it is the suite that gets shortened.
One record per test, kept from one measurement to the next: how many times it ran, how many times it fell, how long it has been red. It is the only page that sees TIME, and therefore flakiness, invisible in an isolated run.
38
green AND red within their window
A broken test gets repaired. A flaky test gets endured: no isolated run gives it away, it passes for green every time it passes.
23
red at every known run
11,508
10,850 played at the last measurement
2.68 d
over 11 repair(s) observed end to end
The tests that fall most often relative to their runs. A 30% rate over ten runs is worse than a test that is always red: you never know whether to believe it.
Sorted by failure rate. The ribbon reads left to right, oldest to newest.
| Test | Last runs | Failures | Rate | Red since |
|---|---|---|---|---|
| apps/web/tests/e2e/code-verification.spec.ts Proof commands — la page du projet @cap:verifier-un-livrable/ecran F — /code mène à Workspaces : la liste a disparu, le panneau est sur le projet see the run |
9/10 | 90 % | 21 Sept 2026, 09:23Z | |
| apps/web/tests/e2e/code-verification.spec.ts Proof commands — la page du projet @cap:verifier-un-livrable/ecran G — RIEN ne déborde du panneau, chemin long et commande longue comprises see the run |
11/13 | 84.6 % | · | |
| apps/web/tests/e2e/autonomy-approvals.spec.ts Approvals tab @cap:regler-autonomie/ecran Autonomy tab is visible in the agent editor see the run |
4/11 | 36.4 % | · | |
| apps/web/tests/e2e/connector-scope-disclosure.spec.ts Connector scope disclosure Google Drive states it reaches the ENTIRE Drive see the run |
5/16 | 31.3 % | · | |
| apps/web/tests/e2e/connector-scope-disclosure.spec.ts Connector scope disclosure Google Sheets and Docs disclose their reach too see the run |
5/16 | 31.3 % | · | |
| apps/web/tests/e2e/thread-unfold-keeps-scroll.spec.ts déplier un bloc du fil @cap:parler-a-un-agent/ecran C — déplier DEPUIS LE BAS ne fait pas filer la zone visible see the run |
3/17 | 17.6 % | · | |
| apps/web/tests/e2e/internal-tool-toggles.spec.ts Built-in tools — per-tool controls return_result is shown but locked, with the reason see the run |
5/33 | 16.7 % | · | |
| apps/web/tests/e2e/internal-tool-toggles.spec.ts Built-in tools — per-tool controls and can be handed back — the restriction is reversible see the run |
4/33 | 13.3 % | · | |
| apps/web/tests/e2e/internal-tool-toggles.spec.ts Built-in tools — per-tool controls blocking a built-in tool persists across a reload see the run |
4/33 | 13.3 % | · | |
| apps/web/tests/e2e/internal-tool-toggles.spec.ts Built-in tools — per-tool controls the section lists the built-in tools, always — no fixtures needed see the run |
4/33 | 13.3 % | · | |
| apps/web/tests/e2e/telegram-allowlist.spec.ts A — allowlist renders: owner badged, pending has Approve/Deny, member has Revoke |
1/9 | 11.1 % | · | |
| apps/web/tests/e2e/help-guides.spec.ts Help guides — OAuth wizard (Google Drive) @cap:consulter-l-aide/ecran wizard shows 4 Google API links and format hint see the run |
3/28 | 10.7 % | · | |
| apps/web/tests/e2e/oauth-flow.spec.ts Google Drive OAuth flow (wizard-driven) @cap:connecter-un-service/ecran connect via wizard → callback → connected status and toast see the run |
3/28 | 10.7 % | · | |
| apps/web/tests/e2e/mcp-connectors.spec.ts MCP Connectors page Scenario A — /mcp renders the connected Cogni Cortex server see the run |
6/33 | 10 % | · | |
| apps/qa/lib.test.mjs le registre lui-même nomme la preuve attendue exactement là où le dépôt n’en a aucune see the run |
2/28 | 7.1 % | · | |
| apps/web/tests/e2e/airtable-oauth.spec.ts Airtable OAuth flow (wizard-driven) connect via wizard → callback → connected status |
5/33 | 6.7 % | · | |
| apps/web/tests/e2e/apify-apikey.spec.ts Apify api_key connector smoke test marketplace card opens modal; connect with name + apiKey creates active instance |
5/33 | 6.7 % | · | |
| apps/web/tests/e2e/brique31-flows.spec.ts Test A — LLM key add + test connection + save navigate to /llm-providers, add a provider, test connection, save, row appears |
5/33 | 6.7 % | · | |
| apps/web/tests/e2e/connector-multi-instance.spec.ts Connector multi-instance can create two instances of the same api_key connector and both appear in Active Connectors |
5/33 | 6.7 % | · | |
| apps/web/tests/e2e/credentials-reuse.spec.ts Credential reuse — Drive + Gmail share one Google credential connect Drive via wizard → reuse credential for Gmail via dropdown |
5/33 | 6.7 % | · |
Red at their last runs. "Red since" only dates the flips we saw: a test red since before the first measurement has no date, and that is honest. "Age" counts the days as of the collection, not as of when you open the page; past 14 days it turns red.
| Test | Last runs | Failures | Rate | Red since | Age |
|---|---|---|---|---|---|
| apps/web/tests/e2e/agent-flows.spec.ts Scenario A — Proactive save_memory concierge saves memory proactively when user says "retiens-le" |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agent-recipes.spec.ts agent recipes @cap:configurer-agent a profile shows what it sets, then creates ONE ordinary agent with skills and read-only rules |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agent-recipes.spec.ts agent recipes a profile shows what it sets, then creates ONE ordinary agent with skills and read-only rules |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agent-tool-assignment.spec.ts Agent edit page — Tools & Connectors section @cap:assigner-outils Scenario A — Tools & Connectors section renders with the test connector |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agent-tool-assignment.spec.ts Agent edit page — Tools & Connectors section Scenario A — Tools & Connectors section renders with the test connector |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agents-redesign.spec.ts Agents page redesign @cap:organiser-equipe render, dark mode, add-worker modal, keyboard drag round-trip |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/agents-redesign.spec.ts Agents page redesign render, dark mode, add-worker modal, keyboard drag round-trip |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/brique31-flows.spec.ts Test B — Agent edit picks LLM provider change LLM provider dropdown on agent edit → model field updates → save → toast |
5/5 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/code-verification.spec.ts Proof commands — onglet Code A — configurer puis approuver, hash écrit EN BASE |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/help-guides.spec.ts Help guides — api_key connector (Apify) "Where do I get this?" expander reveals console.apify.com link |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/help-guides.spec.ts Help guides — api_key connector (Apify) @cap:consulter-l-aide "Where do I get this?" expander reveals console.apify.com link |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/help-guides.spec.ts Help guides — OAuth wizard (Google Drive) @cap:consulter-l-aide wizard shows 4 Google API links and format hint |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/help-guides.spec.ts Help guides — OAuth wizard (Google Drive) wizard shows 4 Google API links and format hint |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/notion-oauth.spec.ts Notion OAuth flow (wizard-driven) @cap:connecter-un-service connect via wizard → callback → connected status (no Refresh button) |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/notion-oauth.spec.ts Notion OAuth flow (wizard-driven) connect via wizard → callback → connected status (no Refresh button) |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/oauth-flow.spec.ts Google Drive OAuth flow (wizard-driven) @cap:connecter-un-service connect via wizard → callback → connected status and toast |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/oauth-flow.spec.ts Google Drive OAuth flow (wizard-driven) connect via wizard → callback → connected status and toast |
1/1 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/tools-tab.spec.ts Step 2 — Tools tab lists both native tool groups |
5/5 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/user-menu.spec.ts UserMenu — sign-out + re-login round-trip @cap:se-connecter/ecran shows email in sidebar, signs out, redirects to /login, re-logs in see the run |
1/28 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/user-menu.spec.ts UserMenu — sign-out + re-login round-trip shows email in sidebar, signs out, redirects to /login, re-logs in |
5/5 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/webhooks-flows.spec.ts Webhooks section — full click flow @cap:declencher-sur-evenement create, copy URL, toggle, rotate, delete, empty state |
4/4 | 100 % | · | flip never seen | |
| apps/web/tests/e2e/webhooks-flows.spec.ts Webhooks section — full click flow create, copy URL, toggle, rotate, delete, empty state |
1/1 | 100 % | · | flip never seen | |
| packages/tools/src/tests/intent.test.ts l’intention de mutation, posée par executeTool une écriture RÉELLE est constatée, et produit |
1/1 | 100 % | · | flip never seen |
One line per collection: when, triggered by what, on which commit, with which headline numbers. This is what will make TRENDS readable, coverage sliding, a test count going flat, and the real regularity of the measurement.
The same numbers as the Overview, but over 30 days. The figure next to the title is the gap between the first and the last collection of the window. Collections started from a workstation are left out: they do not measure main.
| When | Trigger | Commit | Cases | Journeys in CI | Coverage |
|---|---|---|---|---|---|
| 29 Sept 2026, 10:21Z | schedule | 13f5a066 | 10,054 | 46/46 | 80.9% |
| 29 Sept 2026, 01:09Z | workflow_dispatch | 4510428d | 10,049 | 46/46 | 80.9% |
| 28 Sept 2026, 22:59Z | workflow_dispatch | d3c94c2e | 9,967 | 46/46 | 80.9% |
| 28 Sept 2026, 10:16Z | schedule | 7ab00c0b | 9,869 | 46/46 | 80.7% |
| 27 Sept 2026, 09:50Z | schedule | 2283f806 | 9,630 | 46/46 | 80.4% |
| 26 Sept 2026, 09:09Z | schedule | a61aded8 | 9,611 | 46/46 | 80.4% |
| 25 Sept 2026, 09:22Z | schedule | 68d2072e | 9,601 | 44/44 | 80.1% |
| 24 Sept 2026, 08:56Z | schedule | 3ba0e406 | 9,416 | 38/38 | 79.9% |
| 23 Sept 2026, 09:02Z | schedule | 4d238e62 | 9,345 | 36/36 | 79.7% |
| 22 Sept 2026, 11:37Z | workflow_dispatch | 13a9e118 | 9,306 | 36/36 | 79.6% |
| 22 Sept 2026, 09:01Z | schedule | 53653e5a | 9,304 | 36/36 | 79.4% |
| 21 Sept 2026, 09:23Z | schedule | 1af7d7ca | 9,041 | 36/36 | 81.7% |
| 20 Sept 2026, 08:57Z | schedule | 74fc97ed | 8,758 | 35/35 | 82.0% |
| 19 Sept 2026, 08:26Z | schedule | 01354ea4 | 8,173 | 35/35 | 82.6% |
| 19 Sept 2026, 03:03Z | workflow_dispatch | 52050598 | 8,118 | 35/35 | 82.5% |
| 18 Sept 2026, 20:38Z | workflow_dispatch | dee372ea | 8,118 | 35/35 | 82.5% |
| 18 Sept 2026, 16:36Z | workflow_dispatch | e8d7f334 | 7,950 | 35/35 | 82.2% |
| 18 Sept 2026, 08:37Z | schedule | f0389dcc | 7,636 | 33/33 | 82.0% |
| 17 Sept 2026, 09:00Z | schedule | e01dcb37 | 7,378 | 33/33 | 81.8% |
| 16 Sept 2026, 17:31Z | workflow_dispatch | d85800a4 | 7,348 | 32/32 | 81.8% |
| 16 Sept 2026, 17:09Z | workflow_dispatch | c139d033 | 7,337 | 31/31 | 81.7% |
| 16 Sept 2026, 10:41Z | workflow_dispatch | d0267a7a | 7,280 | 31/31 | 81.7% |
| 16 Sept 2026, 08:48Z | schedule | 0bb8239b | 7,280 | 31/31 | 81.7% |
| 16 Sept 2026, 08:14Z | workflow_dispatch | 953c91bb | 7,280 | 31/31 | 81.7% |
| 15 Sept 2026, 16:50Z | workflow_dispatch | 76761ae9 | 6,999 | 30/31 | 81.8% |
| 15 Sept 2026, 09:01Z | schedule | 13329166 | 6,982 | 29/30 | 81.8% |
| 14 Sept 2026, 09:10Z | schedule | 3e067fb1 | 6,881 | 29/30 | 81.6% |
| 13 Sept 2026, 17:21Z | workflow_dispatch | 7a2fa74f | 6,866 | 29/30 | 81.5% |
| 13 Sept 2026, 08:45Z | schedule | f239fa28 | 6,772 | 29/30 | 80.5% |
| 12 Sept 2026, 08:22Z | schedule | 58bcd0aa | 6,721 | 29/30 | 81.3% |
| 12 Sept 2026, 07:10Z | workflow_dispatch | 175685cc | 6,721 | 29/30 | 81.3% |
| 11 Sept 2026, 16:44Z | workflow_dispatch | c37885be | 6,721 | 29/30 | 81.3% |
| 10 Sept 2026, 16:12Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:12Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:10Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:09Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:09Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:09Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:09Z | local | 82fb057e | 6,704 | 29/30 | 81.6% |
| 10 Sept 2026, 16:07Z | local | 82fb057e | 6,700 | 29/30 | 81.6% |