01The board

Work in flight

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.

0.9.3latest on npm, published 26 Sept
0.9.3version in the repo
·commits on main since no tag

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.

3 decisions waiting on you: they block the rest until they are settled. And 3 pull requests are waiting for your merge.

Running

?

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.

To do

3

In progress

55
#628no release Bound agent writes with an OS sandbox #626no release Start with this machine: the Windows Run entry does not appear in Settings > Apps > Startup #619no release Provider transport: prove HTTP/1.1 behind an HTTPS_PROXY tunnel and real CA validation (#609 follow-up) #617no release One overwritten file cannot be restored from the screen, so shared overwrites still ask the owner #611no release A roster names a teammate's connectors by slug only: the root cannot tell which teammate can print #610no release Bump undici to 7.29.1 in both importers (GHSA-3wwx-pv8p-q78v) #607no release Runner log lines carry no timestamp: the time between steps of a run cannot be measured #606no release A slow OpenRouter upstream holds a turn for minutes: requests state no latency or throughput floor #584no release Package installs written with global options (npm --prefix, pnpm --dir, uv --no-progress) or by bun fall in no shell-checklist category #580no release A page render fails with HTTP 500 when Google Fonts cannot be reached (next/font/google), twice in CI today #579no releaseno verified facts Cost totals still turn an unknown into a precise number: run summary, CLI pipeline view, refused capped turn #578no release A CLI tool call killed before it reports its result leaves no audit row, whatever killed it #574no release A job on the Claude Code or Codex runtime receives no Nodal tool: it cannot delegate, ask, or stop the runs of its conversation #558no release The web pack build reads the system temp folder and fails on a locked file there (EPERM readlink), whatever the version debt #556no release Skill install/update errors reach the owner as runner-written prose instead of a code the web words debt #540no release agent_jobs.status accepts NULL, and every NOT IN on it silently skips such a row (a NULL job is never completed, failed or cancelled) debt #538no release On Windows, stopping the stack leaves embedded Postgres workers alive, and one holds port 25444 so the next start fails debt #531no release On Slack, Discord, WhatsApp and Telegram, a message sent while the conversation's work is still running starts a duplicate job product #529no release A channel question offers only the agent's buttons: the next message while it waits should be the free answer product #528no release The sidebar polls five server actions every 15 s and resends unchanged data each time debt #5120.9.4 release:check keeps only turbo's summary on a failed test step, so an intermittent failure cannot be named #5070.9.4 A working folder attached to a request, carried down the whole delegation tree for that run #483Backlog Support Jev (TypeSafe System One): a decision client beside the chat client, never an agent's model product #477Backlog Guard model: judge a flagged shell command before asking the owner (Hermes smart approvals) product #475Backlog Confine shell commands to the agent's folders with an OS-level sandbox product #462Backlog Spreadsheet discipline: totals are computed by a tool, not added up in the model's head #448Backlog Brick 6 of long runs: the two clocks calibrate themselves on measured calls instead of constants product #446Backlog Export and import an agent's configuration as files (the Portable study, 16/08) product #434Backlog Run 531c2692: a timed-out research was re-sent to a forum persona, written outside the vault, and verified by its own author bug #426Backlog Tools just-in-time: a light list in the prompt, full schemas only for the tools the turn needs cost #425Backlog Ask for prompt caching on every route that honours it, instead of hoping the provider caches cost #424Backlog Skills: inject the index always, the body only when the turn concerns the skill cost #423Backlog Background memory review after a job: bounded, on a cheaper model, staged for the owner's approval (the Hermes shape) product #417Backlog Catalogue reasoning controls predate OpenRouter's reasoning object: GLM 5.3 Flash and DeepSeek V4 disagree with upstream bug #414Backlog OpenRouter image models (Grok Imagine Image 2.0) need an image-output path before the catalogue can list them product #410Backlog Portal: the Gaps page counts a package left out on purpose as never measured bug #402no release Rules for everyone: a page of their own, and the agent tab says when one applies product #391no release The top bar of a code run concludes on one deliverable and stays silent about the others product #386no release Delivery diff plaque: load fragments by a stable key, not by re-resolving the path debt #362no release Design system: retire the old ApprovalCard mirror and mirror ApprovalRequestCard debt #356no release The activity lime has almost no luminance contrast on the light theme product #331Backlog The connector capability table in the baseline prompt is hand-written: derive it from the catalog debt #330Backlog The chat turn gets nodal_docs too: today a conversation exposes run_task and nothing else product #328Backlog Quality portal: the Running now strip reads the review passes from agent_jobs, its third source product #287Backlog A code project's identity is derived twice: the shared resolver and the Code screen (#101 section 2) debt #285Backlog A CLI chat turn posts no mutation intent: the project is dirty only after the write, never before debt #284Backlog The write-epoch bump leaves a one-UPDATE window: a proof inside it is stale without knowing debt #280Backlog The pack build opens one page worker per core, so its memory need follows the machine and not the dashboard debt #267Backlog The agent-slug scanner never reads a test file, and the fixtures name real agents debt #265Backlog The Tools tab journey pivots on the first element of a catalogue array debt #264Backlog The #62 guard: proven on the root branch only, and it reads one prompt layer debt #260Backlog Resume a parent without resending its whole context cost #254Backlog Composer: attach an image with the + button, on the multimodal path Telegram photos already take product #246Backlog The ROOT agent can change workspace settings through a tool of its own, network access first; headless installs get the answer as a CLI flag product #241Backlog Install Nodal on any compatible local Postgres, with the prerequisites checked and the install commands given before the first attempt product

In review

3

To test

7

Done

149

last 7 days, newest first

#4510.9.4 Settings: "Start Nodal when this machine starts" PR #627no releaseCI green Settings: Start Nodal when this machine starts, read from the system, without admin rights on Windows (#451) #4940.9.4 An agent on the Claude Code runtime cannot run any shell command; Nodal approvals and Yolo never reach it PR #551no releaseCI red Claude Code runtime: shell commands follow one owner setting and the brake, on every CLI path (#494) #4850.9.4 MCP server: set up Claude Code and Claude Desktop at the same time from Settings product PR #625no releaseCI green MCP server: Settings sets up Claude Code and Claude Desktop at the same time, with the command of this install (#485) #614no release An autonomous agent asks before downloading into its own workspace: the default shell policy asks for everything PR #618no releaseCI green An autonomous agent downloads into its workspace and runs code without asking; leaving the workspace still asks #612no release Tool schemas load on demand: a job carries its whole whitelist's schemas on every turn (58 % of the root's input) PR #616no releaseCI green A job reads the schemas it needs and keeps its whole whitelist callable #613no release Channel instructions contradict the runner: MarkdownV2, markdown and hand-splitting on a plain-text, auto-split channel PR #615no releaseCI green A channel job's prompt states its channel's facts from the adapter, and no rule the runner contradicts #4650.9.4 An agent's question is answered inline in the chat: one row per answer, and "something else" opens a text field PR #622no releaseCI green Questions are answered inline, and "Something else" sends the typed text as the answer (#465) #5010.9.4 Opening a run from the bell, an approval, Logs or the Runs table sends the sidebar to Scheduled PR #621no releaseCI green Runs: a run opens in the section it belongs to, decided in one place (#501) #4440.9.4 Long runs 5: the run page shows the turn streaming, the budget consumed, and Stop keeps the partial product PR #624no releaseCI green The run page shows the call in progress, and Stop keeps the partial as the result (#444) #4840.9.4 A streamed LLM call can run up to an hour producing only reasoning or tool arguments: nothing shows it, nothing caps it short of the absolute clock bug PR #623no releaseCI green A streamed call says what it is producing while it produces it (#484) #5080.9.4 Delivered card: the cost counts the root agent only, while the status bar counts the whole tree PR #620no releaseCI green Delivered card: the cost of a run is the cost of its whole tree (#508) #608no release One unread response body stalls every LLM call of the runner: all calls share one HTTP/2 connection PR #609no releaseCI red LLM calls never share a connection, and an abandoned call releases its response #600no release Turn 1 forces tool_choice 'required'; every degenerate turn on record is one of those forced turns PR #604no releaseCI green The model decides whether to call a tool on every turn, for every model #601no release An orchestrator does itself the work the user explicitly asked a teammate's specialty for PR #603no releaseCI green An explicit request for a teammate's specialty is handed to that teammate #602no release /stop from any channel ends every run of the conversation, without asking a model PR #605no releaseCI green /stop from any channel ends every run of the conversation, without asking a model PR #599no releaseCI green constat-fallback test: the 1,100-file setup snapshot gets a bound it never meets on Windows PR #598no releaseCI green code-task wiring test compares the process folder in its canonical form, so the Windows 8.3 short path no longer fails main #562no release The root forged a delegation outcome and a 12 KB report on Telegram before its child ran, imitating ledger lines replayed as its own text PR #576no releaseCI green Replayed history never puts runner-written lines in the agent's mouth PR #597no releaseCI green frozen-index test: only the hanging case gets the tiny bound, so a loaded machine no longer turns main red #559no release A delegated job's prompt orders Telegram delivery through a tool its whitelist does not give it PR #570no releaseCI green A job's prompt names only the tools that job holds #567no release Stop from a channel reaches nothing: the root cannot see or cancel the runs of its conversation and says nothing runs #566no release A job marked failed by someone else keeps executing: the loop never re-reads its status between tool calls PR #575no releaseCI green A job acts, on every runtime, only while its row authorizes it: no zombie after a reap, a stop or a re-claim, and a stop from the conversation reaches every run PR #596no releaseCI green e2e: the panel overflow case measures a deliberately truncated element by its box, and stays strict PR #594no releaseCI green e2e: six cases red since 21/09 and 25/09 look for renamed screens; the Files & proof panel stops scrolling sideways PR #595no releaseCI green A process's paths text is right for the folder it really runs in: junctions, sub-folders and nested workspaces #592no release A process started by a tool reads workspace labels as folders: ComfyArtist/outputs lands in ComfyArtist/ComfyArtist/outputs PR #593no releaseCI green Every tool that starts a process tells the model where it runs and that workspace labels are not folders there #590no release Writes are not constated when the workspace sits in a git repo rooted above it: files an agent produces by shell are invisible, and cannot be delivered by its root PR #591no releaseCI green A shell write is constated in a workspace no git repo covers, against its checkpoint snapshot (#590) #588no release The root cannot deliver a file its delegate produced: send_image refuses it, and every run delegates a second job just to copy it PR #589no releaseCI green A file a delegate wrote in this run is its root's to deliver and to declare, without copying it #586no release checkpoint-wiring test bets that a real git runs past 1 ms: a fast runner wins and the refusal test goes red PR #587no releaseCI green checkpoint-wiring: the refusal tests make git hang so the real bound fires, instead of betting a real git runs past 1 ms #581no release The shell checklist files a model download as a software install: allowing an agent to fetch a model means letting it install software PR #582no releaseCI green Shell checklist: a command is filed by what it does, fetching files is a download, not a software install #583no release The first-token clock cuts live calls: a hosted model that reasons silently for more than 120 s fails the turn PR #585no releaseCI green A hosted model waits the hidden-thinking floor for its first token, at any effort: live calls are no longer cut at 120 s #564no release The 50-calls-per-turn guard runs the first 50 calls of a degenerate turn instead of refusing it PR #568no releaseCI green A turn with more tool calls than the per-turn budget is refused whole: none of its calls runs #561no release A return_result emitted in the same turn as a delegation has no tool result: the parent dies on unmatched_tool_use when it resumes PR #577no releaseCI green Every tool_use of a turn leaves with its tool_result, whatever the exit: a return_result next to a delegation no longer kills the parent at resume #560no release The unavailable-tool budget counts calls, not turns: one batch of 4 kills the job before the model sees one error PR #573no releaseCI green The unavailable-tool budget counts turns, not calls: every unavailable call of a turn gets its error before the job can fail #565no release The job heartbeat has gaps: a chain of tools under 60 s each lets the reaper fail a live job as runner_restarted PR #569no releaseCI green A job held by a live runner beats from its claim until it lets go: no reaper fails it mid-run PR #557no releaseCI green release:check: a failed test line keeps the cause printed under it (#512) #554no release A model response cut at its output-token cap has its tool calls executed as if complete product PR #555no releaseCI green LLM client: a turn cut on the output-token cap is refused, none of its tool calls run (#554) PR #553no releaseCI green Tests: web tests read their sources from their own file, never from the launch directory #4430.9.4 Long runs 4: a processing job survives a runner restart and resumes at its last turn product PR #547no releaseCI green Long runs 4: a job survives a runner restart and resumes at its last saved turn, only when nothing but reads ran since (#443) PR #552no releaseCI green Shell checklist: comfy's download-status, downloads and download-cancel are not installs PR #550no releaseCI green Copy: every Copy button works over http on a LAN IP, through one copyText PR #549no releaseCI green Tests: the #510 refused-call test builds its constat path the way the product does, so it passes under a Windows short-name TEMP PR #546no releaseCI green Job folder: a working folder attached to a request travels down the whole delegation tree of that run (#507, engine) #4730.9.4 The root agent says an agent does not exist when it is only outside its team; delegation and the task board reach different agents PR #545no releaseCI green Reach: assign_* and create_task hand work to the same agents, within the delegation depth left; the rest of the workspace is named (#473) #4550.9.4 Questions about Nodal itself belong to the root agent: never delegated PR #544no releaseCI green Platform questions: a question about Nodal is answered by the agent it was asked of, on every surface and runtime; a delegation never widens a teammate's folders (#455) #5100.9.4 After a failed delegation the orchestrator hands the work to an agent that cannot do it PR #543no releaseCI green Failed delegation: one targeted retry of the same agent, another agent only when its roster shows the means (#510) #4520.9.4 nodal_docs cannot answer "what changed in version X": the changelog is excluded from the index PR #542no releaseCI green nodal_docs: the release notes are in the index, served only to a question about Nodal's versions (#452) #4530.9.4 Chat launches a second identical job when the person clarifies while the first is running PR #541no releaseCI green Chat: while this conversation's work is still running, run_task is refused and the model is shown that work (#453) #4540.9.4 An agent does not know which Nodal version it runs: "changelog of 0.9.2" got "which software?" PR #539no releaseCI red Runtime block: every agent is told which Nodal-Agents version it runs, on every runtime and on the ROOT prompt screen (#454) PR #537no releaseCI green Tests: document.test.ts runs one 33 MB proof per case, each with its own timeout #5060.9.4 The orchestrator does not know what its agents can actually do (folders, running commands), so it routes and guesses wrong #4910.9.4 A delegated run stopped after writing its file reports a bare failure, and the parent redoes the work #5050.9.4 Re-generating a file the same run just wrote asks the owner; without a purpose nothing is submitted and the agent gives up #4920.9.4 A rejected tool call is resubmitted identically by the agent, with only its purpose reworded #4630.9.4 xlsx_find_cells shows formula text where the workbook holds the computed value #5170.9.4 CI: check that every job's timeout covers the sum of its steps' timeouts, and that no long step is unbounded testdebt #5220.9.4 Tables: Table gives no cell vocabulary, so every table hand-builds its cells and they differ (Logs first); move all 12 onto shared cells and check it by machine debtproduct #5090.9.4 A run ends completed with a green proof while the file it claims to deliver does not exist #4800.9.4 Settings, MCP server: the card says jobs go to the root agent (any agent can be targeted) and does not name the 20-job cap bug #4980.9.4 MCP server: a lifetime cap of 20 jobs per process blocks normal sessions; cap the jobs in flight instead #5040.9.4 The 'no deliverable yet' reminder orders the agent to stop, and fires on production work, so long builds end 'blocked' #514no release CI e2e-smoke: the dev stack sometimes hangs at 'Starting embedded Postgres' and the job fails with no log (3 times in 40 runs, main red after #513) test #4570.9.3 Chat: leaving the page mid-answer hides the answer until it is finished #4720.9.3 Work sidebar: opening a run from the MCP folder switches the sidebar to Scheduled #4710.9.3 Tests: the *.pg.test.ts files fail when the full suite runs in parallel, and pass alone #4470.9.3 One budget per agent, in the agent's Settings, provider-agnostic (API providers and coding CLIs alike) product #4390.9.3 Every LLM call gets the same 300 s wall-clock budget: a long writing turn is cut off, replayed identically, and the job fails bug #4420.9.3 Long runs 3: an idle timeout per model and per agent, and a run budget per workspace product #4900.9.4 Delivered card: preview, play and download a delivered image, video or audio file product #4870.9.3 Generate audio files from text: a generate_speech tool through OpenRouter (Gemini 3.8 Flash TTS and Flash Lite TTS) product #4700.9.3 Approval card: "Never for this agent" refuses and, once confirmed, sets that kind of action to Never #4690.9.3 Chat: a pending approval is answered in the conversation, not on the Approvals page #4680.9.3 Autonomy: run_command gets the same three choices as every other tool, instead of a Yolo toggle #4780.9.4 An LLM error that is not an Error object is recorded as "[object Object]", never retried, and the job fails as unknown_error bug #4380.9.3 Shell commands guide sends the owner to an "Autonomy" tab that is labelled "Approvals" bug #4640.9.3 Autonomy: what an agent may NOT do with a shell, as a checklist anyone can read; the shell respects its folders #4610.9.3 Agent folders: choosing a folder in Browse… adds it; no second Add click #4580.9.3 Chat replies stream with no clocks and leave no llm_calls row: the long-runs work does not reach the chat #4560.9.3 Chat: Send becomes Stop while the agent answers, and Stop ends the answer #4500.9.3 Long runs 1b: a cancel stops a streamed call in flight, and nothing it asked for runs #4410.9.3 Long runs 2: resume an interrupted turn from its partial, never replay it identically product #4400.9.3 Long runs 1: stream every turn, time out on silence, keep the partial product

+ 31 older

Abandoned

1

last 7 days, newest first

02The product

What the product can do

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.

Failed proofs

0

out of 24 named capabilities

A test that proved them failed. This is the only card that talks about a fault.

No engine proof

0

the façade may be checked, the engine is not

No screen proof

1

nothing says a user can get there through the interface

No proof at all

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.

Getting in 2

CapabilityScreenEngine
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 more
dashboard 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 more
gapsBetween @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 more
NetworkForm — /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 more
createLocalAuthProvider @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)

Building a team 4

CapabilityScreenEngine
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 more
les 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 more
la 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 more
buildSystemPrompt @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 more
attachAgentToOrchestrator @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 more
ThreadComposer — 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 more
createLlmClient @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

Talking and following 4

CapabilityScreenEngine
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 more
Stop 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 more
migration 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 more
Run 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 more
migration 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 more
le 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 more
migration 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 more
le 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 more
addTelegramBotCommands @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

Granting capabilities 5

CapabilityScreenEngine
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 more
Agent 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 more
migration 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 more
learned-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 more
POST /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 more
Connector 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 more
selectMemoriesForInjection — 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

Staying in control 5

CapabilityScreenEngine
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 more
Approvals 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 more
executeTool — 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 more
la 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 more
expireStaleApprovals (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 more
un 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 more
statusAgainstFrozenIndex 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 more
Proof 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 more
le 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

Automating 2

CapabilityScreenEngine
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 more
le « + » 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 more
runScheduleTick @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 more
la 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

Steering 2

CapabilityScreenEngine
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 more
StatusBar — 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 more
readAgentBudgetState @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 more
la 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 more
the 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.

06The code

Tests, overview

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.

Real line coverage

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.

Test cases

10,054

in 846 files, end-to-end aside

Journeys played by the CI

46 / 46

298 cases written · every one of them played

Bench sections

5

run by the CI

Coverage by package

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.

PackageCasesLinesLine coverageBranches
@nodal-agents/web 2,818 10,068/13,440 66.6%
@nodal-agents/runner 1,810 6,948/8,057 75.4%
@nodal-agents/tools 1,318 4,150/4,738 73.4%
nodal-agents 289 783/1,366 55.0%
@nodal-agents/db 309 462/727 53.2%
@nodal-agents/llm 402 1,137/1,359 76.6%
@nodal-agents/delivery 178 682/823 72.1%
@nodal-agents/test-kit 68 326/467 67.4%
@nodal-agents/shared 373 1,001/1,135 73.9%
@nodal-agents/adapter-notion 110 364/476 46.5%
@nodal-agents/qa 513 816/903 84.0%
@nodal-agents/adapter-google-calendar 12 23/105 0.0%
@nodal-agents/adapter-airtable 47 77/150 37.3%
@nodal-agents/adapter-cloudflare 9 19/88 4.2%
@nodal-agents/orchestration 366 933/990 81.1%
@nodal-agents/adapter-google-drive 106 199/236 61.1%
@nodal-agents/adapter-gmail 171 415/448 58.7%
@nodal-agents/checkpoints 69 257/283 78.6%
@nodal-agents/adapter-google-sheets 153 307/332 65.6%
@nodal-agents/auth 92 126/148 82.0%
@nodal-agents/adapter-tavily 42 47/66 58.1%
@nodal-agents/adapter-outlook-mail 127 238/256 71.4%
@nodal-agents/adapter-mcp 64 154/170 82.6%
@nodal-agents/adapter-google-docs 152 220/235 68.7%
@nodal-agents/adapter-poyo 22 64/78 71.7%
@nodal-agents/adapter-firecrawl 54 69/79 81.0%
@nodal-agents/mcp-server 26 62/72 92.6%
@nodal-agents/memory 146 287/296 84.0%
@nodal-agents/secrets 22 49/56 77.1%
@nodal-agents/docs 61 432/438 84.9%
@nodal-agents/catalog 37 71/73 87.5%
@nodal-agents/adapter-apify 70 88/89 85.1%
@nodal-agents/bench 7 18/18 92.8%
@nodal-agents/runner-adapters 11 23/23 100.0%
03What is wrong

Gaps

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.

  1. 01

    1 open card(s) written by an agent carry no verified facts

    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

  2. 02

    38 flaky test(s)

    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

  3. 03

    The CI grew 195% over the window

    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.

04Journeys

Journeys

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.

every pull request 6

These BLOCK a regression before the merge.

JourneyCasesLast resultDuration
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

every night 40

These OBSERVE it the next day. They guard no pull request.

JourneyCasesLast resultDuration
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
07Measures

Bench

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.

architecture

ref. 4da206e
Packages scanned
32 packages
Hardcoded agent slugs (invariant #1)
0 violations
Hardcoded user-facing text (invariant #2)
0 violations
DB driver imports outside packages/db
0 violations
Hardcoded per-user UUIDs (invariant #6)
0 violations
Disk writes outside the intent seam
0 violations
Terminal writes outside the primitive (V&C)
0 violations
Channel sends outside the outbox (V&C)
0 violations
Hardcoded deliverable types in the primitive (V&C)
0 violations

accepted on 10 Sept 2026, 05:25Z

catalog-drift

ref. b2d0577
OpenRouter models in the catalogue
31 models
Ids missing upstream
0 models
Families with a newer version upstream
0 families
Upstream catalogue size
400 models

accepted on 08 Aug 2026, 16:26Z

catalog

ref. 4da206e
Providers in the catalogue
9 providers
Models in the catalogue
55 models
Models declaring tools
55 models
Reasoning models
32 models
Without a context window
0 models
Without pricing
2 models
Duplicate ids within a provider
0 duplicates
Context left on the default value
2 models

accepted on 10 Sept 2026, 05:25Z

gate

ref. 4da206e
Decisions measured
20 decisions
Pauses for approval
12 decisions
Goes through without asking
8 decisions
Refused outright
0 decisions

accepted on 10 Sept 2026, 05:25Z

trust-boundary

ref. 4da206e
Third-party families framed
20 /20
Product tools wrongly framed
0 tools
Payloads lost by the envelope
0 payloads
Payloads emitted unframed
0 payloads
Forged delimiters not neutralised
0 escapes

accepted on 10 Sept 2026, 05:25Z

08What runs it

What triggers what

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.

Price of a pull request 11 green run(s) out of the last 30

8.1 minmedian
24.9 minlast
24.9 minworst
↗ +195 %trend

Duration of green runs ↗ +15.6 min since 07 Sept

28.1 min 0.3 min 24.9 min 07 Sept 08 Sept

CI Windows

.github/workflows/ci-windows.yml

Triggers push schedule manual

Jobs push schedule workflow_dispatch ci-windows

Bench not run  Coverage not measured

CI

.github/workflows/ci.yml

Triggers push pull_request

Jobs push pull_request checks test build pack-smoke e2e-smoke

Bench run  Coverage not measured

Journeys played smoke.spec.ts autonomy-approvals.spec.ts delegation-outcome.spec.ts memory-kept.spec.ts activity-runs.spec.ts edrow-narrow.spec.ts

Deploy Docs to GitHub Pages

.github/workflows/docs.yml

Triggers push schedule manual

Jobs push workflow_run issues pull_request_target schedule workflow_dispatch build deploy

Bench not run  Coverage not measured

Quality — full measurement

.github/workflows/qa.yml

Triggers schedule manual

Jobs schedule workflow_dispatch mesure

Bench run  Coverage measured

Journeys played activity-runs.spec.ts agent-budget.spec.ts agent-folder-pick-adds.spec.ts agent-recipes.spec.ts agent-tool-assignment.spec.ts agents-redesign.spec.ts airtable-oauth.spec.ts apify-apikey.spec.ts automations-notify-runnow.spec.ts autonomy-approvals.spec.ts brique31-flows.spec.ts chat-approvals.spec.ts chat-composer-anchored.spec.ts chat-live-reattach.spec.ts chat-stop.spec.ts code-verification.spec.ts command-allowlist.spec.ts command-execution-yolo.spec.ts connector-multi-instance.spec.ts connector-scope-disclosure.spec.ts credentials-reuse.spec.ts delegation-outcome.spec.ts edrow-narrow.spec.ts help-guides.spec.ts internal-tool-toggles.spec.ts learned-skills.spec.ts mcp-connectors.spec.ts memory-kept.spec.ts notify-channel.spec.ts notion-internal.spec.ts notion-oauth.spec.ts oauth-flow.spec.ts run-budget.spec.ts schedule-daily-budget.spec.ts settings-network.spec.ts settings-verification-surfaces.spec.ts shell-checklist.spec.ts smoke.spec.ts telegram-allowlist.spec.ts thread-autoscroll.spec.ts thread-unfold-keeps-scroll.spec.ts thread-unfold-small-block.spec.ts tools-tab.spec.ts user-menu.spec.ts webhooks-flows.spec.ts work-mcp-run-stays-in-work.spec.ts

05Over time

Test memory

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.

Flaky tests

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.

Broken tests

23

red at every known run

Tracked tests

11,508

10,850 played at the last measurement

Repaired in (median)

2.68 d

over 11 repair(s) observed end to end

The most harmful 20

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.

TestLast runsFailuresRateRed 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 % ·

Broken

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.

TestLast runsFailuresRateRed sinceAge
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
09The record

History

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.

What moves

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.

Line coverage ↘ -0.4 % since 11 Sept

83.0 % 78.9 % 80.9 % 11 Sept 29 Sept

Capabilities verified at both levels ↗ +12 since 13 Sept

24 8 22 13 Sept 29 Sept

Broken tests ↘ -5 since 11 Sept

32 21 23 11 Sept 29 Sept

Every collection

WhenTriggerCommitCasesJourneys in CICoverage
29 Sept 2026, 10:21Zschedule 13f5a06610,054 46/46 80.9%
29 Sept 2026, 01:09Zworkflow_dispatch 4510428d10,049 46/46 80.9%
28 Sept 2026, 22:59Zworkflow_dispatch d3c94c2e9,967 46/46 80.9%
28 Sept 2026, 10:16Zschedule 7ab00c0b9,869 46/46 80.7%
27 Sept 2026, 09:50Zschedule 2283f8069,630 46/46 80.4%
26 Sept 2026, 09:09Zschedule a61aded89,611 46/46 80.4%
25 Sept 2026, 09:22Zschedule 68d2072e9,601 44/44 80.1%
24 Sept 2026, 08:56Zschedule 3ba0e4069,416 38/38 79.9%
23 Sept 2026, 09:02Zschedule 4d238e629,345 36/36 79.7%
22 Sept 2026, 11:37Zworkflow_dispatch 13a9e1189,306 36/36 79.6%
22 Sept 2026, 09:01Zschedule 53653e5a9,304 36/36 79.4%
21 Sept 2026, 09:23Zschedule 1af7d7ca9,041 36/36 81.7%
20 Sept 2026, 08:57Zschedule 74fc97ed8,758 35/35 82.0%
19 Sept 2026, 08:26Zschedule 01354ea48,173 35/35 82.6%
19 Sept 2026, 03:03Zworkflow_dispatch 520505988,118 35/35 82.5%
18 Sept 2026, 20:38Zworkflow_dispatch dee372ea8,118 35/35 82.5%
18 Sept 2026, 16:36Zworkflow_dispatch e8d7f3347,950 35/35 82.2%
18 Sept 2026, 08:37Zschedule f0389dcc7,636 33/33 82.0%
17 Sept 2026, 09:00Zschedule e01dcb377,378 33/33 81.8%
16 Sept 2026, 17:31Zworkflow_dispatch d85800a47,348 32/32 81.8%
16 Sept 2026, 17:09Zworkflow_dispatch c139d0337,337 31/31 81.7%
16 Sept 2026, 10:41Zworkflow_dispatch d0267a7a7,280 31/31 81.7%
16 Sept 2026, 08:48Zschedule 0bb8239b7,280 31/31 81.7%
16 Sept 2026, 08:14Zworkflow_dispatch 953c91bb7,280 31/31 81.7%
15 Sept 2026, 16:50Zworkflow_dispatch 76761ae96,999 30/31 81.8%
15 Sept 2026, 09:01Zschedule 133291666,982 29/30 81.8%
14 Sept 2026, 09:10Zschedule 3e067fb16,881 29/30 81.6%
13 Sept 2026, 17:21Zworkflow_dispatch 7a2fa74f6,866 29/30 81.5%
13 Sept 2026, 08:45Zschedule f239fa286,772 29/30 80.5%
12 Sept 2026, 08:22Zschedule 58bcd0aa6,721 29/30 81.3%
12 Sept 2026, 07:10Zworkflow_dispatch 175685cc6,721 29/30 81.3%
11 Sept 2026, 16:44Zworkflow_dispatch c37885be6,721 29/30 81.3%
10 Sept 2026, 16:12Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:12Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:10Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:09Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:09Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:09Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:09Zlocal 82fb057e6,704 29/30 81.6%
10 Sept 2026, 16:07Zlocal 82fb057e6,700 29/30 81.6%