01Every test

What is tested

Every test the nightly measurement has run, sorted by the part of the product it exercises: the root and the chat, delegation, runs, tools, skills, proof, channels, connectors and the rest. Open a part to see its files and each test with its last five runs. The page starts with what each page of this portal answers, and with what no test covers.

What each page answers

What is tested
this page: every test, by the part of the product it exercises, with its last five runs.
Work in flight
the work board: every issue and pull request, and what each one waits on.
Capabilities
for each thing a user can do, whether a screen test and an engine test prove it, and whether they passed.
Gaps
what the portal finds wrong with itself and with the tests, most serious first.
Journeys
the browser journeys (Playwright) and which of them the CI actually plays.
Code coverage
which lines of code at least one test goes through, package by package.
Bench
measures (speed, size, cost), not verdicts.
Triggers
what starts each GitHub workflow, and what it runs.
History
one line per measurement, and the curves over thirty days.

What the tests do NOT cover

No test sends a real request to a real model. The browser journeys talk to no model at all, and the engine tests answer with fake models written inside the test. A green page therefore says that the platform does the right thing with the answers it is given. It does not say that a real agent, on a real model, finishes a real task, and that is where most of what broke in the last days lives.

Real requests on a real model: not measured yet. A bench that replays real requests end to end is being built. When it runs, its results will appear here, next to the tests, and not inside their counts.

How to read a ribbon

Each square is one run, the last 5 only, oldest on the left: green passed, red failed, amber passed on a retry, grey skipped. The numbers next to it (failed / runs) count every run the memory has seen.

The tests the memory knows, how many ran at the last measurement, and how many are red or flaky on their last five runs.

Tests tracked

16,950

15,726 run at the last measurement, 13 Nov 2026, 11:39Z

1,224 were not run that time: renamed or removed since, or skipped by that run. 202 of them sit in files that are no longer in the repository. They stay listed, marked, until the memory drops them.

Red at their last run

24

the last of their 5 runs failed

Flaky

10

a failure or a retry within their last 5 runs, the last one passed

Repaired in (median)

2.68 d

over 13 repair(s) observed end to end

By part of the product 22 parts

One part of the product per heading, sorted in the order the product is told: talking to the root first, the plumbing last. A part is drawn only when you open it.

The rule placed 16,392 of the 16,950 tests. 558 it could not place are in Unclassified, last in the list, with the reason for each file. Each file says why it sits where it does.

Root & chat 1,063 tests 4 flaky 3 skipped in their last 5 runs 601 on screens (19 in browser journeys) · 462 in the engine · last run 13 Nov 2026, 11:39Z · 93 not run at the last measurement Talking to the root agent: a turn, the thread, the conversation list, the system prompt.
Delegation & team 341 tests all green on their last 5 runs 21 on screens (2 in browser journeys) · 320 in the engine · last run 13 Nov 2026, 11:39Z · 37 not run at the last measurement The root handing work to its team, the planner, the router and the limits on how deep delegation goes.
Runs (the job engine) 1,098 tests 1 flaky 3 skipped in their last 5 runs 252 on screens (6 in browser journeys) · 846 in the engine · last run 13 Nov 2026, 11:39Z · 84 not run at the last measurement A run from start to finish: claiming it, resuming it, stopping it, its budget, and the anti-loop guards.
Tools 961 tests 3 red 11 skipped in their last 5 runs 117 on screens (27 in browser journeys) · 844 in the engine · last run 13 Nov 2026, 11:39Z · 73 not run at the last measurement The built-in tools an agent calls (files, Office documents, links, search) and the whitelist that decides which ones it gets.
Skills 791 tests 4 red 3 skipped in their last 5 runs 446 on screens (18 in browser journeys) · 345 in the engine · last run 13 Nov 2026, 11:39Z · 36 not run at the last measurement Installing, updating and assigning skills and agent recipes, and the community catalog.
Proof & delivery 660 tests 2 red 1 flaky 8 skipped in their last 5 runs 232 on screens (29 in browser journeys) · 428 in the engine · last run 13 Nov 2026, 11:39Z · 51 not run at the last measurement What an agent declares it delivered, what the platform checks against the disk, the reviewer, and what the user is shown as done.
Approvals & shell safety 1,872 tests 37 skipped in their last 5 runs 377 on screens (27 in browser journeys) · 1,495 in the engine · last run 13 Nov 2026, 11:39Z · 144 not run at the last measurement What an agent may do without asking, what waits for a yes, and the guards on shell commands.
Memory 361 tests all green on their last 5 runs 83 on screens (2 in browser journeys) · 278 in the engine · last run 13 Nov 2026, 11:39Z · 14 not run at the last measurement What an agent writes down and reads back later, the curator that tidies it, and reflection after a run.
Channels 697 tests 1 flaky 2 skipped in their last 5 runs 31 on screens (12 in browser journeys) · 666 in the engine · last run 13 Nov 2026, 11:39Z · 16 not run at the last measurement Telegram, Discord, Slack, WhatsApp, devices and email: receiving a message, answering, sending a file.
Connectors & MCP 1,745 tests 4 red 2 flaky 3 skipped in their last 5 runs 327 on screens (21 in browser journeys) · 1,418 in the engine · last run 13 Nov 2026, 11:39Z · 180 not run at the last measurement Notion, Google, Microsoft, Airtable and the other services an agent reaches, their OAuth and keys, and MCP servers in both directions.
LLM providers & transport 1,303 tests 3 skipped in their last 5 runs 83 on screens · 1,220 in the engine · last run 13 Nov 2026, 11:39Z · 103 not run at the last measurement Talking to Anthropic, OpenRouter, Gemini and the others: requests, retries, timeouts, costs, model choice.
Claude Code & Codex runtimes 383 tests all green on their last 5 runs 10 on screens · 373 in the engine · last run 13 Nov 2026, 11:39Z · 27 not run at the last measurement Agents that run on a subscription CLI (Claude Code, Codex) instead of an API key.
Schedules & automations 224 tests 2 red 69 on screens (9 in browser journeys) · 155 in the engine · last run 13 Nov 2026, 11:39Z · 40 not run at the last measurement Routines on a schedule, webhooks, and the ticker that starts them.
Projects, folders & git 1,159 tests 14 skipped in their last 5 runs 556 on screens (1 in browser journeys) · 603 in the engine · last run 13 Nov 2026, 11:39Z · 90 not run at the last measurement The folders an agent works in, projects, git, the files it changed and the checkpoints that restore them.
Accounts, secrets & security 307 tests all green on their last 5 runs 117 on screens · 190 in the engine · last run 13 Nov 2026, 11:39Z · 9 not run at the last measurement Sign-in, the owner account, secrets at rest, redaction of what must not be shown, and the checks on where a request comes from.
Screens & design system 373 tests 5 red 7 skipped in their last 5 runs 373 on screens (22 in browser journeys) · last run 13 Nov 2026, 11:39Z · 65 not run at the last measurement The web app as such: layout, sidebar, shared components, contrast, the parity with the Figma design system.
Install, start & update 503 tests 18 skipped in their last 5 runs 22 on screens · 481 in the engine · last run 13 Nov 2026, 11:39Z · 1 not run at the last measurement The nodal-agents command: first install, starting and stopping the stack, embedded Postgres, updates.
Database & migrations 609 tests all green on their last 5 runs 609 in the engine · last run 13 Nov 2026, 11:39Z · 13 not run at the last measurement The schema, its migrations, and the queries every other part relies on.
Docs site 127 tests all green on their last 5 runs 127 in the engine · last run 13 Nov 2026, 11:39Z · 15 not run at the last measurement The public documentation site and the pages it generates from the code.
Quality portal & bench 1,579 tests 4 skipped in their last 5 runs 1,579 in the engine · last run 13 Nov 2026, 11:39Z · 109 not run at the last measurement This portal, the bench and the test kit: the tools that tell us what the tests say.
Architecture rules 236 tests all green on their last 5 runs 53 on screens · 183 in the engine · last run 13 Nov 2026, 11:39Z The invariants of CLAUDE.md checked by scanners, in every package: no hardcoded agent text, layering, lint rules.
Unclassified 558 tests 4 red 1 flaky 30 skipped in their last 5 runs 175 on screens (39 in browser journeys) · 383 in the engine · last run 13 Nov 2026, 11:39Z · 24 not run at the last measurement Tests whose file name, folders and imports name no part of the product. The rule cannot place them, so they are listed here rather than hidden.

Red or flaky now 34

Every test whose last run failed, then every test that failed or needed a retry within its last five runs, across all parts. "Red since" only dates a flip that was seen; past 14 days the Age turns red.

TestLast 5 runsFailed / runsStateRed sinceAge
Tools · 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 red · flip never seen
Tools · 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 red · flip never seen
Tools · apps/web/tests/e2e/tools-tab.spec.ts
Step 2 — Tools tab lists both native tool groups
5/5 red · flip never seen
Skills · 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 red · flip never seen
Skills · 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 red · flip never seen
Skills · 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 red · flip never seen
Proof & delivery · apps/web/tests/e2e/code-verification.spec.ts
Proof commands — onglet Code A — configurer puis approuver, hash écrit EN BASE
1/1 red · flip never seen
Connectors & MCP · 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 red · flip never seen
Connectors & MCP · apps/web/tests/e2e/notion-oauth.spec.ts
Notion OAuth flow (wizard-driven) connect via wizard → callback → connected status (no Refresh button)
1/1 red · flip never seen
Connectors & MCP · 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 red · flip never seen
Connectors & MCP · apps/web/tests/e2e/oauth-flow.spec.ts
Google Drive OAuth flow (wizard-driven) connect via wizard → callback → connected status and toast
1/1 red · flip never seen
Schedules & automations · 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 red · flip never seen
Schedules & automations · apps/web/tests/e2e/webhooks-flows.spec.ts
Webhooks section — full click flow create, copy URL, toggle, rotate, delete, empty state
1/1 red · flip never seen
Screens & design system · 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 red · flip never seen
Screens & design system · 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 red · flip never seen
Screens & design system · 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 red · flip never seen
Screens & design system · 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 red · flip never seen
Screens & design system · 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 red · flip never seen
Unclassified · apps/web/tests/e2e/agent-flows.spec.ts
Scenario A — Proactive save_memory concierge saves memory proactively when user says "retiens-le"
1/1 red · flip never seen
Unclassified · 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 red · flip never seen
Unclassified · apps/web/tests/e2e/agents-redesign.spec.ts
Agents page redesign render, dark mode, add-worker modal, keyboard drag round-trip
1/1 red · flip never seen
Unclassified · 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 red · flip never seen
Proof & delivery · 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 red 21 Sept 2026, 09:23Z 53 d
Skills · apps/web/tests/e2e/agent-recipes.spec.ts
agent recipes @cap:configurer-agent/ecran a profile shows what it sets, then creates ONE ordinary agent with skills and read-only rules see the run
15/71 red 31 Oct 2026, 10:24Z 13 d
Root & chat · apps/web/tests/e2e/thread-autoscroll.spec.ts
A — un fil long s’ouvre sur son dernier message @cap:suivre-execution/ecran see the run
7/71 flaky · ·
Root & chat · apps/web/tests/e2e/thread-autoscroll.spec.ts
B — remonter dans l’historique tient : on n’est pas ramené en bas @cap:reprendre-conversation/ecran see the run
7/71 flaky · ·
Root & chat · apps/web/tests/e2e/thread-autoscroll.spec.ts
C — remonter APRÈS un fil déjà en bas : le geste du lecteur n’est pas avalé see the run
7/76 flaky · ·
Root & chat · apps/web/tests/e2e/thread-autoscroll.spec.ts
D — remonter PENDANT qu’un défilement automatique est en vol see the run
7/76 flaky · ·
Connectors & MCP · 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
3/71 flaky · ·
Runs (the job engine) · apps/web/tests/e2e/agent-budget.spec.ts
Agent budget @cap:voir-le-cout/ecran shows what the agent spent, sets a ceiling, warns, then says the pause
0/50 flaky · ·
Proof & delivery · apps/web/tests/e2e/code-verification.spec.ts
Proof commands — la page du projet @cap:verifier-un-livrable/ecran A — configurer puis approuver, hash écrit EN BASE
0/56 flaky · ·
Channels · apps/web/tests/e2e/automations-notify-runnow.spec.ts
Scenario A — Garde-fou: Telegram notify warning for bot-less agent shows warning when notify checked + bot-less agent; hides on uncheck
0/76 flaky · ·
Connectors & MCP · apps/web/tests/e2e/notion-oauth.spec.ts
Notion OAuth flow (wizard-driven) @cap:connecter-un-service/ecran connect via wizard → callback → connected status (no Refresh button)
0/71 flaky · ·
Unclassified · apps/web/tests/e2e/smoke.spec.ts
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
0/71 flaky · ·
02The 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.9latest on npm, published 02 Nov
0.9.9version in the repo
·commits on main since no tag

1 open card asks to publish a version already on npm: #929 Release 0.9.9 notes quote the file_move approval card as 'moved A to B'; it reads 'move A → B'

Docs and portal deployed 13 Nov 2026, 18:03Z (schedule, main as it was then). Since then: 1 in progress (the run rendering this page is one of them). Read at 13 Nov 2026, 23:51Z.

2 decisions waiting on you: they block the rest until they are settled. And 7 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 13 Nov 2026, 23:51Z

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

2

In progress

238
#1074no release Bench print-wait measurement: three minor findings from the review of #1073 debt #1072no release MCP Tasks: follow a server's long-running action after the task has answered, and announce its outcome product #1070no release Voice settings: the ear is judged on one word said by the voice, and a mishearing is shown as "Not answering" product #1069no release Voice settings: remember each source's choice, so switching between a hosted and a local voice is one gesture product #1066no release Voice local server: minor findings from the review of #1051 debt #1065no release PR #1064 minor review findings: an unguarded onPhase callback, the measurement harness missing from the usages list debt #1062no release Windows: agent commands that run PowerShell 5.1 pay a full module discovery, the scrubbed env has no PSModulePath nor its cache debt #1061no release PR #1060 minor review findings: the PowerShell spawn guard's reach, a precondition that fails instead of skipping, a residual flake margin debt #1059no release turbo-test-env guard reads only passThroughEnv, not tasks.test.env (P3 from #1058) debt #1055no release down: members swept without identity check when the re-read does not answer (pre-existing); count-based assertions (P3 from #1052) debtsecurity #1054no release test-kit waitForFile: an explain that throws or hangs hides the wait's own message; one tight bound (P3 from #1053) debt #1047no release Minor findings of the review of #1045 (CI Windows shards guard) debt #1043no release Minor findings of the review of #1041 (--persona-file on the spoken-reasoning measure) debt #1042no release run-command-flow test: waitFor ends silently after 20 s, so a slow or failed server start surfaces as ENOENT on CI Windows debt #1040no release Bounded test I/O (#1036): minor follow-ups from review debt #1039no release CI Windows: run-skill-script real .py test timed out at 60 s, then EBUSY on rmdir debt #1038no release Git constat: per-file fingerprinting has no time bound (21.5 s for 1,000 files on CI Windows) debt #1037no release Stream end path (#1035): minor follow-ups from review debt #1032no release Minor findings from the review of #1000 (routing-narration measurement and chat-surface tripwire) debt #1031no release Tests: pin the stream invariants the #1030 voice timing fixture rests on debt #1028no release Tests: three minor gaps left by the #1026 timing fix (read floor, gh witness, PATH keys) debt #1027no release PR #1024 review: minor findings (P3) in the device channel test teardown #1022no release Record an instance administrator so a multi-user install can pair devices (and use the other host-wide settings) enhancement #1021no release PR #1005 review, pass 3: minor findings (P3) on the origin walk and state ordering #1020no release PR #1015 review: minor findings (P3) on pairing limits, removal and local trust #1018no release Devices: answer a card by voice, resolved by Nodal (no spoken-answer path today) enhancement #1017no release PR #1005 review, pass 2: minor findings (P3) on re-reading after resync #1016no release Devices: Settings → Devices shows the 20-line example from connectSnippet() enhancement #1014no release PR #1013 review: minor findings (P3) in the device client #1011no release Devices: a single-file Python example, run in CI like the TypeScript reference client enhancement #1010no release Devices: compressed speech upload for remote devices enhancement #1009no release Devices: the drop gesture (a file from a device), through the channels' inbound-files intake enhancement #1008no release Devices: let the owner name the hostnames Nodal answers to (Tailscale and tunnels refused today) bug #1007no release PR #1005 review: minor finding (P3), the migration test does not try the notify CHECKs #10060.9.10 PR #1001 review: minor findings (P3), the sandbox screen over time and the write path #1004no release A task acknowledgement follows the language of the memories, not of the message (20-50% on Haiku 5.5) #1003no release PR #1002 review: minor findings (P3) on the thread-autoscroll spec #999no release PR #992 review: minor findings (P3), stale headers, the listener gate, the description #998no release PR #989 review: minor findings (P3), migration order and query_memory's valid_to #996no release PR #993 review: minor findings (P3) on the CI shard guard #994no release PR #990 review: minor finding (P3), measurement word and sentence counts #991no release CLI runtime: a job's prompt does not say what started it (schedule, webhook, MCP) #988no release PR #984 review: minor findings (P3) #985no release Elicitation wait test (#980): minor review findings #983no release Voice: tell real silence from a transcription model that wrote nothing #982no release Dead-worker report (#971): minor review findings #981no release Spoken reasoning (#978): minor review findings #975no release Voice setting (#972): minor review findings #974no release Mask secrets in the runner for typed chat too (one mechanism with the voice turn) #973no release Voice stream (#968): minor review findings #966no release Push-to-talk microphone (#964): minor review findings #965no release Autonomy rows (#921): minor review findings #962no release Voice turn: two minor findings from the #958 review (untested branches, unbounded base64 output) debt #959no release Push stream: two minor findings from the #956 review (buffer bound, untested forms) debt #957no release Speech package: four minor findings from the #954 review debt #955no release Move the rest of the dashboard onto the push stream, and cancel through the runner (follow-up of #944) #953no release Later: Home Assistant voice satellites as Nodal modules (Wyoming adapter) enhancement #952no release Devices: nodal-agents device check tests a module against the protocol enhancement #951no release Devices: a test device in the dashboard with a live message log enhancement #949no release Devices: Nodal announces itself on the local network (mDNS) enhancement #948no release Voice mode: talk to Nodal from the chat, then from any external module (tracking) enhancement #947no release Public device protocol, reference client and network-access docs enhancement #937no release telegram_send_message takes 16-24 s to send a short text; the API answers in under 1.3 s bug #9360.9.10 file_move: the first move of a turn takes ~2.6 s, the next ones ~22 ms #9340.9.10 Updating or resetting a system skill drops the section the owner filled in (File filing: Your folders) #9310.9.10 Community skill catalog: 6 of 43 cards point to upstream paths that no longer exist #929no release Release 0.9.9 notes quote the file_move approval card as 'moved A to B'; it reads 'move A → B' #928no release File filing skill: minor findings from the review of #925 (step 2 vs a named kind, a test narrower than its title) #927no release Shell analyzer growth test measures wall-clock time and goes red on a loaded Windows runner #926no release gen-changelog test escapes every < of the latest release, so a < in a code span turns CI red #923no release A file touched twice in one message keeps the first call's change kind with the last call's sha (Files block shows deleted files as added and present files as deleted) #922no release Removed-deliverable rescue: proof coverage, byte matching, silent unreadable candidate (#919 review pass 2 P3) #920no release A deliverable removed by a delegated child stays red on the parent (#919 review P3) #915no release Inbound files: a failed job-message write is only logged; Discord drops attachments without an image content type (P3 of #911) #914no release Inbound files: per-conversation room counts purged jobs as no one's, and consumes room per file (P3 of #911) #912no release file_read: a small encrypted PDF read whole is sent encrypted (from #905 review) #909no release hydrateForLlm sends any local path or file: URL to the model, no workspace confinement #908no release OpenRouter: pin the native engine for PDF file parts (from #905 review) #907no release Inbound files: two minor findings from #902 review #906no release process-watch test: three minor findings from #904 review #900no release Discord, Slack, WhatsApp: files sent to an agent are dropped (after #899) #898no release Unassigned skills are listed with their full description in every agent's prompt #897no release file-filing skill: two minor wording findings from #895 review #894no release Minor findings of the review of #889 (get_task) #893no release Minor findings of the review of #881 (file_move) #892no release Minor findings of the review of #888 (prompt caching by model) #891no release Minor findings of the review of #890 (job-loop re-check removed) #8850.9.10 CI runner-image guard: minor gaps from the review of #883 #8840.9.10 The delivered-files list drops the workspace label: a move between folders loses the folder names #8800.9.10 Sandbox: minor findings from the review of #877 (coded refusal, restore gate, mounted volumes, a test title) #8780.9.10 Sandbox: detected folders miss a ComfyUI installed with comfy-cli #875no release Minor findings of the review of #870 (scanners read git's view of what is source) #874no release Minor findings of the review of #866 (Bench Studio import graph guard) #8730.9.10 release:check is red on a shared Windows machine: six timing/environment-sensitive tests, and the build dirties next-env.d.ts #872no release Minor findings of the review of #859 (MXC tier read by a shared rule) #867Backlog Docs: two minor wording fixes found by the 0.9.8 release review debt #865Backlog Minor findings of the review of #863 (closed tool list per scenario) debt #862Backlog Minor findings of the review of #855 (bench printer wiring) debt #858Backlog Minor findings of the review of #856 (up --detach keeps Postgres) debt #853Backlog Minor findings of the review of #848 (MCP SDK 1.32) debt #851Backlog Minor findings of the review of #831 (down and reset on a fresh install) debt #849Backlog Minor findings of the review of #836 (bench instance, run budget over the delegation tree) debt #844Backlog Windows tree kill trusts ParentProcessId: an orphan whose dead parent's pid was reused is killed as a descendant bug #843Backlog Minor findings of the review of #834 (a job owns its processes) debt #8420.9.10 Sandbox (Windows): a confined command can still reach the print spooler (winspool) and print security #840Backlog down cannot prove a Postgres is ours on macOS (and Linux without /proc cwd): it refuses to stop it bug #830no release Conversation handles: minor gaps from the #826 review, pass 4 (code_task outside the boundary) #829no release Conversation handles: minor gaps from the #826 review, pass 3 #828no release Conversation handles: minor gaps from the #826 review, pass 2 #827no release A handle-minting failure replaces the real send error (#826 review, P3) #825no release Group prefix writes (@Someone) for a handle that sanitises to nothing #823no release Discord adapter: apiBaseUrl unvalidated and test-only; wire test gaps #822no release Two copies of discord-api-types after discord.js 14.27.0 #821no release jsdom (web devDependency) still pulls undici 7.29.0, inside the 2026-09-29 advisories #817no release Shared vitest base: guard precision, 60 s bound, and the Windows CI flakes still without a cause #816no release Chat front relay: follow-ups (replay boundary, several people in one thread, note label) #815no release Images reaching the model: follow-ups (compaction silence, cache, eviction wording, path heuristic) #814no release Approval creation order: guard precision, index assertion, equal-timestamp replay of old rows #812no release Private-names check: follow-ups (unmasked error, quoted binary paths, hook default branch, import failure code) #810no release Card words reaching the run head: follow-ups (fencing, e-mail to the model, responder identity) #807no release Bench fixtures: a tool rename in one fixture or test is not caught by CI #802no release zod 4.6 follow-ups: code-point string bounds, owner claim and internationalised addresses #796no release Bench judges credit tool calls by bare name (lookalike MCP tools earn the credit) #795no release Bench outbound alarm: print-name false reds and false greens (#777 pass 9, minor) #793no release NODALAI_HOME registry (#787 pass 2): registry folder readable by confined jobs, deny list frozen at container open, wiring untested #791no release NODALAI_HOME (#787): CLI docs contradict on occupied ports; instance identity compared lexically, not by realpath #790no release CLAUDE.md reader (#788): read TOCTOU, unescaped closing tags, temp folder leaks, one announced mutation not covered #789no release Bench reads (#777 pass 5): workflow_no_workspace untested; cheminConstate keeps the file name's case when the file is gone #786no release tool_call_reads (#783): path resolved at storage, two silent loss paths, cheminConstate mapping not pinned by a test #785no release Claude setting-sources (#782): test header overclaims, no-retry not tested, add-dir hooks not probed, .mcp.json missing from docs #784no release A file an MCP tool reads (request_print) leaves no record of which file it read #781Backlog Tool call writes: minor findings from the #780 review #778Backlog Bench catalogue v2: minor judge findings from the #777 review #775no release Bench targeting: minor findings from review (backlog) #773no release CI Windows signature test: minor findings from review (backlog) #771no release Print skill: minor findings from review (backlog) #770no release 0.9.7 hotfix: minor findings from review (backlog) #769no release Workflow bench: run trials in the bench space, never the owner's (run_task pinned to the space's root, ModelApplier wired) #7610.9.10 Bench Studio (#760): minor review findings #7590.9.10 Bench space (#758): minor review findings #7570.9.10 Workflow bench (#756): minor review findings #7540.9.10 Windows sandbox (#753): minor review findings #7520.9.10 Node version guard: launcher before the bundle, exit code assertion, stale CLI docs (#751 review) #7480.9.10 Nightly e2e: the smoke 'agent → task → job' flow and the run budget screen pass only on retry #7460.9.10 Drive/Calendar connectors: stale classification comments and a missing named assertion (#745 review) #743Backlog Prose re-check record: unnamed result shapes, short unframed lines, and the chat's "this run" (#740) #742Backlog The Approvals tab shows a connector operation's descriptor default, not what the autonomy level makes it do #739Backlog The document rules' version was not bumped when the Markdown rule was removed (#737) #734Backlog Output cap (#571): minor findings from the Nodal review, and the local parallel test-run failures bug #732Backlog Shell options reading (#730): minor findings from the Nodal review bug #729Backlog Shell reader: a literal nesting more than 32 levels in quotes is held by the catastrophic floor bug #728Backlog Shell reader: two recursions not bounded by MAX_DEPTH ($((…)) and nested here-docs) bug #727Backlog Shell gate: a command in nested escaped backticks is not read as a command bug #726Backlog Shell gate: an escaped word after start is read as cmd's window title bug #725Backlog Shell gate: a redirection after a sh command substitution is read as the group's output bug #724Backlog Shell gate: COM0/LPT0 and superscript device names are looked up as scripts bug #722Backlog PowerShell: a quoted $(…) is read as moving the folder to an unknown place (over-ask) bug #719Backlog RubyGems version selector: `bundle _2.3.0_` runs bundle install and reads as a read bug #718Backlog composer: an abbreviation is read in every word, Symfony Console reads only the command word bug #716Backlog readJobDeliverables drops a descendant's verdicts when called with an ancestor and its descendant together (P3 from #712) debt #714Backlog QA portal: Archivo 500 headings render at 600 after self-hosting the fonts (P3 from #713) debt #708Backlog OpenRouter reasoning: agent 'max' never reaches an upstream max tier; onoff entries lack an Auto-body test (P3s from #707) debt #706Backlog Follow-ups of #699: --continue guard blind to multi-line run blocks, binaries path unguarded, architecture scan misses scripts/ and e2e #705Backlog The New Chat row's test does not prove a click creates nothing #704Backlog Follow-ups of #700: stale test comment, /spaces unreachable on an empty list, untested modal guards, em dash in a label #703Backlog nodal-agents down: the 'graceful' Postgres stop calls .stop() on a fresh handle, which returns without signalling #695Backlog Script reading (#683): a '<' comparison read as a stdin file, and a size cap checked by stat but not by the read #692Backlog Desktop notification programs other than notify-send (msg, zenity, kdialog) are not in the 'Open programs, print or send' category #690Backlog The prompt-limit detector of #684 sees five spellings only, matches unrelated ≤N caps, and one bare '4096' check remains #689Backlog Two shell-gate tests from #681 cannot go red: input redirections never reach the scan, card naming proven on Windows only #6870.9.10 The shell gate does not follow a download's output to a file reached by a pipe, a process substitution, eval or a URL containing & security #685Backlog A script without extension or shebang is guessed to be shell, so its code is misread by the shell gate #676no release Minor findings from review pass 4 of #664: Slack channel reply on error, ignored redraw outcome #675no release Minor findings from review pass 3 of #670: index line from the framed text, missing cases, where files go on two surfaces #674no release Minor finding from review pass 3 of #664: truncated button labels can be identical #673no release Minor findings from review pass 5 of #660: elicitation form bounds and defaults #672no release Minor findings from review pass 2 of #670: workspace paths, shared detection, nameless-call role sequence #671no release Minor findings from review pass 5 of #665: tool-result budget edge cases #6680.9.10 An agent claims a print succeeded from an undated queue listing that does not name its job #6660.9.10 A tool's image reaches a vision model #6620.9.10 An agent says a teammate is down from its own replayed history, never from the teammate's current state #6540.9.10 A run that did not do an action the request named ends completed and never says so #648Backlog Record every web read as a normalized fact (address, HTTP status, success) for every tool and runtime #647Backlog A request that is not answered at once gets no acknowledgement: on channels and MCP the owner hears nothing until the work is done enhancementproduct #645Backlog review_verdict refuses 22% of verdicts for a 1000-character cap on findings[].issue; each refusal re-sends the whole verdict bugcost #644Backlog A read-only review fails as deliverable_not_verified: return_result gives an omitted deliverables field two meanings, and a declared directory is accepted until the proof bug #6430.9.10 CLI runtime: a failed tool call inside a Claude Code session is recorded like a success (is_error dropped) #631Backlog next-env.d.ts is tracked and rewritten by every build, so a second release:check fails on a dirty tree debt #630Backlog Run the confirming review pass on #605 (/stop from a channel), skipped after its P2 fix debt #628no release Bound agent writes with an OS sandbox #626Backlog Start with this machine: the Windows Run entry does not appear in Settings > Apps > Startup bug #619Backlog 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 #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 #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 #507Backlog A working folder attached to a request, carried down the whole delegation tree for that run #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 #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

7

To test

16
#963no release Audit-wait test: two minor findings from the #961 review test #871Backlog Test helpers: five minor findings on process-watch after #868 test #864Backlog Minor findings of the review of #857 (Windows worker deaths) test #860Backlog Minor findings of the review of #854 (Playwright install in CI) test #846Backlog Minor findings of the review of #838 (CI reds of 2026-10-22) test #839Backlog Minor findings of the review of #832 (bench fake printer) test #837Backlog Minor findings of the review of #833 (run_command npx fixture test) test #776no release Workflow bench: calibrated research subjects (decision 3 of the 2026-10-17 catalogue) test #720Backlog Pin the accepted over-ask of a command written after an option (`yarn --silent build`) test #421Backlog Memory: four promise tests, end to end (learned at N is in the prompt at N+1, pin survives the cron, budget under 500 facts, poisoned row never rendered) test #412Backlog code-verification.spec.ts: cases A and G fail in the nightly, both hidden in the flaky list test #409Backlog Memory: no test proves a workspace never sees another workspace's facts test #299no release Portal: what is red test #295Backlog The agents-redesign journey proves nothing on a fresh install, and it still carries a silent fallback testdebt #271Backlog Coverage: the CLI at 66 %, db at 66 %, and two adapters near 21 % with almost no branches test #208no release A project page's run row may still unfold upward: check by eye on the dev stack now that #187 is served test

Done

148

last 7 days, newest first

#1063no release Voice turn timing: split the wait before the model's first word into Nodal's preparation and the provider's time cost PR #1064no releaseCI red feat(voice): split the wait before the model's first word into marked phases (#1063) #1057no release Windows: the CLI's process-table reads hang when nodal is started without PSModulePath product PR #1060no releaseCI green fix(cli): PowerShell reads pin module discovery to the system modules, whoever started nodal (#1057) #1056no release CI Windows: tests that need the real process table are skipped in most runs; give them their own job test PR #1058no releaseCI green fix(ci): turbo's test task passes PSModuleAnalysisCachePath, so real process-table reads answer on Windows (#1056) PR #1053no releaseCI green test: a wait for a file says so when the file does not come (refs #1042) #1046no release nodal down on a slow Windows machine: a successful process-table reading is thrown away by a second, shorter one, and the stack keeps running debt PR #1052no releaseCI green fix(cli): one shutdown, one reading of the process table (#1046) #1044no release CI Windows: the single unit-test step takes 24 or 41 min depending on the runner, and timed out on main debt PR #1045no releaseCI green ci(windows): run the unit tests in the six shards of ci.yml (#1044) #1049no release Spoken replies: a launched task's acknowledgement names the teammate and the reason product PR #1050no releaseCI green fix(orchestration): spoken acknowledgement says what is done, not who does it or why (#1049) PR #1041no releaseCI green feat(measure): --persona-file plays a sheet variant on the turn's copy (Refs #995) #1034no release Windows CI: git-constat bound test hangs past 60 s (1,001 untracked files) debt PR #1036no releaseCI green test: bound mass file I/O in tests, fixes the git-constat bound hang on Windows #1033no release Windows CI: an aborted device stream can leave its subscriber on the bus (device-channel teardown hangs) debt PR #1035no releaseCI green fix(runner): a push stream ends with its request, whatever ends it (#1033) #995no release Spoken chat: a creative request opens with a narrated routing decision PR #1000no releaseCI green test(measure): detect conjugated and launch-line routing narration; drop the #977 sentence (neutral) (#995) #1029no release CI Windows red on main: the voice timing test measures read lag, not the vendor gap debt PR #1030no releaseCI green test(voice): the vendor-timing test no longer measures read lag (#1029) #1012no release Devices: re-read the waiting cards after a resync (no route for it today) bug #950no release Devices: a TypeScript kit and a Python example to connect a module in about 20 lines enhancement PR #1013no releaseCI green Devices: a TypeScript client with no dependency, a reference client, and the Connect a device docs (#950, #947) #946no release Device pairing and scoped device tokens (Settings, Devices) enhancement PR #1015no releaseCI green Device pairing, per-device keys, and Settings → Devices (#946) #1025no release Two timing-bound tests go red on a loaded Windows runner: counter-process's sample floor, live-board's 60 s hook bug PR #1026no releaseCI green test: remove two wall-clock dependencies (counter sample floor, live-board real npm call) #1023no release Device channel test: 'only another device listening' depends on earlier tests' streams closing within 3 s (flaky on Windows) bug PR #1024no releaseCI red test(devices): close and await every stream in the teardown (flaky device channel test) #945no release A device channel: external modules as a channel, questions and approvals back to the requesting device enhancement PR #1005no releaseCI green A device channel: any external module is a channel of Nodal (#945) #9300.9.10 Sandbox switch shows on while the sandbox is unavailable and commands run unconfined PR #10010.9.10CI green fix(web): the sandbox switch shows what the engine applies, for every unavailable code (#930) #986no release The reply language: the message being answered wins over the stored preferred language PR #989no releaseCI green fix(prompt): no preferred language; the agent replies in the language it is spoken to (#986) #997no release Nightly e2e: the four thread-autoscroll journeys are red on main in the last 7 measurements bug PR #1002no releaseCI green test(e2e): thread-autoscroll seeds its own long thread and stops waiting for networkidle (#997) #987no release Voice: a spoken reply answers what was asked, briefly; the rest waits for a second question PR #990no releaseCI green feat(voice): a spoken reply answers what was asked, briefly (#987) #967no release Voice: speak the reply of a voice-launched job when it finishes PR #992no releaseCI green feat(voice): a voice-launched job speaks its reply when it finishes (#967)

+ 105 older

Abandoned

2

last 7 days, newest first

03The 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

1

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
73 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
dashboard navigation @cap:installer-et-demarrer/ecran "New Chat" opens "Nodal chats" and leads to the empty conversation screen
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
l’entretien d’accueil @cap:installer-et-demarrer/ecran ne demande plus de langue, et ne range aucune langue préférée
l’entretien d’accueil @cap:installer-et-demarrer/ecran autant de questions que de mémoires, numérotées 1 à N, et le compte dit en toutes lettres
l’entretien d’accueil @cap:installer-et-demarrer/ecran chaque réponse tombe dans la mémoire de SA question
l’entretien d’accueil @cap:installer-et-demarrer/ecran la dernière réponse, celle de l’autonomie, est celle de la question d’autonomie
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 « Devices » porte la pastille corail tant qu’une demande d’appairage attend (#946)
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
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran off : dit ce que ça coûte, et l’interrupteur est éteint
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran off parce que coupé dans les réglages du système : la raison, et l’interrupteur reste utilisable
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran à la connexion (Linux sans linger) : la commande exacte qui le fait démarrer au boot
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran au boot : dit qu’il démarre sans session ouverte
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran impossible ici : la raison, et un interrupteur inerte
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran illisible : l’erreur est dite, jamais « off »
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran bascule : envoie le geste, puis montre l’état RELU dans le système
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran refus : le CLI répond sans rien inscrire (install lancée par npx), aucun succès, la raison est dite
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran extinction refusée : l’entrée est toujours là, aucun succès
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran un invité ne peut pas le changer
Start Nodal when this machine starts @cap:installer-et-demarrer/ecran n’emploie aucun tiret cadratin
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
312 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
a runner booted without `up` @cap:installer-et-demarrer/moteur is registered before it touches its database, and denied to another instance
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
le web appelle le CLI pour démarrer avec la machine (#451) @cap:installer-et-demarrer/moteur lit l’état en appelant `service status --json`
le web appelle le CLI pour démarrer avec la machine (#451) @cap:installer-et-demarrer/moteur allumer appelle `service install --json`, et rend l’état que le CLI a relu
le web appelle le CLI pour démarrer avec la machine (#451) @cap:installer-et-demarrer/moteur sans la commande du CLI, l’erreur est dite, jamais « off »
parseServiceJson @cap:installer-et-demarrer/moteur lit la dernière ligne : un avertissement de node peut précéder
parseServiceJson @cap:installer-et-demarrer/moteur off avec sa raison (coupé côté Windows) : la raison traverse
parseServiceJson @cap:installer-et-demarrer/moteur une réponse illisible ou inconnue rend null, jamais « off »
autostartOutcome : le toast suit l’état relu, jamais le seul « ok » @cap:installer-et-demarrer/moteur allumer : succès à la connexion comme au boot
autostartOutcome : le toast suit l’état relu, jamais le seul « ok » @cap:installer-et-demarrer/moteur éteindre : succès quand l’état relu est off, même avec une raison
autostartOutcome : le toast suit l’état relu, jamais le seul « ok » @cap:installer-et-demarrer/moteur unsupported après le geste, dans les deux sens : échec, avec la raison du système
autostartOutcome : le toast suit l’état relu, jamais le seul « ok » @cap:installer-et-demarrer/moteur allumer, relu off : échec, la raison du système quand il en donne une
autostartOutcome : le toast suit l’état relu, jamais le seul « ok » @cap:installer-et-demarrer/moteur éteindre, relu allumé : échec
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 toutes les 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 #451 — « Start with this machine » dit ce que le SYSTÈME répond, jamais un défaut
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 #876 — Sandbox dit le régime que le runner rapporte : actif, coupé, indisponible
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
ce que le démarrage lancera @cap:installer-et-demarrer/moteur ce CLI en `up` au premier plan, jamais `--detach`
ce que le démarrage lancera @cap:installer-et-demarrer/moteur un cache npx est refusé, avec la raison : il n’existe plus au redémarrage
ce que le démarrage lancera @cap:installer-et-demarrer/moteur win32 : sans script connu, refusé avec la raison, et rien n’est écrit
ce que le démarrage lancera @cap:installer-et-demarrer/moteur darwin : sans script connu, refusé avec la raison, et rien n’est écrit
ce que le démarrage lancera @cap:installer-et-demarrer/moteur linux : sans script connu, refusé avec la raison, et rien n’est écrit
les textes inscrits, par système @cap:installer-et-demarrer/moteur Linux : une unité utilisateur, relancée sur échec, voulue par la session
les textes inscrits, par système @cap:installer-et-demarrer/moteur macOS : un LaunchAgent au chargement, gardé en vie sur échec
les textes inscrits, par système @cap:installer-et-demarrer/moteur Windows : le script de la tâche, un chemin à espaces entre guillemets
l’état, lu dans le système @cap:installer-et-demarrer/moteur Linux : activée sans linger → à la connexion, avec la commande exacte du linger
l’état, lu dans le système @cap:installer-et-demarrer/moteur Linux : linger actif → au boot
l’état, lu dans le système @cap:installer-et-demarrer/moteur Linux : pas de session systemd utilisateur → impossible, avec la raison
l’état, lu dans le système @cap:installer-et-demarrer/moteur Linux : une unité absente se lit « off »
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur pas de valeur Run → off, sans raison
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur valeur Run, pas d’entrée StartupApproved → à la connexion
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur StartupApproved 02 → à la connexion
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur StartupApproved 03 (coupée côté Windows) → off, avec la raison
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur la raison dit ce que Windows répond, sans renvoyer vers un écran de Windows
Windows : l’état, lu dans Run puis StartupApproved @cap:installer-et-demarrer/moteur un premier octet inconnu se dit, il ne devient ni on ni off
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur les clés sont celles du démarrage PAR UTILISATEUR (HKCU)
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur inscrire : `reg add` exact sous Run, lancé sans fenêtre, et l’état se relit
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur coupée côté Windows → off avec la raison ; rallumer ici efface l’entrée StartupApproved
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur retirer : la valeur Run, son entrée StartupApproved et le script partent
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur une ancienne tâche planifiée est effacée, à l’inscription comme au retrait
Windows : la valeur Run, sans droits admin @cap:installer-et-demarrer/moteur ancienne tâche que Windows refuse d’effacer : dit lisiblement, avant tout autre geste
inscrire, puis relire le système @cap:installer-et-demarrer/moteur Linux : l’unité est écrite et ACTIVÉE, jamais démarrée ; sans linger, à la connexion
inscrire, puis relire le système @cap:installer-et-demarrer/moteur macOS : le LaunchAgent est posé ; retiré à la main, l’état se lit « off »
inscrire, puis relire le système @cap:installer-et-demarrer/moteur un cache npx ne s’inscrit pas : rien n’est écrit
une inscription par instance (NODALAI_HOME) @cap:installer-et-demarrer/moteur le dossier par défaut garde ses noms ; un autre dossier a les siens
une inscription par instance (NODALAI_HOME) @cap:installer-et-demarrer/moteur Windows : B s’inscrit sous son nom, avec SON dossier ; la retirer laisse A en place
une inscription par instance (NODALAI_HOME) @cap:installer-et-demarrer/moteur Windows : B n’efface jamais l’ancienne tâche planifiée de A
une inscription par instance (NODALAI_HOME) @cap:installer-et-demarrer/moteur Linux : B a son unité, qui porte son dossier ; A reste activée
une inscription par instance (NODALAI_HOME) @cap:installer-et-demarrer/moteur macOS : B a son LaunchAgent, sous son label
up --detach keeps the database running @cap:installer-et-demarrer/moteur the cluster answers a query after the launcher has exited
up --detach keeps the database running @cap:installer-et-demarrer/moteur `down` stops it afterwards, and the port is closed
a foreground launcher still takes the cluster with it @cap:installer-et-demarrer/moteur the port is closed once the launcher has exited
releasing the cluster from the package exit hook @cap:installer-et-demarrer/moteur unhooks every event the package hooked, and removes the listeners from the process
releasing the cluster from the package exit hook @cap:installer-et-demarrer/moteur is idempotent: a second release is a no-op, not an error
arming a detached postgres spawn @cap:installer-et-demarrer/moteur the next spawn of the postgres binary is detached, with its other options kept
arming a detached postgres spawn @cap:installer-et-demarrer/moteur only that spawn: others, before and after, are untouched; and it is one-shot
arming a detached postgres spawn @cap:installer-et-demarrer/moteur disarming before any spawn puts the original back and detaches nothing
arming a detached postgres spawn @cap:installer-et-demarrer/moteur matched() stays false when only other programs were spawned
up wires both halves, and only on --detach @cap:installer-et-demarrer/moteur the cluster is started detached only when --detach is asked for
up wires both halves, and only on --detach @cap:installer-et-demarrer/moteur the detached branch releases the cluster right before it exits
up wires both halves, and only on --detach @cap:installer-et-demarrer/moteur the foreground shutdown still stops the cluster itself
a detached start checks its own spawn @cap:installer-et-demarrer/moteur arms the spawn: the package spawning postgres through child_process.spawn gets it detached
a detached start checks its own spawn @cap:installer-et-demarrer/moteur a package that never goes through the detached spawn makes the start FAIL, named, before it reports healthy
a detached start checks its own spawn @cap:installer-et-demarrer/moteur a foreground start arms nothing and asks nothing of the spawn
a detached start checks its own spawn @cap:installer-et-demarrer/moteur a foreground start does not require the spawn to have been seen
down after a fresh start stops Postgres, runner and web @cap:installer-et-demarrer/moteur all three are dead afterwards, and the record is cleared
down after a fresh start @cap:installer-et-demarrer/moteur stops runner and web recorded at the spawn, before any health check
down after a fresh start @cap:installer-et-demarrer/moteur a record of bare numbers is still refused: nothing is signalled and the record is kept
down after a fresh start @cap:installer-et-demarrer/moteur a partial stop keeps only what is still running on record
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur refuses a pid the reading could not take (no table): nothing is signalled
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur refuses a pid the reading took and disowned
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur refuses a pid that is owned by ANOTHER number: ownership is per pid
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur refuses a lockfile that names no pid, and does not claim a stop
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur leaves a stale lockfile whose pid is gone alone, and claims nothing
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur stops a pid the probe OWNS
down and the postmaster named by the lockfile @cap:installer-et-demarrer/moteur names the command to stop it by hand, with the REAL data dir, and says it will keep refusing
down summary when Postgres is refused @cap:installer-et-demarrer/moteur does not say stopped, names the postmaster, and returns it as unstopped
down summary when Postgres is refused @cap:installer-et-demarrer/moteur the CLI exits non-zero and prints the same summary
down summary when Postgres is refused @cap:installer-et-demarrer/moteur a lockfile that names no pid is reported as that, never as "still running"
the by-hand stop line runs as printed in the default shell @cap:installer-et-demarrer/moteur on Windows it is a PowerShell call: & operator, single-quoted literals, -Force last resort
the by-hand stop line runs as printed in the default shell @cap:installer-et-demarrer/moteur elsewhere it is the sh form, with the root warning, and kill as the last resort
the by-hand stop line runs as printed in the default shell @cap:installer-et-demarrer/moteur with no pid there is no last resort to print
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur completes when the only leftover is a postmaster a reading PROVED is not ours, and never touches it
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur blocks on our own postmaster that is still running, and prints how to stop it
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur blocks on a postmaster nothing could confirm (macOS, #840), with the commands
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur blocks on a lockfile with no readable pid, and the remedy is to delete the file, not to "stop" anything
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur blocks on a runner nothing identifies, and says how to look at it
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur a foreign postmaster does not excuse a runner that still runs
reset decides from why a service was not stopped @cap:installer-et-demarrer/moteur completes when down left nothing
down keys on the evidence, not on whether a table was read @cap:installer-et-demarrer/moteur a pid PROVEN not ours gets no stop command and no kill: nothing of ours runs there
down keys on the evidence, not on whether a table was read @cap:installer-et-demarrer/moteur a pid NOT PROVEN ours (a date is missing) is unconfirmed and carries the stop commands
reset sets the whole home aside in one step @cap:installer-et-demarrer/moteur a rename that fails leaves everything where it was, says what to do, and does not unregister
reset sets the whole home aside in one step @cap:installer-et-demarrer/moteur a process running out of the home is named, and nothing is touched
reset sets the whole home aside in one step @cap:installer-et-demarrer/moteur on success the HOME is renamed to a sibling before anything is deleted, then unregistered, then removed
reset sets the whole home aside in one step @cap:installer-et-demarrer/moteur a deletion that fails AFTER the rename: the home path is free, the registry is told, the leftover is named
reset sets the whole home aside in one step @cap:installer-et-demarrer/moteur a REAL process sitting in the data dir stops reset, and the home is intact
down reads the process table once @cap:installer-et-demarrer/moteur stops runner, web and its worker when the first reading answers and every later one times out
down reads the process table once @cap:installer-et-demarrer/moteur refuses exactly as before when no reading answers: nothing signalled, record kept
down reads the process table once @cap:installer-et-demarrer/moteur still vetoes `/T` over a foreign Postgres in the tree, on the held reading
down reads the process table once @cap:installer-et-demarrer/moteur refuses the web when its number went to a stranger after the runner was killed
down reads the process table once @cap:installer-et-demarrer/moteur stops the web on the held reading when the look after the runner kill does not answer
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
Nodal creates the library links itself @cap:installer-et-demarrer/moteur creates each missing link, relative, readable through it, and only once
Nodal creates the library links itself @cap:installer-et-demarrer/moteur leaves a present link alone and names every link it could not create
embedded-postgres is pinned exactly @cap:installer-et-demarrer/moteur the CLI depends on an exact version, no range
embedded-postgres is pinned exactly @cap:installer-et-demarrer/moteur the lockfile records the same specifier
embedded-postgres is pinned exactly @cap:installer-et-demarrer/moteur the published pack takes the version from the CLI manifest, and refuses a range
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
killPidTree — one reading held across a shutdown (#1046) @cap:installer-et-demarrer/moteur never vouches for a pid an earlier kill of the same shutdown signalled
killPidTree — one reading held across a shutdown (#1046) @cap:installer-et-demarrer/moteur judges the next root on a later reading that answered, not on the first
killPidTree — one reading held across a shutdown (#1046) @cap:installer-et-demarrer/moteur a reading emptied by its own strikes is still a reading that answered
killPidTree — the table is read again only when a member is still alive (#1046) @cap:installer-et-demarrer/moteur reads nothing more when every member died with the root, and signals only the root
killPidTree — the table is read again only when a member is still alive (#1046) @cap:installer-et-demarrer/moteur re-reads and kills a member still alive that the second reading vouches for
killPidTree — the table is read again only when a member is still alive (#1046) @cap:installer-et-demarrer/moteur refuses a member that is alive only because a stranger took its number
killPidTree — the table is read again only when a member is still alive (#1046) @cap:installer-et-demarrer/moteur sweeps an alive member on the earlier reading when the table will not answer, word for word
killPidTree — a root is judged on a look taken after the last signal (#1046, review pass 1) @cap:installer-et-demarrer/moteur refuses the second root when the look after the first kill shows a stranger on its number
killPidTree — a root is judged on a look taken after the last signal (#1046, review pass 1) @cap:installer-et-demarrer/moteur kills the second root on the held reading when that look does not answer
killPidTree — a root is judged on a look taken after the last signal (#1046, review pass 1) @cap:installer-et-demarrer/moteur takes no look before the first root: nothing was signalled since the reading
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
setup wizard endpoint probes (#608) @cap:installer-et-demarrer/moteur a refused model list releases its response
setup wizard endpoint probes (#608) @cap:installer-et-demarrer/moteur a model list whose body goes silent gives up within its 3 s, and releases it
setup wizard endpoint probes (#608) @cap:installer-et-demarrer/moteur a reachability probe releases the response it only needed the status of
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
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur derives every path from the home, and writes config, pids, logs, pg-data there only
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur puts the launcher and postgres logs under the home
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur hands the resolved home to the runner and the web it starts
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur hands the default home explicitly when NODALAI_HOME is not set
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur keeps NODALAI_CONFIG_PATH ahead of the home for config.json alone
the CLI under NODALAI_HOME @cap:installer-et-demarrer/moteur refuses a home it cannot create, naming it, instead of writing elsewhere
the CLI entry point refuses a bad NODALAI_HOME @cap:installer-et-demarrer/moteur relative: exit 1 with the message alone, and nothing created under the default home
the CLI entry point refuses a bad NODALAI_HOME @cap:installer-et-demarrer/moteur empty: exit 1 with the message alone, and nothing created under the default home
the CLI entry point refuses a bad NODALAI_HOME @cap:installer-et-demarrer/moteur a narrower variable is checked the same way
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
recording a start @cap:installer-et-demarrer/moteur writes the creation tick and executable name of runner AND web, with the pids
recording a start @cap:installer-et-demarrer/moteur what it wrote is what makes `down` allowed to stop them
recording a start @cap:installer-et-demarrer/moteur a pid recorded as a bare number is still refused — the refusal is untouched
recording a start @cap:installer-et-demarrer/moteur refreshing after the health check completes the tree and keeps the identities
recording a start @cap:installer-et-demarrer/moteur an unreadable table is reported, and the pids are still written for `down` to refuse by name
recording a start @cap:installer-et-demarrer/moteur a failed refresh never erases the identities a good reading wrote
recording a start @cap:installer-et-demarrer/moteur a root the table does not list is reported as unidentified, the other one is not
recording a start @cap:installer-et-demarrer/moteur a PARTIAL refresh keeps the identity of the root the new reading does not list
recording a start @cap:installer-et-demarrer/moteur an EMPTY refresh keeps the root that was identified and reports only the one that never was
recording a start @cap:installer-et-demarrer/moteur a new reading replaces an identity only with one for the SAME pid
recording a start @cap:installer-et-demarrer/moteur a pid file left by ANOTHER start lends no identity and no children
recording a start @cap:installer-et-demarrer/moteur off Windows the pids are written as they are, and nothing is reported as missing
keeping the record of a stack down could not stop @cap:installer-et-demarrer/moteur retains only the pids still running, with their identity
the writer of a start is one, and `up` calls it at the spawn @cap:installer-et-demarrer/moteur no bare `writePids` exists outside processes.ts
the writer of a start is one, and `up` calls it at the spawn @cap:installer-et-demarrer/moteur up records the services before it starts waiting for them to be healthy
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
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur ours: a live postgres whose creation date matches the lockfile
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur UNKNOWN, not a mismatch, when the process row has no creation date
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur UNKNOWN, not a mismatch, when the lockfile carries no start time (no line 3)
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur NOT ours when both dates are known and disagree
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur UNKNOWN when the pid is merely ABSENT from the list: absence is never a disproof
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur NOT ours when a DIRECT query about this pid says it is another program
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur a DIRECT query that finds a postgres is judged like a row: dates agree -> ours, a date missing -> unknown
judgeClaimedPostmaster @cap:installer-et-demarrer/moteur UNKNOWN when the table could not be read, or nothing claims the data dir
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur ours: runs out of the data dir and the dates agree
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur NOT ours: the kernel says the process runs out of ANOTHER directory
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur UNKNOWN: the platform cannot say which directory the process runs out of
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur UNKNOWN: the start time cannot be read, or the lockfile has no line 3
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur NOT ours: both dates known and apart
unconfirmedReading (no table: one pid, three OS questions) @cap:installer-et-demarrer/moteur NOT ours: the claimed pid is not running at all
postgresProcessesForDataDir on Windows: absence from the list proves nothing @cap:installer-et-demarrer/moteur a partial list that misses our pid, and a direct query that does not answer: UNKNOWN, not "stale"
postgresProcessesForDataDir on Windows: absence from the list proves nothing @cap:installer-et-demarrer/moteur a direct query that finds ANOTHER program under the pid: NOT ours
postgresProcessesForDataDir on Windows: absence from the list proves nothing @cap:installer-et-demarrer/moteur a direct query that finds our postgres the list had dropped: OURS
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 links the install script never created are created by up, which then carries on
up refuses to start on missing database binaries @cap:installer-et-demarrer/moteur a link up cannot create stops it with HYDRATION_FAILED, before the config
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
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur the pack ships the three runtime DLLs, at 14.44 or newer
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur reads linker version and imports from a real runtime DLL
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur the minimum is the newest linker among binaries that import the runtime
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur copies the shipped runtime next to postgres.exe, then leaves it alone
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur replaces an older runtime next to postgres.exe, keeps a newer one
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur when no copy can be made, refuses with a coded error if System32 is too old
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur when no copy can be made, uses System32 if it is new enough
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur refuses a pack whose runtime is older than the binaries need
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur refuses a pack that does not carry the runtime
the VC++ runtime next to postgres.exe @cap:installer-et-demarrer/moteur the shipped runtime covers the real embedded Postgres binaries
PowerShell reads without the caller’s module path @cap:installer-et-demarrer/moteur reads the process table as fast without the two variables as with them, this process included
PowerShell reads without the caller’s module path @cap:installer-et-demarrer/moteur answers the postgres probe and the one-pid query without the two variables
one way to run PowerShell @cap:installer-et-demarrer/moteur pins module discovery to the system modules, before the script
one way to run PowerShell @cap:installer-et-demarrer/moteur no product file of the CLI or the runner spawns PowerShell around the helper
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
getSession — the default workspace of a member of several @cap:se-connecter/moteur is the oldest workspace, whatever order the memberships were written in
createLocalAuthProvider @cap:se-connecter/moteur returns a LocalAuthProvider instance
createLocalAuthProvider @cap:se-connecter/moteur getSession returns null for a request without a session cookie
48 more
createLocalAuthProvider @cap:se-connecter/moteur getSession returns null for a request with a bogus cookie
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)
GET /api/events — la garde (#944) @cap:se-connecter/moteur local-auth : sans le secret, 401 ; avec, le flux
GET /api/events — la garde (#944) @cap:se-connecter/moteur bearer-token : une session ne lit que SON espace ; sans session, 401
the voice turn route — the runner gate @cap:se-connecter/moteur local-auth: every path of the turn refuses a request with no credential
the voice turn route — the runner gate @cap:se-connecter/moteur bearer-token: a session reaches its own entity’s turns only
ClaimOwnerSchema email @cap:se-connecter/moteur accepts quentin@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts first.last@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts user+tag@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts USER@EXAMPLE.COM
ClaimOwnerSchema email @cap:se-connecter/moteur accepts Mixed.Case@Example.Org
ClaimOwnerSchema email @cap:se-connecter/moteur accepts 12345@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts a@b.co
ClaimOwnerSchema email @cap:se-connecter/moteur accepts user@sub.domain.example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts user@my-domain.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts user@example.photography
ClaimOwnerSchema email @cap:se-connecter/moteur accepts o'brien@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts under_score@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur accepts user@xn--bcher-kva.example
ClaimOwnerSchema email @cap:se-connecter/moteur accepts padded@example.com
ClaimOwnerSchema email @cap:se-connecter/moteur rejects ""
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "plainaddress"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user@"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user@@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user@example"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user example@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user@exa mple.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects ".user@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user..name@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "user@-example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur rejects "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com"
ClaimOwnerSchema email @cap:se-connecter/moteur refuses the non-ASCII address user@bücher.example (unchanged since 4.4.3)
ClaimOwnerSchema email @cap:se-connecter/moteur refuses the non-ASCII address üser@example.com (unchanged since 4.4.3)
ClaimOwnerSchema email @cap:se-connecter/moteur refuses the non-ASCII address user@例え.jp (unchanged since 4.4.3)
ClaimOwnerSchema email @cap:se-connecter/moteur reports the failing field for an invalid address

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 failed · engine passed
failed see the run
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
aperçu du prompt du root (Réglages → Root context) @cap:configurer-agent/ecran annonce la skill dont le job du root tient les outils, pas celle qu’aucun job ne tient
10 more
aperçu du prompt du root (Réglages → Root context) @cap:configurer-agent/ecran annonce exactement les skills que le JOB du root annonce
aperçu du prompt du root : les consignes des serveurs MCP @cap:configurer-agent/ecran montre les consignes du serveur dont le job du root tient un outil
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran sits next to Reasoning with the levels the model offers, and shows the stored value
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran a stored level is shown as stored
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran Save sends both efforts, each as chosen
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran Auto is saved as null, and Reset brings the stored value back
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran a model that does not offer the stored level brings it back to Auto, and says so on save
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran a model with no reasoning control shows neither field
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran a stored level the model does not offer is shown as itself, with a note, in both fields
Agent settings, Reasoning when spoken to (#977) @cap:configurer-agent/ecran an untouched effort is saved as stored, even when the model does not offer it
passed
the first value of Reasoning when spoken to (#977) @cap:configurer-agent/moteur a new agent gets off when its model offers it, Auto otherwise
the first value of Reasoning when spoken to (#977) @cap:configurer-agent/moteur at the first boot after 0159, the agents of an older workspace get it once
the first value of Reasoning when spoken to (#977) @cap:configurer-agent/moteur a second boot changes nothing, and a value changed by hand is never overwritten
16 more
the first value of Reasoning when spoken to (#977) @cap:configurer-agent/moteur a workspace created after 0159 is born marked: its agents are never rewritten at boot
the first value of Reasoning when spoken to (#977) @cap:configurer-agent/moteur a key of another workspace says nothing about the model: the agent stays Auto
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
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
où vont les nouveaux fichiers @cap:configurer-agent/moteur le dossier du job, sinon le premier dossier qui n’est pas le partagé
où vont les nouveaux fichiers @cap:configurer-agent/moteur un libellé ne forge jamais une section du prompt
executeJob a resumed job keeps its stored prompt under the same version, and rewrites one written by another version @cap:configurer-agent/moteur
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
283 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
createAgentRepo writes the delegation text of each sub-agent @cap:organiser-equipe/moteur the orchestrator is created with its team AND the text shown for each teammate
createAgentRepo writes the delegation text of each sub-agent @cap:organiser-equipe/moteur refuses a text for an agent that is not one of the sub-agents, and writes nothing
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 hands what the call has produced so far to onProgress (#484)
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, and each attachment at the flat allowance, not its bytes
computeTurnClocks @cap:organiser-equipe/moteur an attachment inside a tool result counts the same
the ceiling on production that delivers nothing (#484) @cap:organiser-equipe/moteur reasoning only, one delta every 30 s, is cut at the ceiling, not at the hour
the ceiling on production that delivers nothing (#484) @cap:organiser-equipe/moteur tool arguments trickling one character every 59 s are cut at the ceiling
the ceiling on production that delivers nothing (#484) @cap:organiser-equipe/moteur text resets it: 15 minutes of reasoning, text, 15 more of reasoning, then the answer completes
the ceiling on production that delivers nothing (#484) @cap:organiser-equipe/moteur a local endpoint has no such ceiling: 25 minutes of reasoning, then the answer
the ceiling on production that delivers nothing (#484) @cap:organiser-equipe/moteur the tool being filled is forgotten once its arguments end (progress)
a tool call finished IN the stream does not reset the ceiling (#484) @cap:organiser-equipe/moteur a finished tool call, then more reasoning: the stream is cut at the ceiling from the start
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 — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur an MCP server is followed by the tools the teammate holds, so a printing server reads as one
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur a restricted enabled_tools shows only the tools the teammate holds: enabled ∩ available
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur every tool held is named, however many: a print request 12th of its server is visible
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur a connector held in full names every operation by its adapter name: Send email, 21st of Gmail, is visible
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur a connector held in part lists only the operations it holds
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur two instances of one connector give the union of their operations, in the adapter order
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur a connector operation is never named by its tool id: the reader does not hold that tool (#559)
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur several entries on one line, separated so a tool list never reads as another entry
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur two instances of one server merge into one entry with the union of what they give
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur every name shown comes from the data: generated names, random subsets, nothing else on the line (invariant #1)
buildTeamBlock — a Connectors entry says what the teammate can do (#611) @cap:organiser-equipe/moteur the roster code does not read the connector labels written in code (Codex review of #653, pass 1)
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 — ce que chaque agent peut réellement faire (#506) @cap:organiser-equipe/moteur CLI runtime: the shell announced is the one the agent row and the brake give its turn @cap:executer-une-commande/moteur
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
renderDelegationOutcome borné : l’objet est du JSON complet, par construction @cap:organiser-equipe/moteur 500 verdicts, 2000 fichiers, 300 sous-délégations : le budget tient, l’objet se relit, la liste partielle le dit
renderDelegationOutcome borné : l’objet est du JSON complet, par construction @cap:organiser-equipe/moteur le même enregistrement sous un ÉCHEC : marqueur, objet relisible et consignes tiennent ensemble
renderDelegationOutcome borné : l’objet est du JSON complet, par construction @cap:organiser-equipe/moteur quelle que soit la place, l’objet n’est jamais coupé : il se relit, et la charge tient
renderDelegationOutcome borné : l’objet est du JSON complet, par construction @cap:organiser-equipe/moteur un drapeau reçu d’en bas remonte : forme entière comme forme bornée
renderDelegationOutcome borné : l’objet est du JSON complet, par construction @cap:organiser-equipe/moteur un petit enregistrement complet : rendu entier, sans drapeau
un texte libre de 30 000 caractères a sa part, jamais toute la place (revue Codex de #712, passe 4) @cap:organiser-equipe/moteur à chaque place depuis le plancher, l’objet tient, se relit, et chaque texte est coupé avec la marque
un texte libre de 30 000 caractères a sa part, jamais toute la place (revue Codex de #712, passe 4) @cap:organiser-equipe/moteur la plus petite place que fitToolResult donne vraiment, sous un échec aux consignes les plus longues : ≤ budget
un texte libre de 30 000 caractères a sa part, jamais toute la place (revue Codex de #712, passe 4) @cap:organiser-equipe/moteur sous le plancher, une erreur NOMMÉE plutôt qu’un résultat qui dépasse
A delegating job reads each fact of its team once @cap:organiser-equipe/moteur the delegation scope rule is said exactly once where the job can delegate, never where it cannot
A delegating job reads each fact of its team once @cap:organiser-equipe/moteur an assign_* tool names its teammate from the base; what the roster describes is said there only
A delegating job reads each fact of its team once @cap:organiser-equipe/moteur an assign_* costs its parameter schema and its teammate’s name, nothing that grows with the roster
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é
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur root → Lead → Reviewer A : Lead livre le verdict de Reviewer A, avec son auteur
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur deux étages de relais : le verdict remonte quand même
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur un intermédiaire qui juge à son tour ne remplace pas le verdict d’en dessous : les deux voyagent
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur une ligne illisible sous un intermédiaire qui a jugé est nommée quand même
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur un job qui appelle review_verdict deux fois (refusé, puis accepté) : seul son dernier appel compte
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur deux verdicts qui se contredisent : les deux voyagent, dans l’ordre, et l’interdit tient
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur une délégation ordinaire : son texte, aucun verdict
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur un enfant qui n’a livré QUE son verdict a livré quelque chose
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur une ligne illisible deux étages plus bas est nommée, avec son auteur
readJobDeliverables — le verdict traverse les relais @cap:organiser-equipe/moteur plusieurs jobs en une lecture : chacun reçoit son propre sous-arbre
renderDeliveredVerdicts — les champs typés, sans prose (invariant #2) @cap:organiser-equipe/moteur pose verdict, auteur, résumé et constats fichier:ligne + sévérité
renderDeliveredVerdicts — les champs typés, sans prose (invariant #2) @cap:organiser-equipe/moteur sans verdict, le texte revient tel quel, octet pour octet
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
readJobDeliverable — le verdict du job lui-même @cap:organiser-equipe/moteur lit le verdict sur la ligne tool_calls du job
readJobDeliverable — le verdict du job lui-même @cap:organiser-equipe/moteur rend null quand le job n’a jamais appelé l’outil
readJobDeliverable — le verdict du job lui-même @cap:organiser-equipe/moteur c’est le DERNIER appel qui fait foi
readJobDeliverable — le verdict du job lui-même @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
une tâche recopie ce que son job a livré (#646) @cap:organiser-equipe/moteur le job n’a livré qu’un verdict : la tâche le porte, et la compilation du root aussi
une tâche recopie ce que son job a livré (#646) @cap:organiser-equipe/moteur le faucheur qui finalise une tâche oubliée recopie le même livrable
une tâche recopie ce que son job a livré (#646) @cap:organiser-equipe/moteur une tâche dont le job n’est pas une revue recopie son texte tel quel
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
une question d’un serveur en attente n’empêche pas la reprise @cap:organiser-equipe/moteur le job reprend à son tour sauvegardé, et la question meurt avec l’appel
watchCallProgress (#484) @cap:organiser-equipe/moteur says, every period, how long the call has run and what it produced last
watchCallProgress (#484) @cap:organiser-equipe/moteur says nothing more once stopped
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_verdicts est vide
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
un enregistrement BORNÉ ne fait jamais conclure « rien n’a échoué » @cap:organiser-equipe/moteur 300 sous-délégations dont 200 échouées : les noms gardés sont dits, `…` dit qu’il en manque, et le drapeau remonte
un enregistrement BORNÉ ne fait jamais conclure « rien n’a échoué » @cap:organiser-equipe/moteur collision de la passe 4 : l’échec retiré par le Lead, puis nommé, puis réparé, n’est jamais dit deux fois ni gardé
un enregistrement BORNÉ ne fait jamais conclure « rien n’a échoué » @cap:organiser-equipe/moteur passe 5 : un record complet plus récent du Lead ne fait pas tomber `…` — les échecs omis n’ont pas de nom, rien ne prouve leur réparation
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 Stop pendant l’écriture : le partiel devient le RÉSULTAT, et la progression en direct est effacée (#444) @cap:suivre-execution/moteur
Stop arrête le travail PENDANT l’appel au modèle @cap:organiser-equipe/moteur la trace du Stop dit ce que l’appel produisait : l’outil et ses arguments (#484)
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
le battement d’un appel au modèle dit ce qu’il produit (#484) @cap:organiser-equipe/moteur au-delà de 60 s, une ligne llm_call_progress porte la production de l’appel
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
la compilation des enfants lit ce qu’ils ont LIVRÉ (#646) @cap:organiser-equipe/moteur un relecteur qui n’a livré QUE son verdict n’est pas « no deliverable »
la compilation des enfants lit ce qu’ils ont LIVRÉ (#646) @cap:organiser-equipe/moteur un relecteur dont le dernier texte est une ligne de narration : le relais montre son verdict
la compilation des enfants lit ce qu’ils ont LIVRÉ (#646) @cap:organiser-equipe/moteur root → Lead → Reviewer A : le relais du root porte le verdict de Reviewer A, attribué à Reviewer A
la compilation des enfants lit ce qu’ils ont LIVRÉ (#646) @cap:organiser-equipe/moteur un enfant qui n’est pas une revue : la section est inchangée, octet pour octet
la compilation des enfants lit ce qu’ils ont LIVRÉ (#646) @cap:organiser-equipe/moteur le chemin d’échec compile les mêmes livrables (failJob)
la garde « livrable vide » lit le même livrable (#646) @cap:organiser-equipe/moteur un parent dont l’enfant n’a livré qu’un verdict termine, et son résultat porte ce verdict
a delegate that delivers a wait hands its orchestrator what waits @cap:organiser-equipe/moteur the parent's next LLM request carries the child's wait: "The print request is created a…"
a delegate that delivers a wait hands its orchestrator what waits @cap:organiser-equipe/moteur the parent's next LLM request carries the child's wait: "The meeting invite is sent; it…"
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
an image and a delegation @cap:organiser-equipe/moteur the parent image does not travel; the child, whose model sees, looks at the file itself; the team line is a fact
an image read in the turn that delegates @cap:organiser-equipe/moteur its result travels as a side result: the image is said there, never its base64 as text
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
setAgentModelRepo @cap:choisir-modele/moteur sets model and key, and takes the new primary key out of the fallback chain
setAgentModelRepo @cap:choisir-modele/moteur refuses an agent of another workspace, and writes nothing to it
createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError when provider is empty
129 more
createLlmClient @cap:choisir-modele/moteur throws ProviderConfigError when model is empty
createLlmClient @cap:choisir-modele/moteur returns a client with the correct config
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
isLocalUrl (#608) @cap:choisir-modele/moteur http://localhost:11434 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://127.0.0.1:1234/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://[::1]:8080 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://10.0.0.5:8000/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://192.168.1.60:8080/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://172.20.0.2:11434 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://gpu-box:11434 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://ollama:11434/api is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://studio.local:1234/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://nas.home.arpa:8080/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur http://llm.corp.internal/v1 is local
isLocalUrl (#608) @cap:choisir-modele/moteur https://openrouter.ai/api/v1 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur https://api.openai.com/v1 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur https://8.8.8.8/v1 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur https://provider.example.com/v1 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur http://nas.lan:8080 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur http://box.home:8080 is not local
isLocalUrl (#608) @cap:choisir-modele/moteur not a url is not local
the request a provider receives carries no nameless call @cap:choisir-modele/moteur OpenAI-compatible: tool_calls and tool messages name only the real call
the request a provider receives carries no nameless call @cap:choisir-modele/moteur Anthropic: tool_use and tool_result blocks name only the real call
the request a provider receives carries no nameless call @cap:choisir-modele/moteur Google: functionCall and functionResponse parts name only the real call
provider transport wiring (#608) @cap:choisir-modele/moteur 'anthropic' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openai' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'ollama' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openai-compatible' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'google' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'mistral' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'groq' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openrouter' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'deepseek' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'minimax' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'moonshot' sends its model call through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openai' embeddings go through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'ollama' embeddings go through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openai' image generation goes through providerFetch
provider transport wiring (#608) @cap:choisir-modele/moteur 'openrouter' image generation goes through providerFetch
a file is judged against the model that serves, through a failover chain @cap:choisir-modele/moteur PDF: the primary fails from the start; the fallback takes no PDF, so the tool is refused in ITS name
a file is judged against the model that serves, through a failover chain @cap:choisir-modele/moteur image: the primary fails from the start; the fallback does not see, so the image is refused in ITS name
a file is judged against the model that serves, through a failover chain @cap:choisir-modele/moteur the reverse chain: the fallback reads PDFs, so the PDF reaches it — no refusal in the primary’s name
a file is judged against the model that serves, through a failover chain @cap:choisir-modele/moteur PDF: the primary serves a turn then fails; the request the fallback gets is hydrated for the fallback
a file is judged against the model that serves, through a failover chain @cap:choisir-modele/moteur image: the primary serves a turn then fails; the image is not sent to a fallback that does not see
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
whether a model sees is read per model, never per provider @cap:choisir-modele/moteur a text-only model of a provider whose other models see is refused the image, and told why
a photo the person sent reaches a model that sees, however its id is spelled @cap:choisir-modele/moteur a dated twin (anthropic/claude-haiku-4.5-20251001): the photo is sent
a photo the person sent reaches a model that sees, however its id is spelled @cap:choisir-modele/moteur a -latest alias of a seeing model (anthropic/claude-sonnet-5.5-latest): the photo is sent
a photo the person sent reaches a model that sees, however its id is spelled @cap:choisir-modele/moteur an id Nodal does not know: the photo is not sent, and the note says the model is not known to take images
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'
one match from an id to a known model: modelIdKey (review of #798, pass 2) @cap:choisir-modele/moteur an alias, a dated twin, a provider prefix and -latest read as the model they name
one match from an id to a known model: modelIdKey (review of #798, pass 2) @cap:choisir-modele/moteur a family is never guessed: an id that names no known model does not see
one match from an id to a known model: modelIdKey (review of #798, pass 2) @cap:choisir-modele/moteur no text-only model of the catalog shares its key with a model that sees
one match from an id to a known model: modelIdKey (review of #798, pass 2) @cap:choisir-modele/moteur the reason says which it is: a known text-only model, or one Nodal does not know
one match from an id to a known model: modelIdKey (review of #798, pass 2) @cap:choisir-modele/moteur findModelCatalogEntry reads an alias the same way
which models take a PDF document (#903) @cap:choisir-modele/moteur read through the same key as images: the owner’s OpenRouter Haiku, its native twin, Gemini
which models take a PDF document (#903) @cap:choisir-modele/moteur a model that sees images is not, for that, a model that takes PDFs
which models take a PDF document (#903) @cap:choisir-modele/moteur every model that takes PDFs sees images, and is catalogued
which models take a PDF document (#903) @cap:choisir-modele/moteur no catalogued model that takes no PDF shares its key with one that does
which models take a PDF document (#903) @cap:choisir-modele/moteur the catalog entry says it too
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
update_agent — a model change keeps only the efforts the new model offers (#977) @cap:choisir-modele/moteur resets an unoffered effort, keeps an offered one, and touches neither without a model change
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
setAgentModelAndEffortAction, Reasoning when spoken to (#977) @cap:choisir-modele/moteur un palier que le nouveau modèle n’offre pas repasse à Auto (NULL)
setAgentModelAndEffortAction, Reasoning when spoken to (#977) @cap:choisir-modele/moteur un palier que le nouveau modèle offre encore est gardé
setAgentModelAndEffortAction, Reasoning when spoken to (#977) @cap:choisir-modele/moteur un modèle hors catalogue garde le palier : rien ne dit qu’il ne l’offre pas
updateAgentAction, un changement de modèle (#977) @cap:choisir-modele/moteur un nouveau modèle ramène à Auto les paliers qu’il n’offre pas, même non envoyés
updateAgentAction, un changement de modèle (#977) @cap:choisir-modele/moteur un palier envoyé que le nouveau modèle offre est gardé
updateAgentAction, un changement de modèle (#977) @cap:choisir-modele/moteur sans changement de modèle, un palier rangé non offert reste tel quel (Save d’un formulaire intact)
testing a key against a silent endpoint (#608) @cap:choisir-modele/moteur comes back in bounded time with a failure the person can read
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
provider calls of the dashboard (#608) @cap:choisir-modele/moteur testing a key goes through the provider transport, and the refusal is released
provider calls of the dashboard (#608) @cap:choisir-modele/moteur listing the models of a key goes through the provider transport, and the refusal is released

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
161 more
Stop dans le chat @cap:parler-a-un-agent/ecran Envoyer devient Stop pendant la réponse, et Stop arrête CETTE conversation
the chat microphone @cap:parler-a-un-agent/ecran hold, speak, release: chunks while held, the transcript "Spoken", the reply plays
the chat microphone @cap:parler-a-un-agent/ecran slide away and release: "Cancelled. Nothing was sent." and a DELETE, no end
the chat microphone @cap:parler-a-un-agent/ecran microphone refused by the browser: "Microphone blocked…", no dialog, nothing sent
the Voice setting @cap:parler-a-un-agent/ecran shows the stored voice and ear, tries another voice before saving it, and saves exactly that setting
the Voice setting @cap:parler-a-un-agent/ecran a source without a key says so, and what to do
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
the dashboard may open its own microphone (#942) @cap:parler-a-un-agent/ecran Permissions-Policy allows the microphone to self only, camera and location stay closed
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran est la PREMIÈRE ligne du dossier, au-dessus des conversations
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran mène là où mène « New conversation », et n’est qu’un lien
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran reste là quand le dossier est vide ou que la lecture a échoué
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran a la forme d’une ligne de fil : même hauteur, même retrait, plus un libellé Medium
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran n’existe dans AUCUN dossier de canal
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran disparaît avec le dossier replié, et revient au dépliage
la ligne « New Chat » de « Nodal chats » @cap:parler-a-un-agent/ecran s’allume sur l’écran vide, là où elle mène
the relaying agent’s note is shown as its own, never framed for the model @cap:parler-a-un-agent/ecran a job’s opening: the person’s words are the request, the note an item of its own, without the frame
the relaying agent’s note is shown as its own, never framed for the model @cap:parler-a-un-agent/ecran a message passed on while the work runs: its note is the agent’s, not a reminder of the platform
the relaying agent’s note is shown as its own, never framed for the model @cap:parler-a-un-agent/ecran a dashboard job’s replayed history: folded on the run page, absent from the thread, never new messages
mic capture: the PCM the voice turn receives (#942) @cap:parler-a-un-agent/ecran floats become 16-bit signed little-endian samples, clamped
mic capture: the PCM the voice turn receives (#942) @cap:parler-a-un-agent/ecran 48 kHz to 16 kHz in chunks gives exactly what one block gives
mic capture: the PCM the voice turn receives (#942) @cap:parler-a-un-agent/ecran 44.1 kHz keeps the duration: one second in chunks is 16 000 samples, give or take one per chunk
mic capture: the PCM the voice turn receives (#942) @cap:parler-a-un-agent/ecran the average keeps a steady level
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran before any voice turn in the tab: no stream is open (a page still finishes loading); the press opens it
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran no conversation page open: the shell, on the workspace stream, plays it once, at once
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran with the conversation page open too: it plays ONCE, the page only re-reads
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran after the reply that is playing: the playing one is never cut, the announcement follows it
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran Stop while it waits: it does not play, not even after the next voice
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran a voice that is gone, an announcement not written, a voice that failed: said in a toast
the announcement of a finished voice job is heard on any dashboard page (#967) @cap:parler-a-un-agent/ecran leaving the dashboard closes the workspace stream
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
une réponse coupée se dit coupée, avec sa raison (#484) @cap:parler-a-un-agent/ecran une production invisible trop longue est dite comme telle
une réponse coupée se dit coupée, avec sa raison (#484) @cap:parler-a-un-agent/ecran une raison inconnue est montrée telle quelle, jamais un message générique
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
a spoken turn in the thread (#942) @cap:parler-a-un-agent/ecran the request carries the stored spoken duration; a typed one carries none
a spoken turn in the thread (#942) @cap:parler-a-un-agent/ecran a spoken request reads "Spoken · 0:03" under its bubble, a typed one nothing
a spoken turn in the thread (#942) @cap:parler-a-un-agent/ecran "Speaking" sits on the reply whose voice is playing, and leaves when it stops
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é
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran idle: a round mic button named "Hold to talk", with the same hover tooltip
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran listening: the textarea gives way to "Listening", a meter, a timer and the hint
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran listening: the timer counts the held seconds
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran chunks leave WHILE the button is held, in order, then `end` on release
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran transcribing: "Transcribing…" in place of the textarea, the mic disabled
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran reply: the reply audio plays, Send becomes "Stop" ("Stop speaking"), and Stop stops it
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran reply: when the audio ends by itself, Send comes back
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran cancelled: released after sliding away, a DELETE is sent and nothing else
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran cancelled: a slide that comes back over the button still sends
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran microphone blocked: a crossed mic and the note, no native dialog, and nothing sent
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran nothing heard: the route says `nothing_heard`, the composer says it
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran nothing heard by a model: the composer names the model that wrote nothing
the chat microphone, state by state (#942) @cap:parler-a-un-agent/ecran the keyboard: Space held on the focused button talks, Escape cancels
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran transcription_failed: said, nothing sent
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran speechError: the reply is kept (the thread is re-read) and the voice failure is said
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran 413 on a chunk: listening stops at once and the note says it was too long
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran refused auth at start: said, the mic stops, nothing else is sent
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran no speech key: said before the person has spoken
the chat microphone says every route outcome (#942) @cap:parler-a-un-agent/ecran a chat failure after the transcription is said in the chat words, and the thread re-read
the microphone on a screen whose conversation does not exist yet (P8, #942) @cap:parler-a-un-agent/ecran the press opens the conversation; a turn that wrote nothing gives it back
the microphone on a screen whose conversation does not exist yet (P8, #942) @cap:parler-a-un-agent/ecran a replied turn makes the screen become the new conversation
leaving the screen in the middle of a gesture (review of #964, pass 1) @cap:parler-a-un-agent/ecran while the mic is still opening: its tracks are stopped, no turn opens, no conversation is created
leaving the screen in the middle of a gesture (review of #964, pass 1) @cap:parler-a-un-agent/ecran while recording: the turn is cancelled with exactly one DELETE, and no end
leaving the screen in the middle of a gesture (review of #964, pass 1) @cap:parler-a-un-agent/ecran after the release: the turn the person sent is NOT cancelled, `end` goes through, nothing plays
the spoken reply arrives as it is written (#943) @cap:parler-a-un-agent/ecran the transcript appears with "Spoken · 0:03", the reply streams into it, and the voice plays before the end
the spoken reply arrives as it is written (#943) @cap:parler-a-un-agent/ecran Stop mid-stream: the voice falls silent, the runner is asked to stop the turn, and the stream is abandoned
the spoken reply arrives as it is written (#943) @cap:parler-a-un-agent/ecran a compressed voice (MP3) plays when the route says its sentence is complete (`audio_end`)
the spoken reply arrives as it is written (#943) @cap:parler-a-un-agent/ecran a compressed sentence the voice cut is not played, and the failure is the voice’s, not a decoding one
the spoken reply arrives as it is written (#943) @cap:parler-a-un-agent/ecran a new gesture during the reply silences it: nothing of the old reply plays over the new one
the press arms the announcements of the work it launches (#967) @cap:parler-a-un-agent/ecran holding the mic opens the workspace event stream of the shell player
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran back to back: each chunk starts exactly where the previous one ends
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a WAV chunk decoded slower than the PCM after it still plays first
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran "Speaking" lasts from the first sound to the end of the last chunk, once the stream ended
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran Stop: every scheduled chunk is cut, and what arrives after is not played
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a compressed voice (MP3) plays per sentence, complete, its chunks joined, in order, back to back
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a compressed sentence the voice cut is thrown away, never played, never called a decode error
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran an abandoned sentence then a new one: two buffers, and only the complete one plays
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a stream cut before `audio_end`: nothing joined is played
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a PCM sentence the voice cut keeps what already played: it stops where the voice stopped
the spoken reply plays its chunks in order, back to back (#943) @cap:parler-a-un-agent/ecran a missing rank, or a voice the browser cannot decode, is said, and the voice stops
the Voice section @cap:parler-a-un-agent/ecran OpenRouter chosen: shows the stored voice, the models and voices the source lists, and how long the list is kept
the Voice section @cap:parler-a-un-agent/ecran choosing a model and a voice, then Save, sends that setting, and nothing else
the Voice section @cap:parler-a-un-agent/ecran Google chosen: the model and the voice are to choose, its prebuilt voices with their description
the Voice section @cap:parler-a-un-agent/ecran Google without a key: says so and what to do, offers no model
the Voice section @cap:parler-a-un-agent/ecran a sample plays the voice on screen, back to back, and Stop silences it
the Voice section @cap:parler-a-un-agent/ecran the stored voice is sampled without a setting: the runner reads its own
the Voice section @cap:parler-a-un-agent/ecran a sample in mp3 plays through the turn player: joined per sentence, decoded once complete
the Voice section @cap:parler-a-un-agent/ecran errors are said: a refused save, a sample without credit, a runner that does not answer
the Voice section @cap:parler-a-un-agent/ecran a voice that did not speak when tried is refused at Save, with the vendor words
the Voice section @cap:parler-a-un-agent/ecran a stored voice that cannot be read is said, and a voice can be chosen
the Voice section — the transcription model (#976) @cap:parler-a-un-agent/ecran shows the stored model among those OpenRouter lists for transcription, and how long the list is kept
the Voice section — the transcription model (#976) @cap:parler-a-un-agent/ecran choosing another transcription model, then Save, sends it with the voice unchanged
the Voice section — the transcription model (#976) @cap:parler-a-un-agent/ecran without an OpenRouter key: says so, offers no model, and the voice stays choosable
the Voice section — the transcription model (#976) @cap:parler-a-un-agent/ecran a model that did not write down what the voice said is refused at Save, with what it wrote
ConversationFeedView — le handoff la note de l’agent qui a remis la demande (handoff.ts) se dit comme la sienne, à part de la demande @cap:parler-a-un-agent/ecran
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
POST /api/chat/stream relays the cut reason (#484) @cap:parler-a-un-agent/ecran an llm_cut error event reaches the browser with its cutReason
the web door of the voice setting is a pass-through (#969) @cap:parler-a-un-agent/ecran read: the entity is the SESSION one, in the query, and the answer comes back as is
the web door of the voice setting is a pass-through (#969) @cap:parler-a-un-agent/ecran write: the setting as sent, the entity of the session; a refusal keeps its status and code
the web door of the voice setting is a pass-through (#969) @cap:parler-a-un-agent/ecran sample: the sentence and the voice on screen, the entity of the session, the stream as a stream
the web door of the voice setting is a pass-through (#969) @cap:parler-a-un-agent/ecran no session: refused before the runner is reached
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran start: the entity is the SESSION one, never the one a client sends
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran a chunk reaches the runner byte for byte, at its turn and rank
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran end: the runner stream comes back as it is, event by event, as it is written (#943)
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran the browser gone, the request to the runner is abandoned with it (#943)
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran a runner refusal is relayed with its status and code, not translated
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran cancel: a DELETE of that turn
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran no session: 401, and nothing reaches the runner
the web door of the voice turn is a pass-through (#942) @cap:parler-a-un-agent/ecran a path segment cannot climb out of the voice routes
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
294 more
the workspace voice setting @cap:parler-a-un-agent/moteur a workspace is born with the voice of before the setting, as a row in entity_settings
the workspace voice setting @cap:parler-a-un-agent/moteur reads back what was written, for this workspace only
the workspace voice setting @cap:parler-a-un-agent/moteur a missing row is said as missing, never read as a voice
the workspace voice setting @cap:parler-a-un-agent/moteur a row of another shape is said as unreadable, with what is wrong
the workspace voice setting @cap:parler-a-un-agent/moteur refuses to write a value it could not read back
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
migration 0151_job_handoff_note @cap:parler-a-un-agent/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0151_job_handoff_note @cap:parler-a-un-agent/moteur original_task is gone, handoff_note is there, and 0151 is journaled after 0150
migration 0151_job_handoff_note @cap:parler-a-un-agent/moteur the backfill gives a past chat hand-off its front’s text as its note, and no other job a note
migration 0151_job_handoff_note @cap:parler-a-un-agent/moteur the inbox relaunch: the entry's words as the task, the relaying model's note apart, messages left to the loop
migration 0157_spoken_turn @cap:parler-a-un-agent/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0157_spoken_turn @cap:parler-a-un-agent/moteur a message written without the column is typed; a spoken one is the person’s, and lasted
migration 0157_spoken_turn @cap:parler-a-un-agent/moteur a job written without the column is read; an unknown rendering is refused
migration 0157_spoken_turn @cap:parler-a-un-agent/moteur the inbox relaunch gives the new head its root’s rendering
migration 0157_spoken_turn @cap:parler-a-un-agent/moteur records the migration in the journal drizzle-kit actually reads
migration 0158_voice_setting @cap:parler-a-un-agent/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0158_voice_setting @cap:parler-a-un-agent/moteur a workspace created after the migration is born with the voice of before the setting
migration 0158_voice_setting @cap:parler-a-un-agent/moteur a workspace of before the migration receives its row; a chosen voice is kept
migration 0158_voice_setting @cap:parler-a-un-agent/moteur records the migration in the journal drizzle-kit actually reads
migration 0160_voice_transcription @cap:parler-a-un-agent/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0160_voice_transcription @cap:parler-a-un-agent/moteur a workspace created after the migration is born with the ear
migration 0160_voice_transcription @cap:parler-a-un-agent/moteur a row of 0158 gains the ear and keeps its voice; a chosen ear and an unreadable row are left alone
migration 0160_voice_transcription @cap:parler-a-un-agent/moteur records the migration in the journal drizzle-kit actually reads
the result of a nameless call travels as data @cap:parler-a-un-agent/moteur a third party’s text under a nameless call is framed as external data
provider connections (#608) @cap:parler-a-un-agent/moteur a call completes while another call to the same provider lies unread
provider connections (#608) @cap:parler-a-un-agent/moteur a stream that breaks mid-answer releases its response, and the next call answers
provider connections (#608) @cap:parler-a-un-agent/moteur Stop during a streamed turn releases its response, and the next call answers
provider connections (#608) @cap:parler-a-un-agent/moteur Stop before the response headers releases the request, and the next call answers
provider connections (#608) @cap:parler-a-un-agent/moteur Stop after the headers, with only keep-alives received releases the request, and the next call answers
provider connections (#608) @cap:parler-a-un-agent/moteur an expired first-token clock releases its response, and the next call answers
provider connections (#608) @cap:parler-a-un-agent/moteur before the response headers, the first-token clock is the one that cuts
provider connections (#608) @cap:parler-a-un-agent/moteur a context probe that is refused cancels the body it will not read
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
provider transport (#608) @cap:parler-a-un-agent/moteur never cuts a provider that is silent before its headers: the turn clocks decide
provider transport (#608) @cap:parler-a-un-agent/moteur never cuts a provider that is silent between two parts of its body
provider transport (#608) @cap:parler-a-un-agent/moteur a call with no deadline of its own ends at the default one, and says so
provider transport (#608) @cap:parler-a-un-agent/moteur turns the timeouts of undici off, whatever they default to
provider transport (#608) @cap:parler-a-un-agent/moteur a body that keeps coming, with no deadline of its own, is never cut
provider transport (#608) @cap:parler-a-un-agent/moteur a body that goes silent, with no deadline of its own, ends at the default, and says so
provider transport (#608) @cap:parler-a-un-agent/moteur a call that carries its own deadline is never cut by the default one
provider transport (#608) @cap:parler-a-un-agent/moteur the proxy the environment declares takes HTTP_PROXY for a hosted provider
provider transport (#608) @cap:parler-a-un-agent/moteur the proxy the environment declares reaches a model on this machine directly, whatever NO_PROXY says
provider transport (#608) @cap:parler-a-un-agent/moteur the proxy the environment declares takes HTTPS_PROXY for a provider over TLS
provider transport (#608) @cap:parler-a-un-agent/moteur the proxy the environment declares goes direct to a hosted provider NO_PROXY names
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un tour de chat porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un tour de chat parlé porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job lancé depuis le chat porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job venu de Telegram porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job venu du serveur MCP porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job délégué porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur une session CLI de codage porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job planifié porte la règle, et ne nomme aucune langue préférée
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un tour de chat : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un tour de chat parlé : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job lancé depuis le chat : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job venu de Telegram : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job venu du serveur MCP : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job délégué : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur une session CLI de codage : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job planifié : la mémoire ouvre la moitié volatile, avant Runtime, Job context et Conversation
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur le chat situe la mémoire là où elle est : au-dessus
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur un job planifié se sait planifié, et reçoit le texte de tâche dont la règle parle
la langue du message, et aucune langue préférée @cap:parler-a-un-agent/moteur l’exemple du chat n’est plus une phrase française à recopier
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur the fixtures are the four replayed jobs
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur job f7aecffd (document): the result is quoted whole, and the rule comes AFTER it
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur job 22720a8c (short): the result is quoted whole, and the rule comes AFTER it
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur job 3b33bf31 (short): the result is quoted whole, and the rule comes AFTER it
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur job b41632f5 (printed): the result is quoted whole, and the rule comes AFTER it
the spoken announcement of a finished voice job (#967) @cap:parler-a-un-agent/moteur no channel is put in its mouth, and Nodal is named only as a place NOT to point to
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
le battement de l’appel du chat (#484) @cap:parler-a-un-agent/moteur au-delà de 60 s, une ligne llm_call_progress porte la production de la réponse
une coupure sans texte n’est pas un échec d’outil (#484) @cap:parler-a-un-agent/moteur run_task terminé puis coupure : aucune réponse « lancé », aucun job, et le tour dit la coupure
une coupure de la relance sans outils se dit comme les autres (#484) @cap:parler-a-un-agent/moteur outil fantôme, puis la relance sans outils coupée par son horloge : `llm_cut`, jamais `llm_error`
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
the chat front hands the person’s request on as they wrote it; what it adds is its note @cap:parler-a-un-agent/moteur dashboard — the incident’s shape: the correction starts a NEW job, whose worker reads the first request verbatim in the thread history, and the front’s additions apart under their frame
the chat front hands the person’s request on as they wrote it; what it adds is its note @cap:parler-a-un-agent/moteur dashboard — a correction after a text-only reply: the first request and the reply reach the worker as the thread’s history
the chat front hands the person’s request on as they wrote it; what it adds is its note @cap:parler-a-un-agent/moteur dashboard — a front that adds nothing: the worker receives the person’s words alone, and no note is kept
the chat front hands the person’s request on as they wrote it; what it adds is its note @cap:parler-a-un-agent/moteur dashboard — a non-French request, with and without a note, travels unchanged
the chat front hands the person’s request on as they wrote it; what it adds is its note @cap:parler-a-un-agent/moteur dashboard — the history is bounded like a channel’s: the oldest turns fall first, never the request
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur un run_task pendant qu’un travail court démarre un TOUR DE RÉPONSE lié à ce travail, sans rien verser dans sa file
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur un `alongside: true` inventé par le modèle ne change rien : c’est un tour de réponse (revue Codex, passe 3)
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur `run_task` n’offre pas de champ `alongside`, et sa description dit le tour de réponse
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur une ligne SANS statut n’est vivante pour aucun chemin : run_task lance une tête au repos (revue de #642, passe 1)
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur un travail TERMINÉ ne retient rien : run_task lance une tête au repos, comme avant
runChatTurn — un travail du fil court déjà (#453, #531) @cap:parler-a-un-agent/moteur deux tours SIMULTANÉS sur le même fil, par la file des routes : une tête, puis un tour de réponse PENDANT elle (revue Codex, P1)
runChatTurn — every final prose reply is re-read, once per turn (#600) @cap:parler-a-un-agent/moteur while work runs, prose that the re-read escalates starts a reply turn, re-read once only (#531)
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
runChatTurn — les étapes de préparation, dans l’ordre @cap:parler-a-un-agent/moteur un tour tapé (sans flux) : toutes les étapes, puis l’appel du fournisseur
runChatTurn — les étapes de préparation, dans l’ordre @cap:parler-a-un-agent/moteur le MÊME mécanisme par `playChatTurn`, tour tapé en flux : mêmes étapes, même ordre
runChatTurn — les étapes de préparation, dans l’ordre @cap:parler-a-un-agent/moteur un tour dit (`spoken`) : les mêmes étapes que le tour tapé
runChatTurn — les étapes de préparation, dans l’ordre @cap:parler-a-un-agent/moteur un agent qui n’est pas celui du fil : seul le départ est annoncé, aucune étape inventée
the effort of a spoken chat turn (#977) @cap:parler-a-un-agent/moteur a spoken turn and its recheck send "when spoken to" ('off'), a typed one Reasoning ('high')
the effort of a spoken chat turn (#977) @cap:parler-a-un-agent/moteur a spoken turn and its recheck send "when spoken to" ('low'), a typed one Reasoning (null)
the effort of a spoken chat turn (#977) @cap:parler-a-un-agent/moteur a spoken turn and its recheck send "when spoken to" (null), a typed one Reasoning ('off')
the effort of a spoken chat turn (#977) @cap:parler-a-un-agent/moteur a spoken turn and its recheck send "when spoken to" ('medium'), a typed one Reasoning ('max')
the effort of a spoken chat turn (#977) @cap:parler-a-un-agent/moteur the job a spoken turn launches keeps the agent’s Reasoning, and writes its result to be read
the transcription check @cap:parler-a-un-agent/moteur "OK", "Okay." and "O.K." are the probe; an unrelated text and nothing are not
the transcription check @cap:parler-a-un-agent/moteur PCM chunks become one WAV at their rate; a container is joined as it came; nothing is null
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
createReplySpeech @cap:parler-a-un-agent/moteur a voice that cannot stream: one file per sentence, in order, two at a time
createReplySpeech @cap:parler-a-un-agent/moteur a voice that streams: its bytes pass as they arrive, in the declared format, sentence after sentence
createReplySpeech @cap:parler-a-un-agent/moteur a failure stops the voice there, says why, and nothing after it is heard
createReplySpeech @cap:parler-a-un-agent/moteur reset drops what is not yet heard; the sentences said after it are heard
createReplySpeech @cap:parler-a-un-agent/moteur cancel: silence at once, and no further sentence is asked
createReplySpeech @cap:parler-a-un-agent/moteur a vendor that fails mid-sentence: that sentence ends, cut, and nothing follows
createReplySpeech @cap:parler-a-un-agent/moteur reset ends the half-said sentence, cut, before the next one; a complete one ends complete
createReplySpeech @cap:parler-a-un-agent/moteur cancel ends the sentence that was being said, cut; a sentence that said nothing has no end
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur the shared definition is exactly `--setting-sources user`, never project or local
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur runtime turn: the flag is in the argv, once, with `user` only, in every mode and shape
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur code_task (claude provider): the flag is in the argv, once, with `user` only, in every mode and shape
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur the flag comes from the one shared definition: the same adjacent pair in both argv
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur codex does not carry it: its project layer is skipped by --ignore-user-config, a different flag
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur a claude that does not know the flag fails the turn loudly, with its own message (invariant #4)
claude launched headless loads only the user settings (#628) @cap:parler-a-un-agent/moteur the by-hand probe asks the CLI for the same flag the product sends
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
spawnCliTurn — what the CLI leaves running belongs to its job (#750) @cap:parler-a-un-agent/moteur a detached process the CLI started outlives the turn, then dies when the scope closes
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
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
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a reply turn sees the running work, passes the person’s words on with message_conversation_run, and answers
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a relaunched head opens with the person's words alone in their message, then the relaying model's note under its frame
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a message already waiting when the head starts is in its FIRST request
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a message passed on DURING the head’s last call is read BEFORE concluding: one more request carries it, the result takes it into account, no second head
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a message passed on during a last call ending with return_result becomes a new head, woken at once
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a head opened with a note still gets its conversation’s history: fresh means nothing but its opening
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur a DELEGATE whose head has already finished, sent a message during a last call ending with return_result: a new head carries it, woken at once (review of #642, pass 2)
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur the NEXT turn of a channel conversation replays a message the work read, right after the request it concerned
a message while the work runs: the reply turn sees it and passes it on, the running work reads it (#531) @cap:parler-a-un-agent/moteur the NEXT turn replays the person’s words a relay passed on, never the note the relaying model wrote beside them
a tool call without a name @cap:parler-a-un-agent/moteur emitted with an empty name: the next request carries no nameless call, the model reads why, the job completes
a tool call without a name @cap:parler-a-un-agent/moteur emitted with an blank name: the next request carries no nameless call, the model reads why, the job completes
a tool call without a name @cap:parler-a-un-agent/moteur already in the persisted transcript of a resumed job: the request carries no nameless call
a prose turn of a job is its answer, in ONE request @cap:parler-a-un-agent/moteur a one-line knowledge question: the job completes with the answer, and the model received exactly one request
a prose turn of a job is its answer, in ONE request @cap:parler-a-un-agent/moteur an orchestrator answering in prose: the same, one request, no sub-agent started
a prose turn of a job is its answer, in ONE request @cap:parler-a-un-agent/moteur a delegation done, then reported in prose: delegated ONCE, and the report is the answer
a prose turn of a job is its answer, in ONE request @cap:parler-a-un-agent/moteur KNOWN LIMIT, now visible in the run: an announcement with no call ends completed with the announcement
resolveVoice @cap:parler-a-un-agent/moteur a new workspace speaks with the voice of before the setting, on its OpenRouter key and the provider transport
resolveVoice @cap:parler-a-un-agent/moteur speaks with the stored source, model and voice — and the next read sees a change, no restart
resolveVoice @cap:parler-a-un-agent/moteur a source with no key is said with its name, never another source in its place
resolveVoice @cap:parler-a-un-agent/moteur a key that cannot be decrypted is said as such, not as "no key"
resolveVoice @cap:parler-a-un-agent/moteur a missing setting row is said, never replaced by a voice
resolveVoice @cap:parler-a-un-agent/moteur a base URL stored with an OpenRouter key is where the speech goes
voiceChoices and voiceRefusal @cap:parler-a-un-agent/moteur each source says what it offers, or why it cannot; the list is kept one hour, a failure never
voiceChoices and voiceRefusal @cap:parler-a-un-agent/moteur a model the source does not serve, or a voice the model does not offer, is refused with its code
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
le résultat d’un job vient de SON tour, jamais de l’historique rejoué (#419) @cap:parler-a-un-agent/moteur un message remis PENDANT le run qui répète la tâche mot pour mot ne déplace pas le début du tour (#531)
the one reader of a tool outcome @cap:parler-a-un-agent/moteur the shapes the loop recognises, error codes included
the one reader of a tool outcome @cap:parler-a-un-agent/moteur the loop’s sibling-error guard reads through the same function, and no second reading exists
the announcement replay of #967 @cap:parler-a-un-agent/moteur records what each announcement does, counts the sentences that repeat, and writes nothing
the announcement replay of #967 @cap:parler-a-un-agent/moteur the same sentence in two runs of one job is counted within that job
the announcement replay of #967 @cap:parler-a-un-agent/moteur "in the chat for you to read" and "dans la conversation" count as saying where to read it
the announcement replay of #967 @cap:parler-a-un-agent/moteur the four replay-6 forms of "where to read it", and their French forms, are all counted
the announcement replay of #967 @cap:parler-a-un-agent/moteur a number is flagged in digits or in words, whatever the result says
the announcement replay of #967 @cap:parler-a-un-agent/moteur a call the model refuses is recorded as a failure, with no key in it
the announcement replay of #967 @cap:parler-a-un-agent/moteur a shared phrase is four words at least, read on words, not on punctuation
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
the voice turn route @cap:parler-a-un-agent/moteur a question: transcript, the agent’s reply, the reply spoken — the message stored as spoken, no job
the voice turn route @cap:parler-a-un-agent/moteur raw PCM with its announced rate is the same utterance: same bytes heard, same duration
the voice turn route @cap:parler-a-un-agent/moteur a task request: run_task launches a job that inherits the spoken rendering; its own prompt writes to be read
the voice turn route @cap:parler-a-un-agent/moteur the job a voice turn launches writes its autonomy rows at start, so its tool calls run (#917)
the voice turn route @cap:parler-a-un-agent/moteur the typed turn is unchanged: no spoken line, no duration, its job rendered as text
the voice turn route @cap:parler-a-un-agent/moteur nothing heard: a turn ended with no audio stores nothing and asks no vendor
the voice turn route @cap:parler-a-un-agent/moteur nothing heard: audio with no words in it stores nothing and starts no turn
the voice turn route @cap:parler-a-un-agent/moteur a transcription error is stated, with the vendor’s words, and stores nothing
the voice turn route @cap:parler-a-un-agent/moteur a chunk out of order is refused, never placed where it was guessed to go
the voice turn route @cap:parler-a-un-agent/moteur the start states a workspace with no speech key before anyone speaks
the voice turn route — the audio read is capped (review of #958, pass 1) @cap:parler-a-un-agent/moteur a chunked body larger than the turn may still accept is refused with 413, after reading no more than the limit plus one network chunk
the voice turn route — the audio read is capped (review of #958, pass 1) @cap:parler-a-un-agent/moteur a body exactly at the limit passes; one byte more on the next chunk is refused
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur the first speech event is written before the model has finished writing
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur chunks come out in the order of the sentences, even when a later one is ready first, two at a time
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur the recheck runs after the text, while the speech plays: it does not hold back the first speech event
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur the final event carries the job the recheck launched
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur a vendor that fails MID-SENTENCE: that sentence ends cut (`audio_end` complete false) before `done`
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur a speech failure mid-stream keeps the text, states the failure, and says nothing after it
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur Stop mid-stream ends the turn, stores what the typed Stop stores, and the voice falls silent
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur one timing line per turn, numbers only, never the words: the vendor’s first byte apart from its whole body
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur a secret read from /api/chat/live during the turn during a voice turn: masked for the live reader, for the voice, and stored intact
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur a secret read from /api/chat/live during the turn during a typed turn: masked for the live reader and the typed stream, stored intact
the voice turn route — the reply spoken as it is written (#943) @cap:parler-a-un-agent/moteur a secret in the reply is masked on every way out — the text, done, and what the voice SAYS — and stored intact
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur speaks with the stored source, model and voice, and a change made by the route applies to the next turn, no restart
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur a model that answers mp3 speaks mp3: each chunk carries its container, and every sentence ends complete
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur a listed voice that does not speak through the turn path is refused at Save with the vendor words; the row is unchanged
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur a vendor echoing the key it refused: masked in the Save refusal and in the turn
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur a voice the model does not offer is refused with a stated error, and the voice in force does not change
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur a missing Google key and an out-of-credit answer (402) are said as such; the reply stays written
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur reads the setting and what each source offers; a source without key says so
the voice turn speaks with the workspace voice (#969) @cap:parler-a-un-agent/moteur Play a sample speaks the caller sentence through the turn path: the stored voice, or the one on screen
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a voice-launched job yields one announcement, after its job.finished: the result stays written, the announcement is said
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur no channel is offered: even with a reachable Telegram, the announcement request names none
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a typed-chat job yields none: its job.finished is unchanged, no announcement, no voice
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a delegated job yields none, even when it carries the spoken rendering
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a spoken job that fails, is stopped, or ends with no result says nothing: the runner writes no words
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a workspace-wide listener (the dashboard shell, on any page) hears it: no conversation filter needed
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur nobody listening when the job finishes: nothing is written or synthesised, nothing is offered later
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur an announcement the model cannot write is said as such; nothing is spoken, the result stays
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur a secret in the announcement is masked in what the voice says; the row keeps it
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur the voice is read in its own workspace only, and an unknown one is refused, never guessed
a voice-launched job announces its end, out loud (#967) @cap:parler-a-un-agent/moteur one timing line per announcement, numbers and voice ids only, never the words
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur transcribes with the stored model, through /audio/transcriptions, and the timing line names it
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a transcription failure is stated to the client and logged with its code, the model and the vendor words
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur reads the transcription models OpenRouter serves next to the voices
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a model that writes down what the voice says is stored: the voice says "OK.", the model transcribes that audio
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a model that answers with an error is refused with its words; the row is unchanged
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a model that writes something else, or nothing, is refused with what it wrote; the row is unchanged
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a voice that cannot speak blocks the check, said as such, and nothing is accepted untested
the voice turn listens with the workspace ear (#976) @cap:parler-a-un-agent/moteur a model OpenRouter does not serve for transcription is refused before anything is said
a hand-off keeps the person’s words and the relaying model’s note apart @cap:parler-a-un-agent/moteur a note that adds nothing is no note: empty, blank, or the very words
a hand-off keeps the person’s words and the relaying model’s note apart @cap:parler-a-un-agent/moteur the opening: the words alone in their message, then the note under its frame, marked
a hand-off keeps the person’s words and the relaying model’s note apart @cap:parler-a-un-agent/moteur the same opening as one text, for a runtime that takes a single message
a hand-off keeps the person’s words and the relaying model’s note apart @cap:parler-a-un-agent/moteur a drained entry: the words marked as passed on, the note marked as a note, never the reverse
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur asks the chosen model for an SSE stream of AUDIO, with the voice and the key
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur emits the first chunk before the stream ends, then the rest in order, bytes untouched
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur carries a byte split between two events, so every chunk holds whole samples
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur a key without credit (402) is said as such, with Google’s words
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur a stream cut mid-event, an odd byte count and a stream with no audio are said
googleSpeechAdapter.synthesizeStream (#969) @cap:parler-a-un-agent/moteur refuses a voice Gemini does not offer before any request leaves
googleSpeechAdapter.listModels (#969) @cap:parler-a-un-agent/moteur lists the TTS models of Google’s models API, across pages, with the prebuilt voices
googleSpeechAdapter.listModels (#969) @cap:parler-a-un-agent/moteur a refused list is said with its code, never read as empty
openrouterSpeechAdapter.synthesizeStream (#943) @cap:parler-a-un-agent/moteur yields the first bytes before the answer ends, with the same request as the one-shot path
openrouterSpeechAdapter.synthesizeStream (#943) @cap:parler-a-un-agent/moteur a sample split across two network chunks is carried, never yielded in halves
openrouterSpeechAdapter.synthesizeStream (#943) @cap:parler-a-un-agent/moteur the rate is the answer’s, read from its content type, never assumed
openrouterSpeechAdapter.synthesizeStream (#943) @cap:parler-a-un-agent/moteur a stream cut mid-sample, an empty answer and a layout that is not mono are said, never played
openrouterSpeechAdapter.synthesizeStream (#943) @cap:parler-a-un-agent/moteur refuses empty text before any request leaves
openrouter transcription — the request on the wire @cap:parler-a-un-agent/moteur posts the named model and the audio in its container to /audio/transcriptions, and nothing else
openrouter transcription — the request on the wire @cap:parler-a-un-agent/moteur a request naming no model is refused before any call, never given one
openrouter transcription — the request on the wire @cap:parler-a-un-agent/moteur names each accepted container in OpenRouter’s format field, and only those
openrouter transcription — the request on the wire @cap:parler-a-un-agent/moteur honours the base URL stored with the key
openrouter transcription — the request on the wire @cap:parler-a-un-agent/moteur lists the transcription models OpenRouter serves
openrouter transcription — what each answer becomes @cap:parler-a-un-agent/moteur returns the transcript of a 200, trimmed, with how long it took
openrouter transcription — what each answer becomes @cap:parler-a-un-agent/moteur an HTTP error carries the status and the upstream words
openrouter transcription — what each answer becomes @cap:parler-a-un-agent/moteur a 200 with an empty transcript is nothing heard, never an empty turn
openrouter transcription — what each answer becomes @cap:parler-a-un-agent/moteur an unsupported container and empty audio are refused before any request leaves
the sentence chunker @cap:parler-a-un-agent/moteur cuts at full stops, question and exclamation marks, French spacing included
the sentence chunker @cap:parler-a-un-agent/moteur abbreviations do not end a sentence
the sentence chunker @cap:parler-a-un-agent/moteur decimals and times stay whole
the sentence chunker @cap:parler-a-un-agent/moteur ellipses: a pause before a lower-case word, an end before a capital
the sentence chunker @cap:parler-a-un-agent/moteur quotes and closing brackets after the full stop stay with their sentence
the sentence chunker @cap:parler-a-un-agent/moteur a final sentence with no full stop is given by flush, and only then
the sentence chunker @cap:parler-a-un-agent/moteur a line break ends a sentence; nothing without a letter or digit is spoken
the sentence chunker @cap:parler-a-un-agent/moteur a very long sentence is cut at a clause boundary, so the first sound never waits for it
vendor words are masked where they enter Nodal @cap:parler-a-un-agent/moteur OpenRouter echoing an sk-or- key in a 401: masked, in the file path and the stream
vendor words are masked where they enter Nodal @cap:parler-a-un-agent/moteur Google echoing an AIza key: masked, in the file path, the stream and the models list
vendor words are masked where they enter Nodal @cap:parler-a-un-agent/moteur MiniMax echoing a key: masked
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
231 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
les adresses de run passent par lib/run-page.ts (#501) @cap:suivre-execution/ecran aucun écran ne bâtit l’adresse d’une page de run lui-même
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
runSectionOf — un run appartient à la section de ce qui l’a lancé @cap:suivre-execution/ecran une automatisation (cron ou webhook) : Scheduled
runSectionOf — un run appartient à la section de ce qui l’a lancé @cap:suivre-execution/ecran une conversation, un canal, le serveur MCP : Work
runSectionOf — un run appartient à la section de ce qui l’a lancé @cap:suivre-execution/ecran l’adresse de chaque section allume bien cette section du rail
runSectionOf — un run appartient à la section de ce qui l’a lancé @cap:suivre-execution/ecran ouvrir un run sans savoir d’où il vient passe par la route qui décide
questionHref — où se répond une question (#465) @cap:suivre-execution/ecran une conversation : son fil
questionHref — où se répond une question (#465) @cap:suivre-execution/ecran sans conversation, null OU vide : la page du run qui l’a posée
questionHref — où se répond une question (#465) @cap:suivre-execution/ecran conversationOf : la même règle que la liste des conversations
la porte /runs/<id> n’allume jamais Scheduled (#501) @cap:suivre-execution/ecran ni la redirection, ni sa page d’erreur : le rail reste sur son repli, Work
aggregates never turn an unknown usage into 0 @cap:suivre-execution/ecran entity stats: the known part, and how many runs are not reported
aggregates never turn an unknown usage into 0 @cap:suivre-execution/ecran automation window: the unknown cost is counted apart and the headline says so
aggregates never turn an unknown usage into 0 @cap:suivre-execution/ecran space cost: a call without its token counts makes the token totals partial
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
the conversation follows the push stream (#944) @cap:suivre-execution/ecran listens to THIS conversation's events, through the web proxy
the conversation follows the push stream (#944) @cap:suivre-execution/ecran an approval.requested puts the card on screen at once, with no poll having run
the conversation follows the push stream (#944) @cap:suivre-execution/ecran an approval.resolved takes the card away once the rows say so
the conversation follows the push stream (#944) @cap:suivre-execution/ecran a job.finished, a job.failed or a resync re-reads the thread; ready does not
the conversation follows the push stream (#944) @cap:suivre-execution/ecran a replayed burst is read once, not once per event
the conversation follows the push stream (#944) @cap:suivre-execution/ecran leaving the conversation closes its stream
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
la bande du run en cours (#444) @cap:suivre-execution/ecran la bande dit le tour, ce qui s’écrit, le dernier morceau, et le budget face aux plafonds
la bande du run en cours (#444) @cap:suivre-execution/ecran un outil en cours de remplissage, et un appel qui n’a encore rien rendu
la bande du run en cours (#444) @cap:suivre-execution/ecran entre deux appels (un outil qui tourne), le budget seul, sans tour inventé
la bande du run en cours (#444) @cap:suivre-execution/ecran sans plafond de run, le budget se dit sans « / »
la bande du run en cours (#444) @cap:suivre-execution/ecran hors processing, rien : ni une progression restée en base, ni le budget
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 #444 — la bande du run en cours se pose SOUS l’en-tête pendant processing, et disparaît ensuite
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
/scheduled/<id> @cap:suivre-execution/ecran redirige vers /runs/<id>, qui range le run dans SA section
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
/runs/<id> @cap:suivre-execution/ecran la section se lit : la porte redirige vers elle
/runs/<id> @cap:suivre-execution/ecran la chaîne ne se lit pas : la page le dit, et ouvre quand même le run
/runs/<id> @cap:suivre-execution/ecran un run introuvable reste introuvable, sans lien
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
les portes des transitions poussées (#944) @cap:suivre-execution/moteur cancelJobs n'annule et n'annonce que les jobs que sa garde laisse passer
274 more
les portes des transitions poussées (#944) @cap:suivre-execution/moteur la garde de l'appelant (la prise du run, #566) s'ajoute à celle de la porte
les portes des transitions poussées (#944) @cap:suivre-execution/moteur expirePendingRequests et decidePendingRequest n'annoncent que ce qui a quitté `pending`
les portes des transitions poussées (#944) @cap:suivre-execution/moteur dans inTransaction : rien avant le COMMIT, tout après ; rien sur un ROLLBACK
les portes des transitions poussées (#944) @cap:suivre-execution/moteur un point de sauvegarde rejoint la transaction d'en dessous : une remise, à SON commit
les portes des transitions poussées (#944) @cap:suivre-execution/moteur dans une transaction que personne ne suit : aucun fait, `lost`
les portes des transitions poussées (#944) @cap:suivre-execution/moteur sans écouteur dans le processus, une porte écrit quand même et ne lève pas
migration 0117_agent_jobs_result_kind @cap:suivre-execution/moteur démarre un vrai Postgres et applique les VRAIES migrations
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
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur OpenRouter (the incident path) 65 536 output tokens under finish_reason 'tool_calls': refused, nothing returned to run
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur OpenRouter (the incident path) 65 536 output tokens under finish_reason 'stop': refused, nothing returned to run
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur OpenRouter (the incident path) 65 536 output tokens under finish_reason 'length': refused, nothing returned to run
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur OpenRouter (the incident path) a normal reply under the cap is returned with its call
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur OpenRouter (the incident path) a model with a lower ceiling is asked for its own (gemma: 16 384)
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur native Anthropic a model this SDK does not know gets the stated cap, not the SDK default of 4 096
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur native Anthropic with a thinking budget, the cap is sent untouched and judged: 64 000 under tool_use is refused
the output cap reaches the wire, and a reply that reaches it is refused @cap:suivre-execution/moteur native MiniMax (Anthropic-compatible, thinking injected) the cap is sent untouched above the thinking budget, and a reply that reaches it is refused
streamed turns ask for their usage on OpenAI-compatible endpoints @cap:suivre-execution/moteur openai-compatible: the request asks for usage, and the turn comes back judged
streamed turns ask for their usage on OpenAI-compatible endpoints @cap:suivre-execution/moteur moonshot: the request asks for usage, and the turn comes back judged
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur 16 384 on the key and two images: no cap drawn from the window, the request goes as on main
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur a window on the key alone states no cap: the output limit is not known (the 8 192 finding of 28/09)
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur a catalogued model with room for its cap states it, and a turn that reaches it is refused (#563)
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur a catalogued model whose estimated input leaves less than its cap states none, never a lower one
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur 100 000 CJK characters on deepseek-chat: no cap, the bound counts their 300 000 bytes
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur ASCII: 40 000 characters leave room for the cap, 100 000 do not (bytes = characters)
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur a PDF has no per-file ceiling: the bound is infinite and no cap is stated
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur streamText counts its tools in the bound
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur an image as bytes: no image has a universal ceiling, so no cap is stated
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur an image by URL: no image has a universal ceiling, so no cap is stated
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur an image sent as a file part: no image has a universal ceiling, so no cap is stated
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur one image among text: no cap, while the clocks still count its allowance
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur the caller's own cap is always stated and judged, whatever the estimate says
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur two images on a key window of 8 192: over the window on paper, the request still goes, with no cap drawn from the estimate
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur a conversation replaying ten images on 32k: over the window on paper, the request still goes, with no cap drawn from the estimate
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur seven tool screenshots on 32k: over the window on paper, the request still goes, with no cap drawn from the estimate
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur the server's own refusal of the window is still a context overflow
a known cap is stated only when the estimated input leaves room for it in the window @cap:suivre-execution/moteur native Anthropic beyond its window on paper: the request goes with the SDK default cap
a model whose limits are unknown is asked for no invented cap @cap:suivre-execution/moteur outside the catalog, no window on the key: no max_tokens on the wire
a model whose limits are unknown is asked for no invented cap @cap:suivre-execution/moteur native Anthropic outside the catalog: the SDK default, as before #563
a model whose limits are unknown is asked for no invented cap @cap:suivre-execution/moteur without a stated cap, a long reply is a turn like any other; 'length' still refuses it
a model whose limits are unknown is asked for no invented cap @cap:suivre-execution/moteur a caller's own cap is stated, and judged
a model whose limits are unknown is asked for no invented cap @cap:suivre-execution/moteur streamText and generateObject state none either
every request of the client states its output cap @cap:suivre-execution/moteur generateObject states the platform cap
every request of the client states its output cap @cap:suivre-execution/moteur generateObject counts its output schema in the bound
every request of the client states its output cap @cap:suivre-execution/moteur generateObject with output 'enum': its values count in the bound
every request of the client states its output cap @cap:suivre-execution/moteur generateObject with output 'array': its element schema counts
every request of the client states its output cap @cap:suivre-execution/moteur a forced toolChoice and a field the SDK may add tomorrow both count
every request of the client states its output cap @cap:suivre-execution/moteur generateObject whose prompt leaves less than the cap in the window states none
every request of the client states its output cap @cap:suivre-execution/moteur streamText states the platform cap, or the caller's when lower
every request of the client states its output cap @cap:suivre-execution/moteur a generateText that sends a prompt, not messages, has it counted against the window
every request of the client states its output cap @cap:suivre-execution/moteur a streamText prompt beyond the window on paper: the request goes, with no cap drawn from it
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
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur the request states the cap, one-shot and streamed
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur a caller's own cap is the one stated, and the one judged
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur reaching the cap under finishReason 'tool-calls' is refused, one-shot and streamed
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur reaching the cap under finishReason 'stop' is refused, one-shot and streamed
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur reaching the cap under finishReason 'length' is refused, one-shot and streamed
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur one token under the cap with a normal finish is a turn like any other
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur a model with a lower ceiling is asked for that, and judged on it
a turn that reaches the stated output cap is refused, whatever finishReason says @cap:suivre-execution/moteur under failover each link states its own cap and is judged on it
a caller's cap never raises the platform's @cap:suivre-execution/moteur a caller asking 131 072 states the platform cap, and a reply reaching it is refused
a caller's cap never raises the platform's @cap:suivre-execution/moteur a caller above a model's lower ceiling states that ceiling, and is judged on it
a turn whose output tokens are not reported is refused @cap:suivre-execution/moteur output tokens undefined: refused as output_usage_not_reported, one-shot and streamed, the count kept null
a turn whose output tokens are not reported is refused @cap:suivre-execution/moteur output tokens NaN: refused as output_usage_not_reported, one-shot and streamed, the count kept null
a turn whose output tokens are not reported is refused @cap:suivre-execution/moteur without output tokens, a 'length' finish is refused as cut, its count unknown
a turn whose output tokens are not reported is refused @cap:suivre-execution/moteur a call offering no tools is not a turn: returned as the provider sent it
a turn whose output tokens are not reported is refused @cap:suivre-execution/moteur a caller that only inspects gets the response as is
an unknown usage never becomes a number @cap:suivre-execution/moteur 0 output tokens on a reply that wrote tool calls is not a count: refused as not reported
an unknown usage never becomes a number @cap:suivre-execution/moteur no usage at all: refused, and neither count becomes 0, in the error or the row
an unknown usage never becomes a number @cap:suivre-execution/moteur 0 input tokens is not a count either: every request sends a prompt
an unknown usage never becomes a number @cap:suivre-execution/moteur a real count is kept as is: 1 200 out, 900 in
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur anthropic, one-shot: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur anthropic, streamed: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur openrouter, one-shot: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur openrouter, streamed: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur deepseek, streamed: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur mistral, one-shot: refused as output_usage_not_reported, its count null
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur minimax, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur openai, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur deepseek, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur mistral, streamed: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur groq, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur groq, streamed: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur google, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur ollama, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur openai-compatible, one-shot: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur openai-compatible, streamed: the turn comes back with its call, its output count unknown, never 0
a turn whose output count is missing is refused only where the provider always reports it @cap:suivre-execution/moteur moonshot, one-shot: the turn comes back with its call, its output count unknown, never 0
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
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur text counts its UTF-8 bytes: dense text is not averaged away
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur an image or a PDF has no universal ceiling, so the bound is infinite
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur tools count the bytes of their definitions; a schema not readable now makes it infinite
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur a schema that cannot be serialised makes the bound infinite instead of throwing
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur an output schema (generateObject) counts its bytes; unreadable, it is infinite
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur every argument counts but the transport and the callbacks; a value it cannot serialise is infinite
inputTokensUpperBound: never below what a tokenizer can make of the input @cap:suivre-execution/moteur a tool's functions stay local: execute does not make the bound infinite
architecture — une porte par transition poussée (#944) @cap:suivre-execution/moteur un job ne passe à un statut terminal que par une porte
architecture — une porte par transition poussée (#944) @cap:suivre-execution/moteur une demande ne quitte `pending` que par une porte
architecture — une porte par transition poussée (#944) @cap:suivre-execution/moteur chaque porte annonce chacune de ses écritures
architecture — une porte par transition poussée (#944) @cap:suivre-execution/moteur hors du runner, seuls les écrivains nommés passent une porte
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
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
un délégué en ligne annulé fait annuler son parent : UN job.finished pour le parent (#944) @cap:suivre-execution/moteur le parent est `cancelled` en base, et le flux le dit une fois
le bus des événements de job (#944) @cap:suivre-execution/moteur un abonné reçoit en direct les événements de son espace, et ceux-là seuls
le bus des événements de job (#944) @cap:suivre-execution/moteur chaque espace a son compteur : l'activité de B ne se lit pas dans les identifiants de A
le bus des événements de job (#944) @cap:suivre-execution/moteur un abonné d'une conversation ne reçoit que la sienne ; un abonné de l'espace reçoit tout
le bus des événements de job (#944) @cap:suivre-execution/moteur un abonnement neuf ne rejoue rien et rend l'identifiant du dernier événement
le bus des événements de job (#944) @cap:suivre-execution/moteur revenir avec le dernier identifiant vu rejoue ce qui a été manqué, dans l'ordre, et rien d'autre
le bus des événements de job (#944) @cap:suivre-execution/moteur revenir quand rien n'a été manqué rejoue une liste vide, pas un resync
le bus des événements de job (#944) @cap:suivre-execution/moteur un identifiant d'un AUTRE runner (redémarré) rend un resync, jamais rien
le bus des événements de job (#944) @cap:suivre-execution/moteur un identifiant illisible, ou en avance sur le bus, rend un resync
le bus des événements de job (#944) @cap:suivre-execution/moteur ce qui est sorti de la mémoire rend un resync : une reprise partielle serait un silence
le bus des événements de job (#944) @cap:suivre-execution/moteur la mémoire de B ne pousse pas celle de A dehors : la reprise d'un espace ne dépend pas d'un autre
le bus des événements de job (#944) @cap:suivre-execution/moteur un événement perdu (espace inconnu) dit resync à chaque espace, en direct ET en reprise
le bus des événements de job (#944) @cap:suivre-execution/moteur un abonné désinscrit ne reçoit plus rien, et un abonné qui lève ne prive pas les autres
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur un job lancé depuis une conversation : sa question, sa réponse et sa fin, un événement chacune, à la conversation
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur un job fini par la porte de succès pousse UN job.finished ; la porte rejouée ne pousse rien
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur la réponse poussée est masquée de ses secrets, pour tout client (SECRET-001)
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur un job en échec pousse UN job.failed, avec son code et la première ligne de son explication
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur une approbation demandée puis expirée : un approval.requested avec la raison de l'agent, puis un approval.resolved
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur la question d'un serveur MCP : un question.asked avec son message, puis un approval.resolved quand son job n'a plus de runner
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur revenir avec son dernier identifiant rejoue ce qui a été manqué ; un identifiant d'un autre runner rend un resync
le flux poussé des événements de job (#944) @cap:suivre-execution/moteur un client d'un autre espace ne reçoit rien, ni en direct ni en reprise
l'arrêt d'un run et la cascade passent par la porte des fins de job (#944, revue de #956) @cap:suivre-execution/moteur stop_conversation_run : un job.finished par job de l'arbre, un approval.resolved par question close
l'arrêt d'un run et la cascade passent par la porte des fins de job (#944, revue de #956) @cap:suivre-execution/moteur /stop d'un canal : poussé APRÈS le COMMIT de la transaction du message, et jamais sur un ROLLBACK
l'arrêt d'un run et la cascade passent par la porte des fins de job (#944, revue de #956) @cap:suivre-execution/moteur un enfant annulé fait annuler le parent qui l'attendait : UN job.finished pour le parent
l'arrêt d'un run et la cascade passent par la porte des fins de job (#944, revue de #956) @cap:suivre-execution/moteur une porte passée dans une transaction que personne ne suit : aucun fait, un resync
liveCallProgress — ce que la page du run lit pendant l’appel (#444) @cap:suivre-execution/moteur pose l’appel dès son début, puis ce que le flux a produit, au plus une fois par période, et NULL à la fin
compaction keys on the window of the model that serves, through a failover chain @cap:suivre-execution/moteur a large-window primary fails over to a small-window fallback: the request is compacted before it is sent
compaction keys on the window of the model that serves, through a failover chain @cap:suivre-execution/moteur once the fallback serves, the transcript itself is compacted before its next call
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
Stop arrête le travail PENDANT l’appel au modèle @cap:organiser-equipe/moteur Stop pendant l’écriture : le partiel devient le RÉSULTAT, et la progression en direct est effacée (#444) @cap:suivre-execution/moteur
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
a job turn that reaches the stated output cap does not act, whatever its finish @cap:suivre-execution/moteur finish 'tool-calls' at 65 536 output tokens: nothing executed, output_limit_reached
a job turn that reaches the stated output cap does not act, whatever its finish @cap:suivre-execution/moteur finish 'stop' at 65 536 output tokens: nothing executed, output_limit_reached
a job turn whose output tokens are not reported does not act @cap:suivre-execution/moteur finish tool-calls, no output tokens: nothing executed, output_usage_not_reported, unknown kept null
a job turn whose output tokens are not reported does not act @cap:suivre-execution/moteur finish 'length', no output tokens: output_limit_reached, the count said unknown
the job row never turns an unknown usage into a number @cap:suivre-execution/moteur no usage at all: refused, and every count and the cost are null on the row
the job row never turns an unknown usage into a number @cap:suivre-execution/moteur an accepted turn whose input is not reported: the output counts, the input total is unknown
the job row never turns an unknown usage into a number @cap:suivre-execution/moteur a job refused at the chain cap keeps the unknown totals its row carried
the server's refusal of the window still ends the job as context_window_exceeded @cap:suivre-execution/moteur a 400 "maximum context length" from the provider: failed with the actionable code
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
setJobStatus refuse un statut terminal à la compilation (#944) @cap:suivre-execution/moteur les statuts que setJobStatus accepte et ceux des portes ne se recouvrent pas
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
modelOutputCap @cap:suivre-execution/moteur a catalogued model gets the turn cap, native or routed
modelOutputCap @cap:suivre-execution/moteur a model whose limits are unknown gets no cap: neither in the catalog nor a window on the key
modelOutputCap @cap:suivre-execution/moteur a window on the key does not make the output limit known
modelOutputCap @cap:suivre-execution/moteur a model whose own ceiling is lower is asked for no more than it can write
modelOutputCap @cap:suivre-execution/moteur a recorded ceiling is only ever below the turn cap (a higher one would say nothing)
modelOutputCap @cap:suivre-execution/moteur every thinking budget stays below the cap, so no shim raises max_tokens past it
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é
GET /api/events @cap:suivre-execution/moteur demande au runner l'espace de la session, relaie la reprise, et rend son flux tel quel
GET /api/events @cap:suivre-execution/moteur le refus du runner passe avec son code (une conversation hors de l’espace : 404)
GET /api/events @cap:suivre-execution/moteur sans session, 401, et le runner n’est pas appelé
GET /api/events @cap:suivre-execution/moteur une conversation illisible est refusée avant le runner
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
resolveRunPageHrefAction — la section d’un run se lit sur sa tête (#501) @cap:suivre-execution/moteur un run de cron et un run de webhook s’ouvrent sous Scheduled
resolveRunPageHrefAction — la section d’un run se lit sur sa tête (#501) @cap:suivre-execution/moteur le délégué d’un run de cron s’ouvre sous Scheduled, sans déclencheur à lui
resolveRunPageHrefAction — la section d’un run se lit sur sa tête (#501) @cap:suivre-execution/moteur un run de conversation, son délégué et un run MCP s’ouvrent sous Work
resolveRunPageHrefAction — la section d’un run se lit sur sa tête (#501) @cap:suivre-execution/moteur un run qui n’existe pas : not_found, jamais une adresse devinée
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
154 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
runChatTurn — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur deux jours de conversation : chaque message de la personne porte son jour et son heure, le tour courant aussi
runChatTurn — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur le tour suivant rejoue les tours passés au caractère près : le préfixe ne bouge pas
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur job path, claude-code: an UNMARKED session starts fresh, and the new session is stored marked
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur job path, codex: an UNMARKED session starts fresh, and the new session is stored marked
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur job path, claude-code: a MARKED session is resumed as before
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur job path, codex: a MARKED session is resumed as before
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur chat path, claude-code: an UNMARKED session starts fresh, and the new session is stored marked
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur chat path, codex: an UNMARKED session starts fresh, and the new session is stored marked
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur chat path, claude-code: a MARKED session is resumed as before
a CLI session opened before the handle boundary is never resumed (#824) @cap:reprendre-conversation/moteur chat path, codex: a MARKED session is resumed as before
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 — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur telegram : deux jours de conversation, chaque demande porte son jour et son heure, dans le fuseau de la personne
loadThreadHistory — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur whatsapp : deux jours de conversation, chaque demande porte son jour et son heure, dans le fuseau de la personne
loadThreadHistory — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur le même historique lu dans un autre fuseau donne une autre heure : le fuseau vient de l’appelant
loadThreadHistory — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur un tour de quelques minutes porte sa date lui aussi : pas de cas « aujourd’hui »
loadThreadHistory — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur un message remis pendant le travail (#531) porte l’heure où il est arrivé, pas celle de la demande
loadThreadHistory — chaque tour rejoué porte sa date (#650) @cap:reprendre-conversation/moteur deux constructions du même historique donnent le même texte, au caractère près
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
Settings → Devices: pair, confirm, remove @cap:parler-par-canal-externe/ecran a scripted device pairs, gets its key once, and loses it when removed
A — allowlist renders: owner badged, pending has Approve/Deny, member has Revoke @cap:parler-par-canal-externe/ecran
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran the feed of a run: tool input, Sent card and delivery notice read the real conversation
30 more
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran the page of a run reads the real conversation the same way
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran the Code tab detail of a process: its tool calls read the real conversation
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran an approval card shows the conversation the model named
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran the Channels allowlist shows the OWNER who asked: the address the model never reads
the dashboard shows the conversation a handle names @cap:parler-par-canal-externe/ecran the STORED rows keep what the model wrote — the runner re-reads them
Settings → Devices, as the runner answers it @cap:parler-par-canal-externe/ecran a single-user install: the request is listed, and the pill counts it
Settings → Devices, as the runner answers it @cap:parler-par-canal-externe/ecran a multi-user install: no request, the reason in one line, and a pill at 0
Settings → Devices, as the runner answers it @cap:parler-par-canal-externe/ecran any other refusal is said, never shown as an empty list
a device’s conversation is read from its chat messages (#945) @cap:parler-par-canal-externe/ecran its turns are the messages, each request made on the device
a device’s conversation is read from its chat messages (#945) @cap:parler-par-canal-externe/ecran the chat menu files it under the Device folder
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
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 relaunched successor head is part of the trial run @cap:parler-par-canal-externe/moteur while it lives the trial waits, then the trial is green, its facts include it, and get_task agrees
conversation handles @cap:parler-par-canal-externe/moteur a handle has the opaque form and carries nothing of the id
conversation handles @cap:parler-par-canal-externe/moteur the same conversation gives the same handle, every call — never a second row
512 more
conversation handles @cap:parler-par-canal-externe/moteur is random, never derived: the same id in two entities gives two handles
conversation handles @cap:parler-par-canal-externe/moteur the channel is part of the key: one id on two channels is two conversations
conversation handles @cap:parler-par-canal-externe/moteur survives a deleted and recreated allowlist row
conversation handles @cap:parler-par-canal-externe/moteur a concurrent get-or-create gives ONE row, and every caller reads it
conversation handles @cap:parler-par-canal-externe/moteur a batch names each conversation once, mixing known and new ones
conversation handles @cap:parler-par-canal-externe/moteur a handle of another entity names nothing here
conversation handles @cap:parler-par-canal-externe/moteur refuses to name a conversation without an entity — loud, never a handle out of nowhere
conversation handles @cap:parler-par-canal-externe/moteur a person reads the real conversation where a model read the handle, in its entity only
conversation handles @cap:parler-par-canal-externe/moteur the database keeps the form: a row that is not a handle is refused
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur every id the entity knows — allowlists, pending requests, discovered conversations — becomes its handle
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur only a WHOLE id: a longer number, a negative one, an id inside a JID stay as they are
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur another entity's conversation, an unknown id, a provider signature: untouched
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur an id known on two channels says nothing of which one: left as it is
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur nothing known in the workspace: the value comes back as it is
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur no workspace on the text: derived from its agent, at the one place the scope is built
stored text reaches the model with handles, never the ids @cap:parler-par-canal-externe/moteur no workspace even through its agent: refused, loud — never sent raw, never another workspace
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur nothing alive in the conversation: the message starts a head, as before
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is pending: the message starts a REPLY TURN answering while it, and nothing lands in its inbox
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is processing: the message starts a REPLY TURN answering while it, and nothing lands in its inbox
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is awaiting_approval: the message starts a REPLY TURN answering while it, and nothing lands in its inbox
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is awaiting_delegation: the message starts a REPLY TURN answering while it, and nothing lands in its inbox
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is completed holds nothing back: the next message starts a head at rest
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is failed holds nothing back: the next message starts a head at rest
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a head that is cancelled holds nothing back: the next message starts a head at rest
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a row WITHOUT a status is alive for no path (no writer sets one): the message starts a head at rest (review of #642, pass 1)
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur no runaway: messages during a reply turn start one reply turn EACH, and a reply turn starts nothing by itself
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a live DELEGATE under a finished head is work running too: the message starts a reply turn answering while it (review of #642, pass 2)
startConversationTurn — a message while the work runs starts a reply turn @cap:parler-par-canal-externe/moteur a live head of ANOTHER conversation holds nothing back
deliverToConversationJob — what a reply turn hands to the running work @cap:parler-par-canal-externe/moteur writes into the inbox of a live head, and of a live delegate
deliverToConversationJob — what a reply turn hands to the running work @cap:parler-par-canal-externe/moteur refuses a finished job and a job of another conversation: nothing is written
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur what remains in the inbox of a head that becomes completed: a new pending head carries the first message, its inbox the rest
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur what remains in the inbox of a head that becomes failed: a new pending head carries the first message, its inbox the rest
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur what remains in the inbox of a head that becomes cancelled: a new pending head carries the first message, its inbox the rest
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur the relaunched head carries the person's words as its task and the relaying model's note apart, never merged (migration 0151)
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur the relaunched head is received as its root was: read, or heard after a voice turn (migration 0157)
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a drained entry gives the person's words, marked as passed on, then the relaying model's note under its frame — two messages
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a delegate that finishes before reading its inbox gives birth to nothing: its parent reads the message on its next turn
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a message passed to a delegate whose head has ALREADY finished is never stranded: when the delegate ends, a new head carries it (review of #642, pass 2)
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a delegate that ends under a live parent that then ends without reading: the parent’s end relaunches it (no file stays on a terminal job)
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a live head reads what its FINISHED descendants, at any depth, left in their inbox
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a non-terminal transition keeps the inbox where it is (suspension, resume)
what remains in an inbox when its job finishes is never lost (trigger, migration 0141) @cap:parler-par-canal-externe/moteur a head that finishes with an empty inbox gives birth to nothing
the stop the person asks for empties the inbox without relaunching it @cap:parler-par-canal-externe/moteur cancelJobTree: the head is cancelled, no head is born, and the discarded messages are returned
the stop the person asks for empties the inbox without relaunching it @cap:parler-par-canal-externe/moteur stopping a head also discards what a FINISHED delegate left for it: nothing is relaunched after the stop (review of #642, pass 2)
the stop the person asks for empties the inbox without relaunching it @cap:parler-par-canal-externe/moteur stopping a head that has just finished also stops the head its inbox relaunched: the same work (review of #642, pass 1)
drainJobInbox — only the run that holds the job reads its inbox @cap:parler-par-canal-externe/moteur under its claim: returns the messages marked as delivered, empties the inbox, appends them to the transcript
drainJobInbox — only the run that holds the job reads its inbox @cap:parler-par-canal-externe/moteur under a claim another run has taken since: reads nothing, the inbox stays for the run that holds it
a job's chat id is never read without its channel (#649) @cap:parler-par-canal-externe/moteur every read of a chat id sits next to its channel, or is listed as addressing no platform
a job's chat id is never read without its channel (#649) @cap:parler-par-canal-externe/moteur the list holds no stale entry: each one is still a read the scan finds
a job's chat id is never read without its channel (#649) @cap:parler-par-canal-externe/moteur the scan catches the shapes #649 was made of, and lets a paired read through
an owner chat goes out on the channel it was resolved on (#649) @cap:parler-par-canal-externe/moteur every owner lookup is paired with the send or designation on its channel, or listed
an owner chat goes out on the channel it was resolved on (#649) @cap:parler-par-canal-externe/moteur the list holds no stale entry
an owner chat goes out on the channel it was resolved on (#649) @cap:parler-par-canal-externe/moteur the scan catches the shape of pass 5, and lets a paired lookup through
a job row gets its chat only through designateChat (#649) @cap:parler-par-canal-externe/moteur no writer in the source sets chatId by hand
a job row gets its chat only through designateChat (#649) @cap:parler-par-canal-externe/moteur the scan catches the shapes a writer used, and lets designated chats through
a job row gets its chat only through designateChat (#649) @cap:parler-par-canal-externe/moteur the inbox relaunch trigger copies the chat WITH its channel, in the migrations and the test schema
designateChat / resolveScheduleNotifyChat @cap:parler-par-canal-externe/moteur designateChat: the channel travels with the chat, and only with one
designateChat / resolveScheduleNotifyChat @cap:parler-par-canal-externe/moteur a routine: owner resolved on a channel → that channel; explicit id on auto → no channel; silent → nothing
designateChat / resolveScheduleNotifyChat @cap:parler-par-canal-externe/moteur auto with no Telegram owner: no chat, not a guess on another channel
the job statuses written in the SQL of the end-of-job trigger are the enumeration’s @cap:parler-par-canal-externe/moteur the migration (0141_job_inbox.sql)
the job statuses written in the SQL of the end-of-job trigger are the enumeration’s @cap:parler-par-canal-externe/moteur the inline SQL of the test database (helpers.ts), which mirrors it
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
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur creates the table with its unique key on (entity, channel, conversation) and its form check
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur two connections racing on one conversation leave ONE row, and both read it
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur moves the WhatsApp names that were a JID to requester_address — nothing destroyed — and leaves real names alone
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur clears the vector of a memory that quotes a known conversation, so the backfill re-embeds it through the boundary
migration 0152_conversation_handles @cap:parler-par-canal-externe/moteur marks CLI sessions: every session stored before the boundary is unmarked, so it is never resumed
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the real migrations
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 1. the terminal write holds the head when a message arrives: the message waits, then starts a head at rest
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 2. a forward holds the head when the run finishes: the terminal write waits, then the trigger relaunches the message
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 3. a message arriving while the head relaunches a NON-empty inbox: a reply turn answering the relaunched head, never a second head at rest (review of #642, pass 1)
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 4. /stop while the head finishes WITH a waiting message: nothing is left running, and the message is reported discarded
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 5. two messages at the same time on an idle conversation: ONE head at rest, and a reply turn answering while it
the writers that decide a head of the conversation serialize @cap:parler-par-canal-externe/moteur 6. a delegate ends with a waiting message WHILE its head ends: the message is carried by a new head, never stranded on a terminal job (review of #642, pass 2)
migration 0163_device_channel @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the REAL migrations
migration 0163_device_channel @cap:parler-par-canal-externe/moteur records the migration in the journal drizzle-kit reads, after 0162
migration 0163_device_channel @cap:parler-par-canal-externe/moteur creates devices: a workspace, a name, declared capabilities, created and last-seen times
migration 0163_device_channel @cap:parler-par-canal-externe/moteur agent_jobs.channel accepts device, still refuses an unknown channel
migration 0163_device_channel @cap:parler-par-canal-externe/moteur conversations.channel accepts device, still refuses an unknown channel
migration 0163_device_channel @cap:parler-par-canal-externe/moteur approval_card_messages.channel accepts device, still refuses an unknown channel
migration 0163_device_channel @cap:parler-par-canal-externe/moteur leaves device out where a device has no place: the outbox, bindings, allowlists, notify channels
migration 0164_device_pairing @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the REAL migrations
migration 0164_device_pairing @cap:parler-par-canal-externe/moteur records the migration in the journal drizzle-kit reads, after 0163
migration 0164_device_pairing @cap:parler-par-canal-externe/moteur gives devices a key hash, unique, a removal time and the address it paired from
migration 0164_device_pairing @cap:parler-par-canal-externe/moteur device_pairings: a waiting request belongs to no workspace; its rules are checked
migration 0164_device_pairing @cap:parler-par-canal-externe/moteur a confirmed request names its workspace, its device and its conversation; a waiting one names none
migration 0143_job_chat_channel @cap:parler-par-canal-externe/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0143_job_chat_channel @cap:parler-par-canal-externe/moteur 0142 then 0143 both ran: the journal orders them, and the migrator skips none
migration 0143_job_chat_channel @cap:parler-par-canal-externe/moteur the backfill gives a chat the channel it was resolved on, and NULL when nothing says it
migration 0143_job_chat_channel @cap:parler-par-canal-externe/moteur the inbox relaunch copies the head chat with its channel
every channel is classified, and has its adapter @cap:parler-par-canal-externe/moteur each kind of CHANNEL_REACH resolves to its own adapter
a device is answered on, never pushed to (#945) @cap:parler-par-canal-externe/moteur a request made on a device is answered there
a device is answered on, never pushed to (#945) @cap:parler-par-canal-externe/moteur it is not a messaging platform: a push falls back to the agent’s messaging channel
a device is answered on, never pushed to (#945) @cap:parler-par-canal-externe/moteur a send tool on a job asked from a device writes where a dashboard job’s does
the device adapter hands its sends to the bound sink @cap:parler-par-canal-externe/moteur without a sink, a send fails loud
the device adapter hands its sends to the bound sink @cap:parler-par-canal-externe/moteur a send names its workspace, or is refused
the device adapter hands its sends to the bound sink @cap:parler-par-canal-externe/moteur text, cards and a settled card reach the sink, addressed to the device of the workspace
the device adapter hands its sends to the bound sink @cap:parler-par-canal-externe/moteur what a device cannot receive is refused, never cut
Discord adapter on the wire @cap:parler-par-canal-externe/moteur sendText POSTs the content with the bot auth header and a mass-ping-proof allowed_mentions
Discord adapter on the wire @cap:parler-par-canal-externe/moteur sendText splits a long text into several POSTs, in order
Discord adapter on the wire @cap:parler-par-canal-externe/moteur sendCard POSTs one action row per button row, buttons carrying label and custom_id, nobody pinged
Discord adapter on the wire @cap:parler-par-canal-externe/moteur editMessageText PATCHes the message and removes the buttons when none are given
Discord adapter on the wire @cap:parler-par-canal-externe/moteur editMessageText rewrites the buttons it is given
Discord adapter on the wire @cap:parler-par-canal-externe/moteur a Discord 4xx JSON error comes out as a send_failed DeliveryError with status, code and message, token redacted
Discord adapter on the wire @cap:parler-par-canal-externe/moteur a failed edit is reported, never thrown
Discord adapter on the wire @cap:parler-par-canal-externe/moteur a 429 with retry-after is waited out by the SDK and the same payload is re-sent
Discord adapter on the wire @cap:parler-par-canal-externe/moteur validateCredentials GETs /users/@me and maps 401 to discord_invalid_token
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
WhatsApp library loading @cap:parler-par-canal-externe/moteur the delivery package loads, and serves the other channels, without the WhatsApp library
WhatsApp library loading @cap:parler-par-canal-externe/moteur opening a socket without the library ends "closed" with a coded error naming the library
the built client file @cap:parler-par-canal-externe/moteur is one .mjs and one .d.ts that import nothing, and the .d.ts names every protocol event
the built client file @cap:parler-par-canal-externe/moteur the built file pairs and hears a card, as the source does
readSse: the event stream format @cap:parler-par-canal-externe/moteur reads events split anywhere, CRLF included, with comments, multi-line data and resume ids
pair(): from the device side @cap:parler-par-canal-externe/moteur asks with its name, capabilities and protocol version, then waits for the owner and gets its session
pair(): from the device side @cap:parler-par-canal-externe/moteur slows down when told to, and waits the interval Nodal gives
pair(): from the device side @cap:parler-par-canal-externe/moteur a refused pairing throws `refused` and yields no session
pair(): from the device side @cap:parler-par-canal-externe/moteur an expired code throws `expired`
pair(): from the device side @cap:parler-par-canal-externe/moteur a rate-limited request says so, with Nodal’s status
connect(): the event stream @cap:parler-par-canal-externe/moteur hands each protocol event to its handler, with the token on the request
connect(): the event stream @cap:parler-par-canal-externe/moteur reconnects by itself after a network drop and replays the card it missed, from its last event id
connect(): the event stream @cap:parler-par-canal-externe/moteur a stream that goes silent (no ping) is reopened; a ping keeps it
connect(): the event stream @cap:parler-par-canal-externe/moteur passes `resync` on: what was missed must be re-read
connect(): the event stream @cap:parler-par-canal-externe/moteur a refused token ends the session with `revoked`: no retry, and every gesture after says so
connect(): the event stream @cap:parler-par-canal-externe/moteur a 401 on a gesture ends the session too
say(): one spoken turn, its voice as speech events @cap:parler-par-canal-externe/moteur uploads the audio in order, then hands the reply’s voice over as speech events, and resolves with the turn
say(): one spoken turn, its voice as speech events @cap:parler-par-canal-externe/moteur PCM announces its sample rate; nothing heard resolves with no transcript and no voice
say(): one spoken turn, its voice as speech events @cap:parler-par-canal-externe/moteur a turn refused before its stream, or failed during it, throws with Nodal’s code
the other gestures @cap:parler-par-canal-externe/moteur send, answer, cancel and the announcement’s voice reach the routes of the protocol, with their bodies
the other gestures @cap:parler-par-canal-externe/moteur cancel() during the upload deletes the open voice turn
every failure is a NodalDeviceError, the network’s included (review of #1013) @cap:parler-par-canal-externe/moteur a Nodal that cannot be reached: `network`, with the original error as its cause
every failure is a NodalDeviceError, the network’s included (review of #1013) @cap:parler-par-canal-externe/moteur a poll that loses the network while the owner decides: `network`, not a raw TypeError
every failure is a NodalDeviceError, the network’s included (review of #1013) @cap:parler-par-canal-externe/moteur a turn whose stream is cut midway: `stream_cut`
every failure is a NodalDeviceError, the network’s included (review of #1013) @cap:parler-par-canal-externe/moteur close() during a turn: the turn fails with `closed`
a run’s state is never shown older than it is (seq, #1005) @cap:parler-par-canal-externe/moteur a state older than the last one shown for its run is dropped; other runs are their own
a run’s state is never shown older than it is (seq, #1005) @cap:parler-par-canal-externe/moteur a stream opened without a resume id replays nothing: a lower seq is shown after it
a run’s state is never shown older than it is (seq, #1005) @cap:parler-par-canal-externe/moteur after a resync (a restarted runner counts from 1 again), a lower seq is shown
the generated protocol @cap:parler-par-canal-externe/moteur is the protocol module, as generated now (run `pnpm --filter @nodal-agents/device-client gen`)
the Connect a device page @cap:parler-par-canal-externe/moteur documents every event of the protocol, in the events table
the Connect a device page @cap:parler-par-canal-externe/moteur documents every gesture and every route of the protocol
the Connect a device page @cap:parler-par-canal-externe/moteur names every capability a device can declare, and shows THE 20-line example, from its one source
the Connect a device page @cap:parler-par-canal-externe/moteur never answers a card without the person’s choice: not the snippet, not the reference client
get_task rend à l’appelant la réponse de son job @cap:parler-par-canal-externe/moteur le serveur expose run_task et get_task, et get_task se dit en lecture seule
get_task rend à l’appelant la réponse de son job @cap:parler-par-canal-externe/moteur un job créé par run_task, puis fini, rend son vrai résultat
get_task rend à l’appelant la réponse de son job @cap:parler-par-canal-externe/moteur un échec rend le statut et l’erreur de la ligne
get_task rend à l’appelant la réponse de son job @cap:parler-par-canal-externe/moteur un délégué qui court encore garde le run « running », même quand la tête est terminée
get_task rend à l’appelant la réponse de son job @cap:parler-par-canal-externe/moteur une approbation en attente dans un délégué est rapportée, avec ce qu’elle demande
get_task ne lit que les jobs MCP de son workspace @cap:parler-par-canal-externe/moteur un job d’un autre workspace, un job d’un autre canal et un id inconnu : le MÊME refus, octet pour octet
get_task ne lit que les jobs MCP de son workspace @cap:parler-par-canal-externe/moteur get_task ne compte pas dans le plafond de jobs en cours (#498), et n’en crée aucun
get_task ne lit que les jobs MCP de son workspace @cap:parler-par-canal-externe/moteur couper l’interrupteur coupe aussi la lecture d’un client déjà connecté
get_task ne lit que les jobs MCP de son workspace @cap:parler-par-canal-externe/moteur refuse une attente au-delà de 60 s
waitSeconds : une attente bornée @cap:parler-par-canal-externe/moteur rend dès que le job finit, bien avant la fin de l’attente
waitSeconds : une attente bornée @cap:parler-par-canal-externe/moteur rend dès qu’une personne est attendue
waitSeconds : une attente bornée @cap:parler-par-canal-externe/moteur rend à la fin de l’attente quand rien ne bouge, avec l’état courant
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
the "Work running in this conversation" block @cap:parler-par-canal-externe/moteur renders the running work from typed facts, and the moves with the tools that make them
the "Work running in this conversation" block @cap:parler-par-canal-externe/moteur a task is clipped, and a line break in it cannot forge a section
the "Work running in this conversation" block @cap:parler-par-canal-externe/moteur at the cap (3 runs × 3 delegates, long tasks) the block stays bounded, and the rest is counted
the "Work running in this conversation" block @cap:parler-par-canal-externe/moteur without Nodal tools (a CLI runtime) the block says what runs and that /stop stops it, and offers no tool it does not have
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a request with no chat to answer on: the reply is the result, the send tool is a separate message to the owner (#649) @cap:parler-par-canal-externe/moteur
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the line names the target the send tool computes: the chat named for this job, never "your owner" when it is not (#649) @cap:parler-par-canal-externe/moteur
personForModel — participant de groupe @cap:parler-par-canal-externe/moteur un nom forgé brut ne sort jamais de sa ligne
personForModel — participant de groupe @cap:parler-par-canal-externe/moteur le pseudo est assaini comme le nom
personForModel — participant de groupe @cap:parler-par-canal-externe/moteur un nom vide est dit Someone, un pseudo vide n’est pas écrit
pruneJobMediaFiles — a received file outlives a shorter retention @cap:parler-par-canal-externe/moteur keeps the inbox entries of a pruned job still within 30 days, removes the older ones and the tools images
/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 message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram the head is processing: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram the head is awaiting_delegation: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram the head is awaiting_approval: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram the head is pending: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram only a DELEGATE still runs (its head has finished): that is work running too, the message starts a reply turn answering while it (review of #642, pass 2)
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram nothing runs in the thread: the message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram the head has finished: the next message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram `/stop` stops the work AND the reply turns started during it
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on telegram `/new` while the work runs: a new conversation, where the message starts a head at rest
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord the head is processing: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord the head is awaiting_delegation: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord the head is awaiting_approval: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord the head is pending: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord only a DELEGATE still runs (its head has finished): that is work running too, the message starts a reply turn answering while it (review of #642, pass 2)
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord nothing runs in the thread: the message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord the head has finished: the next message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord `/stop` stops the work AND the reply turns started during it
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on discord `/new` while the work runs: a new conversation, where the message starts a head at rest
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack the head is processing: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack the head is awaiting_delegation: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack the head is awaiting_approval: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack the head is pending: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack only a DELEGATE still runs (its head has finished): that is work running too, the message starts a reply turn answering while it (review of #642, pass 2)
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack nothing runs in the thread: the message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack the head has finished: the next message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack `/stop` stops the work AND the reply turns started during it
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on slack `/new` while the work runs: a new conversation, where the message starts a head at rest
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp the head is processing: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp the head is awaiting_delegation: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp the head is awaiting_approval: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp the head is pending: the message starts a reply turn answering while it, and the running work is untouched
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp only a DELEGATE still runs (its head has finished): that is work running too, the message starts a reply turn answering while it (review of #642, pass 2)
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp nothing runs in the thread: the message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp the head has finished: the next message starts a head at rest, as before
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp `/stop` stops the work AND the reply turns started during it
a message sent while the work runs starts a reply turn that sees it, and is never put in that work by itself (#531) @cap:parler-par-canal-externe/moteur on whatsapp `/new` while the work runs: a new conversation, where the message starts a head at rest
a reply turn on a channel passes the person’s words on as typed, its own text as its note @cap:parler-par-canal-externe/moteur telegram: the running work reads the typed correction verbatim, then the reply turn’s note under its frame
a reply turn on a channel passes the person’s words on as typed, its own text as its note @cap:parler-par-canal-externe/moteur discord: the running work reads the typed correction verbatim, then the reply turn’s note under its frame
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
a CLI turn reads conversations by their handle (#824) @cap:parler-par-canal-externe/moteur claude-code: the task and the system prompt (its memory) carry the handle, never the WhatsApp id
a CLI turn reads conversations by their handle (#824) @cap:parler-par-canal-externe/moteur codex: the task and the system prompt (its memory) carry the handle, never the WhatsApp id
a CLI turn reads conversations by their handle (#824) @cap:parler-par-canal-externe/moteur a job with no workspace of its own (an internal /api/agent caller): its agent gives it one
a CLI turn reads conversations by their handle (#824) @cap:parler-par-canal-externe/moteur every launch of a CLI turn goes through the boundary — the job path AND the chat path
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur claude-code: a message written during the CLI turn is not in that turn, and becomes the next head when the job ends
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur codex: a message written during the CLI turn is not in that turn, and becomes the next head when the job ends
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur claude-code: the relaunched head's CLI turn reads the person's words, then the relaying model's note under its frame
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur codex: the relaunched head's CLI turn reads the person's words, then the relaying model's note under its frame
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur claude-code DELEGATE under a head that has ALREADY finished: a message passed on during its turn is carried by a new head when it ends, never stranded (review of #642, pass 2)
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur codex DELEGATE under a head that has ALREADY finished: a message passed on during its turn is carried by a new head when it ends, never stranded (review of #642, pass 2)
a job served by a CLI reads its inbox AFTER its turn, through a new head (#531) @cap:parler-par-canal-externe/moteur a REPLY TURN served by a CLI gets the running work in its prompt, on the CLI surface (no Nodal tool offered)
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
the push stream, with devices listening (#945) @cap:parler-par-canal-externe/moteur a device hears its own requests and what is addressed to it; the dashboard never hears a gesture
the push stream, with devices listening (#945) @cap:parler-par-canal-externe/moteur counts a device as a listener of its own requests only
the push stream, with devices listening (#945) @cap:parler-par-canal-externe/moteur a device that comes back is replayed its events, and only its own
what a device hears of a job’s life, from the bus (#945) @cap:parler-par-canal-externe/moteur the root’s reply as a bubble; a delegate’s end, a cancelled or empty end: no bubble
what a device hears of a job’s life, from the bus (#945) @cap:parler-par-canal-externe/moteur where the run stands is not guessed from one job’s event: it is pushed as the run’s state
a device gets its conversation with the root (#945) @cap:parler-par-canal-externe/moteur the conversation is the device’s thread: channel device, its id, the root agent; fresh opens a new one
a device gets its conversation with the root (#945) @cap:parler-par-canal-externe/moteur a device acts only as ITSELF, with its own key; the worker secret and a session are refused (#946)
a job launched by voice from a device ends on that device (#945) @cap:parler-par-canal-externe/moteur its reply, its state and its announcement reach device A; nothing reaches device B
a job launched by voice from a device ends on that device (#945) @cap:parler-par-canal-externe/moteur a delegate that asks: the state is the RUN’s, under the job the request launched
a job launched by voice from a device ends on that device (#945) @cap:parler-par-canal-externe/moteur a failed end carries its reason, as stored, and its deliverables
a job launched by voice from a device ends on that device (#945) @cap:parler-par-canal-externe/moteur with only another device listening, nothing is said
a device of workspace X never receives an event of workspace Y (#945) @cap:parler-par-canal-externe/moteur a job of Y whose chat names device A asks its question: nothing reaches device A
a device of workspace X never receives an event of workspace Y (#945) @cap:parler-par-canal-externe/moteur the device adapter refuses to send to a device outside the workspace it is told
every gesture of the protocol is a route of the runner (#945) @cap:parler-par-canal-externe/moteur DEVICE_GESTURES names only routes the app serves
the reference device client, end to end on the real runner (#947) @cap:parler-par-canal-externe/moteur pairs, says a recorded question, answers the card of the task it launched, and writes the reply’s voice
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur asks for a code, waits, is confirmed, and collects its key ONCE; only hashes are kept
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur a wrong code is refused, and so is an expired one; an expired request cannot be confirmed
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur polling faster than the interval is slow_down, and does not reset the clock
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur a refused request never yields a key, and creates no device
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur two polls racing for a confirmed request: exactly one collects the key
a device pairs from its own side (#946) @cap:parler-par-canal-externe/moteur the name is kept as the text it is, markup included, and never longer than 60
a device key reaches its own routes and conversations, and nothing else (#946) @cap:parler-par-canal-externe/moteur its own stream and conversation; never another device, another conversation, or a non-device route
a device key reaches its own routes and conversations, and nothing else (#946) @cap:parler-par-canal-externe/moteur the worker secret, a session and local trust are refused on a device’s routes
a device key reaches its own routes and conversations, and nothing else (#946) @cap:parler-par-canal-externe/moteur a device answers a card put on IT, as itself; a card it was not given is not found
a device continues only ITS voice turns, and hears only ITS announcements (#946) @cap:parler-par-canal-externe/moteur a turn opened by device A: B cannot send it a chunk nor cancel it; A can
a device continues only ITS voice turns, and hears only ITS announcements (#946) @cap:parler-par-canal-externe/moteur the announcement of a job of A’s conversation: A hears it, B is told it does not exist
a removed device is cut at once (#946) @cap:parler-par-canal-externe/moteur its open stream closes now, its key is refused on the next request, cards stop reaching it
a removed device is cut at once (#946) @cap:parler-par-canal-externe/moteur rename keeps the key; the name is the owner’s, trimmed
pairing requests are the install’s: only a single-user install acts on them (#946) @cap:parler-par-canal-externe/moteur one account: its session sees the request and confirms it; a second account: nobody sees, confirms, refuses or dismisses one
the pairing route has limits (#946) @cap:parler-par-canal-externe/moteur per address per minute, then in total; another address is not held by the first
the pairing route has limits (#946) @cap:parler-par-canal-externe/moteur a request that expired long ago is purged
a pairing confirmed in workspace X gives nothing in workspace Y (#946) @cap:parler-par-canal-externe/moteur the key reaches no conversation of Y; Y’s owner neither lists nor removes the device
every pairing and owner route of the protocol is served (#946) @cap:parler-par-canal-externe/moteur DEVICE_PAIRING_GESTURES and DEVICE_OWNER_ROUTES name only routes the app serves
the pushes of a run are ordered (#945) @cap:parler-par-canal-externe/moteur a reading taken before the end, slower than the end, never lands after it
a turn made in a device’s conversation records the device (#945) @cap:parler-par-canal-externe/moteur the job it launches carries channel device and the device as its chat
a turn made in a device’s conversation records the device (#945) @cap:parler-par-canal-externe/moteur a dashboard turn is unchanged: channel dashboard, no chat
a turn made in a device’s conversation records the device (#945) @cap:parler-par-canal-externe/moteur a turn written into a messaging channel’s thread is refused, and nothing is stored
a turn made in a device’s conversation records the device (#945) @cap:parler-par-canal-externe/moteur a device conversation that lost its device names nowhere to answer: refused
the readers of a device’s job read the device’s facts (#945) @cap:parler-par-canal-externe/moteur its history is the conversation’s chat_messages, like the dashboard’s
the readers of a device’s job read the device’s facts (#945) @cap:parler-par-canal-externe/moteur its result is read on the device’s stream, never pushed by the outbox
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur a request ALREADY aborted when its stream opens leaves no subscriber, and its body ends
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur a request aborted WHILE the route still works before the stream (the guard) leaves no subscriber
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur streams aborted after `ready`, before any event, each leave the bus and end, and only their own
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur a request aborted in the MIDDLE of a write: the subscriber is gone, nothing is written after, the body ends
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur a request garbage-collected before its abort: the abort still ends the stream and frees the bus
a push stream ends with its request, whatever ends it (#1033) @cap:parler-par-canal-externe/moteur a reader that cancels the body leaves no subscriber
over real HTTP (@hono/node-server), a client gone ends its stream (#1033) @cap:parler-par-canal-externe/moteur a client gone while the route still authorises: no subscriber stays, for each device and the workspace
over real HTTP (@hono/node-server), a client gone ends its stream (#1033) @cap:parler-par-canal-externe/moteur clients gone after `ready`: each subscriber leaves, the others keep listening
subscriptionStream, the end path every subscribing SSE route shares (#1033) @cap:parler-par-canal-externe/moteur every way to end it, in any order, unsubscribes ONCE and closes the body
subscriptionStream, the end path every subscribing SSE route shares (#1033) @cap:parler-par-canal-externe/moteur a subscription that ends itself while opening is unsubscribed, and its body ends with what it wrote
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur a Telegram job: no mark renders, through the send tool
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur a Discord job: the marks Discord renders — its own adapter, not Telegram rules
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur every tool-delivery channel states what ITS adapter declares
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur a routine that asked for a confirmation gets the facts of the channel the tool will reach
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur where the reply does not go through a tool, the format fact stays and the reply is not the tool
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur the facts name the target the send tool computes: the chat on its recorded channel, else the owner of the channel the tool resolves
channelDeliveryFacts — the channel line comes from the adapter (#613) @cap:parler-par-canal-externe/moteur no facts for a channel that has no send tool (WhatsApp today)
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a request without a chat is answered by its result, whatever channels the agent has
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a request that came from a chat is answered in that chat, through the send tool
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a request that named a chat to answer on is answered there: routine, webhook, dashboard "send via Telegram"
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a named chat is reached on ITS channel only: a Telegram chat with the token withdrawn and Discord active is answered by the result
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a named chat whose channel nobody recorded is never guessed: the origin reads the result
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a delegate answers its parent, even carrying the chat it inherited
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a chat on a channel with no send tool is not a tool destination (WhatsApp today)
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a chat named by the trigger that no armed send tool can reach: the origin reads the result
replyDestination — the answer goes back where the request came from (#649) @cap:parler-par-canal-externe/moteur a request that came FROM a chat stays answered there even with no armed tool: its author reads nothing else, the guard fails loud
designatedChatChannel — the channel of a chat the trigger named, as recorded (#649) @cap:parler-par-canal-externe/moteur reads the channel recorded with the chat
designatedChatChannel — the channel of a chat the trigger named, as recorded (#649) @cap:parler-par-canal-externe/moteur nothing recorded, no chat, or a request that came FROM a chat: no designated channel
the job chat as a model reads it @cap:parler-par-canal-externe/moteur telegram_chat_id is the HANDLE of a chat resolved on Telegram
the job chat as a model reads it @cap:parler-par-canal-externe/moteur a chat on another channel, or on none, is never presented as a Telegram chat (#649)
the job chat as a model reads it @cap:parler-par-canal-externe/moteur the delivery-notice address is the handle, on every channel; a chat with no channel has none
the job chat as a model reads it @cap:parler-par-canal-externe/moteur two jobs, two agents of one entity: the same chat, the same handle
the job chat as a model reads it @cap:parler-par-canal-externe/moteur the prompt of a CLI-runtime job carries the handle, never the Telegram id
the job chat as a model reads it @cap:parler-par-canal-externe/moteur run-job.ts builds that context from telegramChatOf — the composition above is the real one
executeJob the answer goes back where the request came from: an MCP job is answered by its result, a chat or a routine that named one by the send tool (#649) @cap:parler-par-canal-externe/moteur
executeJob #567: the head job of a conversation stops the delegate an earlier message started @cap:parler-par-canal-externe/moteur
delivery notice of a delegated child (#824) @cap:parler-par-canal-externe/moteur names a whatsapp chat by its handle, never by the channel id
delivery notice of a delegated child (#824) @cap:parler-par-canal-externe/moteur names a telegram chat by its handle, never by the channel id
delivery notice of a delegated child (#824) @cap:parler-par-canal-externe/moteur names a discord chat by its handle, never by the channel id
stored text reaches the provider with handles (#824) @cap:parler-par-canal-externe/moteur a pre-PR delivery notice in a prior turn of the thread
stored text reaches the provider with handles (#824) @cap:parler-par-canal-externe/moteur a resumed job's stored messages
stored text reaches the provider with handles (#824) @cap:parler-par-canal-externe/moteur a memory holding a raw WhatsApp id
shared texts defer the reply path to the delivery: line (#649) @cap:parler-par-canal-externe/moteur no tool description orders the answer through a send tool unconditionally
shared texts defer the reply path to the delivery: line (#649) @cap:parler-par-canal-externe/moteur no system skill orders the answer through a send tool unconditionally
shared texts defer the reply path to the delivery: line (#649) @cap:parler-par-canal-externe/moteur the detector finds the orders #649 was made of, and their rewordings
shared texts defer the reply path to the delivery: line (#649) @cap:parler-par-canal-externe/moteur the detector lets through what defers to the delivery: line or refuses the send
shared texts defer the reply path to the delivery: line (#649) @cap:parler-par-canal-externe/moteur no system skill picks the reply path from where the request came from
the handle boundary never sends raw text in silence @cap:parler-par-canal-externe/moteur chat: an agent with no workspace — the request is refused, the provider never called
the handle boundary never sends raw text in silence @cap:parler-par-canal-externe/moteur chat: an agent with a workspace — the request is sent with the handle
the handle boundary never sends raw text in silence @cap:parler-par-canal-externe/moteur CLI: a job with no workspace of its own takes its agent’s
the handle boundary never sends raw text in silence @cap:parler-par-canal-externe/moteur CLI: no workspace, not even through its agent — the turn is refused, nothing is launched
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
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a PDF with a caption: written under its own name, named in the job beside the caption
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur 'audio': written with its bytes, named in the job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur 'voice': written with its bytes, named in the job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur 'video': written with its bytes, named in the job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur 'video_note': written with its bytes, named in the job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur 'animation': written with its bytes, named in the job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a file with no caption still becomes a job, with a neutral task and its file part
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur in a group, a file whose caption is only the bot mention still becomes a job
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a download that fails: the job exists, and a part names the file and the reason
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a file over the Bot API 20 MB limit: said with its size, never fetched
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a photo keeps its image part (the file: URL of the saved JPEG), plus its file part
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur an image sent as a document gets an image part too: its bytes decide, not its kind
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur an image whose name ends in an extension of any length reaches the model, in the request body
Telegram files reach the agent (#899) @cap:parler-par-canal-externe/moteur a job already claimed while the file downloaded keeps its transcript (G1), the file stays on disk
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur two files of the same name in one message: both kept, the second suffixed
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("con .txt") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("nul .pdf") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("aux .mp3") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("com1 .docx") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("conin$.log") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("conout$ .txt") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file named like a Windows device ("CONOUT$") is written, with its bytes, under a name that is not one
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a name Windows does not resolve to a device ("CLOCK$") keeps its name, and its bytes land on disk
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a name Windows does not resolve to a device ("clock$.txt") keeps its name, and its bytes land on disk
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a name Windows does not resolve to a device ("conin$x.txt") keeps its name, and its bytes land on disk
receiveInboundFiles — never overwrites @cap:parler-par-canal-externe/moteur a file already in the folder under the same name is not overwritten
the inbound folder of a channel, keyed by job, and the layout before it (#910) @cap:parler-par-canal-externe/moteur the old conversation folders are pruned like the channel folder, and nothing deeper
the inbound folder of a channel, keyed by job, and the layout before it (#910) @cap:parler-par-canal-externe/moteur a busy conversation never deletes another one’s promised file; its own next file is refused, and said
the inbound folder of a channel, keyed by job, and the layout before it (#910) @cap:parler-par-canal-externe/moteur the pre-#910 conversation folders move up at boot; a folder an agent made stays
the inbound folder of a channel, keyed by job, and the layout before it (#910) @cap:parler-par-canal-externe/moteur the retention cron, both layouts: a pruned job leaves nothing, at either level
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Telegram 'private' chat, file 'Facture EDF.pdf': file_read and file_move succeed on exactly the paths the model read
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Telegram 'group' chat, file 'Facture EDF.pdf': file_read and file_move succeed on exactly the paths the model read
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Telegram 'private' chat, file '4242.pdf': file_read and file_move succeed on exactly the paths the model read
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Telegram 'group' chat, file 'Relevé 4242 (oct).pdf': file_read and file_move succeed on exactly the paths the model read
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur a pre-#910 folder, moved at boot: what file_list shows the model, file_read opens
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Telegram photo for a model that does not see: the routing note names a path the file tools open
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Discord image for a model that does not see: the routing note names a path the file tools open
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Discord, 'inbox full': the model is told the image was NOT received, and why
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Discord, 'download failed': the model is told the image was NOT received, and why
a received file opens at the path the model is given (#910) @cap:parler-par-canal-externe/moteur Discord, 'over the cap': the model is told the image was NOT received, and why
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur Telegram: file_move of the received PDF, default autonomy, moves it without asking anyone
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur Discord: file_move of the received image, default autonomy, moves it without asking anyone
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur Telegram: a later run of the same agent moves the received PDF without asking anyone
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur a file a tool returned, saved by the runner for the job, is that job’s write too
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur a shared file another job wrote still waits for a person, and nothing moves
a file received for a job is written by that job (#913) @cap:parler-par-canal-externe/moteur a received file another job rewrote after the intake waits for a person, and nothing moves
runTelegramPoller #602: /stop creates no job and is acknowledged by a reaction on the message, never by text @cap:parler-par-canal-externe/moteur
Discord gateway: a message sent while the work runs gets no reaction, /stop keeps its own @cap:parler-par-canal-externe/moteur a message at rest and a message during the work both start a turn, and neither is reacted to
Discord gateway: a message sent while the work runs gets no reaction, /stop keeps its own @cap:parler-par-canal-externe/moteur /stop still stops the running work and is acknowledged by its reaction
handleWhatsAppMessage — H-1 owner-claim / pending authorization a requester WITHOUT a display name is stored as the fixed fallback, never their JID @cap:parler-par-canal-externe/moteur
handleWhatsAppMessage — H-1 owner-claim / pending authorization a GROUP request from a nameless participant: the owner still sees WHO asked, the stored name stays a name @cap:parler-par-canal-externe/moteur
handleWhatsAppMessage — group mention gating (mentionsSelf) a group sender WITHOUT a display name: the task never carries the phone in their JID @cap:parler-par-canal-externe/moteur
the enumerations that accept `device`, and the one that leaves it out (#945) @cap:parler-par-canal-externe/moteur a job can be launched from a device
the enumerations that accept `device`, and the one that leaves it out (#945) @cap:parler-par-canal-externe/moteur a device keeps its turns in chat_messages, like the dashboard; a messaging thread does not
the enumerations that accept `device`, and the one that leaves it out (#945) @cap:parler-par-canal-externe/moteur a device has no per-agent binding: the binding channels leave it out
the protocol events a device receives (#945) @cap:parler-par-canal-externe/moteur accepts each gesture Nodal sends, and nothing else
the protocol events a device receives (#945) @cap:parler-par-canal-externe/moteur declares the four capabilities the devices table accepts
where a device key is accepted, read from the route table (#946) @cap:parler-par-canal-externe/moteur every route of DEVICE_GESTURES, with its method, and no other
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
message_conversation_run: a reply turn passes the person’s words on to the running work (#531) @cap:parler-par-canal-externe/moteur telegram: to the head of the run, and to its delegate still working — each reads it at its next step
message_conversation_run: a reply turn passes the person’s words on to the running work (#531) @cap:parler-par-canal-externe/moteur dashboard: to the head of the run, and to its delegate still working — each reads it at its next step
message_conversation_run: a reply turn passes the person’s words on to the running work (#531) @cap:parler-par-canal-externe/moteur refuses the caller’s own run, a finished job and a job of another conversation — nothing is written
message_conversation_run: a reply turn passes the person’s words on to the running work (#531) @cap:parler-par-canal-externe/moteur says honestly when a CLI-served job reads it: after its current turn
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur list_conversations never hands the model a channel id — WhatsApp, Telegram, Discord
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a send tool given a handle reaches the conversation AND the channel it names
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur the allowlist check still applies behind a handle
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a media tool takes a handle the same way
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a handle of another entity is refused — it names nothing here
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur an unknown handle is refused, loud
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a handle whose channel contradicts `channel` is refused
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a raw id still works as before, allowlist check included
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur the job's own chat as a handle skips the allowlist check, like its raw id
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur a platform's error text never hands the model the channel id
conversation handles, model ↔ send tools @cap:parler-par-canal-externe/moteur one conversation, one handle: across two jobs, two bots of one entity, a recreated row
dashboard → runner routes @cap:parler-par-canal-externe/moteur every runner endpoint the web calls is served by the runner
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
the address a device connects to @cap:parler-par-canal-externe/moteur network access on: each LAN address, on the RUNNER port (the device routes are the runner’s)
the address a device connects to @cap:parler-par-canal-externe/moteur this computer only: the loopback address, so a module on this computer can still pair
the address a device connects to @cap:parler-par-canal-externe/moteur no LAN address detected: none is invented
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
WhatsApp pairing from the dashboard @cap:parler-par-canal-externe/moteur the dashboard actions load without the WhatsApp library installed
WhatsApp pairing from the dashboard @cap:parler-par-canal-externe/moteur starting pairing POSTs {agentId} as JSON to the runner route /api/whatsapp/pairing
WhatsApp pairing from the dashboard @cap:parler-par-canal-externe/moteur reading the pairing status GETs /api/whatsapp/pairing?agentId= and relays the QR
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
197 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 a Telegram job states the channel facts once, and no hand-written channel rule (#613)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a Discord job states ITS adapter facts: the marks it renders, same splitting (#613)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur generated values whose digits spell a channel limit do not read as a stated limit (flaky "2000", #613)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a Slack job names mrkdwn marks, never claims its markup shows literally (#615)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a request with no chat to answer on: the reply is the result, the send tool is a separate message to the owner (#649) @cap:parler-par-canal-externe/moteur
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the line names the target the send tool computes: the chat named for this job, never "your owner" when it is not (#649) @cap:parler-par-canal-externe/moteur
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a delegate that inherits the chat_id gets no channel text at all (#559, #613)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the web chat surface carries no channel line and no plain-text rule (#613)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a spoken reply is stated once in Job context, on every surface that carries it (#941)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a read reply, absent or text, adds no line: no existing prompt changes (#941)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the spoken chat prompt differs from the typed one by its rendering line, and only by it (#943)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the chat surface line is exactly the measured one (#995 tripwire: re-measure before editing it)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur the sentence #977 added to the surface line is not in any chat prompt (#995)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a spoken chat turn carries the brevity rule, once, in the rendering line (#987)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a typed chat turn and a delegated job carry no brevity rule (#987)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur every surface that carries the spoken line ends it with the hand-off sentence, once (#1049)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a read reply and a delegated job carry neither the spoken line nor the hand-off sentence (#1049)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur a delegate answers its parent: a spoken root does not make it write for the voice (#941)
buildSystemPrompt — names no tool outside the job list (#559) @cap:assigner-outils/moteur indexes only the deferred tools 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 no text of the platform names a deferred tool, outside the tool index
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
egress — what a served tool reaches beyond Nodal @cap:assigner-outils/moteur the catalog holds the per-job tools, not only the registry
egress — what a served tool reaches beyond Nodal @cap:assigner-outils/moteur every served tool declares it
egress — what a served tool reaches beyond Nodal @cap:assigner-outils/moteur the delivery tools, and only they, reach a channel
egress — what a served tool reaches beyond Nodal @cap:assigner-outils/moteur the tools that reach the network on their own, beyond a channel
computeAgentToolNames — MCP tool names are the ones the runner lends (#661) @cap:assigner-outils/moteur names a server tool with the ONE MCP prefix, even for a pre-#661 slug
computeAgentToolOrigins — what reaches outside Nodal, and through what @cap:assigner-outils/moteur an enabled Discord binding arms the delivery tools, like execute.ts
computeAgentToolOrigins — what reaches outside Nodal, and through what @cap:assigner-outils/moteur a disabled binding arms nothing
computeAgentToolOrigins — what reaches outside Nodal, and through what @cap:assigner-outils/moteur names a connector and an MCP server as what lends their tools
computeAgentToolOrigins — what reaches outside Nodal, and through what @cap:assigner-outils/moteur an agent with neither channel, connector nor MCP server reaches nothing outside
computeAgentToolOrigins — what reaches outside Nodal, and through what @cap:assigner-outils/moteur a root grant that creates or attaches a connector or MCP server is named as a way out
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
an orchestrator holds the tools its owner switched on @cap:assigner-outils/moteur orchestrator with spreadsheet-editing: xlsx_create is in the index, and the call writes the workbook on disk
an orchestrator holds the tools its owner switched on @cap:assigner-outils/moteur agent with spreadsheet-editing: xlsx_create is in the index, and the call writes the workbook on disk
an orchestrator holds the tools its owner switched on @cap:assigner-outils/moteur the same orchestrator without the group holds no xlsx tool at all
a worker's list is exactly what it was @cap:assigner-outils/moteur non-delegated worker with spreadsheet-editing + command-execution
a worker's list is exactly what it was @cap:assigner-outils/moteur delegated worker: the same list, without dashboard_publish
an orchestrator's turn-1 order is pinned @cap:assigner-outils/moteur delegation tools, then the same eager tools as a worker, in the same order
the mirror and the runner compute the same list @cap:assigner-outils/moteur agent (team of 0), no group
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 0), no group
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 2), no group
the mirror and the runner compute the same list @cap:assigner-outils/moteur agent (team of 0), spreadsheet
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 0), spreadsheet
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 2), spreadsheet
the mirror and the runner compute the same list @cap:assigner-outils/moteur agent (team of 0), shell + speech
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 0), shell + speech
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 2), shell + speech
the mirror and the runner compute the same list @cap:assigner-outils/moteur agent (team of 0), office + document + code-task + code-review
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 0), office + document + code-task + code-review
the mirror and the runner compute the same list @cap:assigner-outils/moteur orchestrator (team of 2), office + document + code-task + code-review
the routine lint reads the same list @cap:assigner-outils/moteur a routine naming load_tools and a group's tool of an orchestrator is not flagged
the routine lint reads the same list @cap:assigner-outils/moteur create_schedule does not flag save_routine_state, which every routine run holds
the mirror follows the job it describes @cap:assigner-outils/moteur agent, routine run: the mirror given the routine context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur agent, conversation turn: the mirror given the conversation context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur agent, reply turn: the mirror given the conversation context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur agent, delegated inside a conversation: no conversation tool, and the mirror equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur orchestrator, routine run: the mirror given the routine context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur orchestrator, conversation turn: the mirror given the conversation context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur orchestrator, reply turn: the mirror given the conversation context equals the runner
the mirror follows the job it describes @cap:assigner-outils/moteur orchestrator, delegated inside a conversation: no conversation tool, and the mirror equals the runner
a delegated orchestrator delivers nothing itself @cap:assigner-outils/moteur holds its groups but not dashboard_publish; the same orchestrator top-level keeps it
an Alfred-like root: the groups land in the index, turn 1 does not grow @cap:assigner-outils/moteur spreadsheet + shell + speech: +18 allowed, same eager schemas, index grows
a loaded tool stays offered across the life of its job @cap:assigner-outils/moteur a name with spaces around it is loaded, and its schema is sent on the next turn
a loaded tool stays offered across the life of its job @cap:assigner-outils/moteur compaction elides the large input of the load, and the schema is still sent
a loaded tool stays offered across the life of its job @cap:assigner-outils/moteur an approval suspends the job; on resume the loaded tools are still offered
a loaded tool stays offered across the life of its job @cap:assigner-outils/moteur a delegation suspends the job; on its return the loaded tools are still offered
what a turn loads @cap:assigner-outils/moteur load_tools names and direct deferred calls, in call order, each once
what a turn loads @cap:assigner-outils/moteur adds nothing already loaded, nothing not held, nothing from a malformed input
the schemas a turn sends @cap:assigner-outils/moteur a job that loaded nothing sends its eager tools only, in whitelist order
the schemas a turn sends @cap:assigner-outils/moteur then the loaded tools in load order, then any deferred tool the transcript calls
the schemas a turn sends @cap:assigner-outils/moteur a recorded name the job no longer holds is not sent
the schemas a turn sends @cap:assigner-outils/moteur the transcript is read by tool NAME, which compaction keeps
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur orchestrator on openai/gpt-5.6-sol: eager schemas first, a loaded schema appended after load_tools
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur agent on openai/gpt-5.6-sol: eager schemas first, a loaded schema appended after load_tools
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur orchestrator on xiaomi/mimo-v2.6-pro: eager schemas first, a loaded schema appended after load_tools
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur agent on xiaomi/mimo-v2.6-pro: eager schemas first, a loaded schema appended after load_tools
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur a direct call to a deferred tool of the whitelist runs, without load_tools first
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur the root's first direct create_schedule, a deferred meta-tool, creates the schedule
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur a direct call with guessed arguments gets a readable tool error, and the schema from then on
a job reads the schemas it needs and keeps its whole whitelist @cap:assigner-outils/moteur a tool outside the whitelist stays refused, called directly or through load_tools
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
an allowlist may name no program that runs another one (#715) @cap:assigner-outils/moteur every program the reading knows runs another one is refused, fd and find included
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
load_tools loads only the job’s own deferred tools @cap:assigner-outils/moteur loads a deferred tool, reports an eager one as already there, refuses one not held
load_tools loads only the job’s own deferred tools @cap:assigner-outils/moteur a name asked twice is loaded once
load_tools loads only the job’s own deferred tools @cap:assigner-outils/moteur is itself eager and read-only
the tool index @cap:assigner-outils/moteur names every deferred tool — absent loading included — with its first sentence
the tool index @cap:assigner-outils/moteur cuts a sentence longer than one line, and flattens whitespace
the tool index @cap:assigner-outils/moteur the always-on docs carry the loading their tool declares
one reading of the names a load asks for @cap:assigner-outils/moteur trims, drops empties and non-strings, dedupes — for the loader and the runner alike
the loader of a job @cap:assigner-outils/moteur is added when the job holds a deferred tool, and not otherwise
the loader of a job @cap:assigner-outils/moteur refuses a job tool that takes the loader’s name, and says so
deferredToolIndex — a description the product did not write @cap:assigner-outils/moteur says who wrote it after the first sentence; a product description is unchanged
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
agentBuiltinToolNames @cap:assigner-outils/moteur always-on first, then the groups, then the gated builtins, without duplicates
agentBuiltinToolNames @cap:assigner-outils/moteur a group naming a builtin this build does not register adds nothing for it
agentBuiltinToolNames @cap:assigner-outils/moteur a delegated job loses dashboard_publish and the conversation tools, keeps its groups
setRunCommandRuleAction @cap:assigner-outils/moteur chaque choix écrit SA ligne ; il n’y a plus de « pas de ligne » (#917)
setRunCommandRuleAction @cap:assigner-outils/moteur hors local-trust, un tiers ne change rien, dans aucun des trois sens
setRunCommandRuleAction @cap:assigner-outils/moteur une ligne de dossier n’est ni remplacée ni élargie : la ligne de l’outil s’écrit à côté
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
index des skills : seulement celles dont le job tient les outils @cap:assigner-skill/moteur un job annonce la skill dont il tient les builtins, jamais celle dont l’outil n’est pas un builtin tenu
2 more
index des skills : seulement celles dont le job tient les outils @cap:assigner-skill/moteur le chat annonce EXACTEMENT les skills du job auquel il passe la main
index des skills : seulement celles dont le job tient les outils @cap:assigner-skill/moteur aucune skill retenue : pas de titre `## Skills` vide
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)
9 more
learned-skills page @cap:apprendre-une-skill/ecran assignment-mode control renders both options and is interactive
catalog card, installed = its slug is in the workspace @cap:apprendre-une-skill/ecran slug present, with no source (the rows of screen 8): "Installed", no Install
catalog card, installed = its slug is in the workspace @cap:apprendre-une-skill/ecran slug present, installed from the catalog: "Installed", no Install
catalog card, installed = its slug is in the workspace @cap:apprendre-une-skill/ecran slug present, installed from another source: "Installed", no Install
catalog card, installed = its slug is in the workspace @cap:apprendre-une-skill/ecran slug absent: Install
catalog card, installed skill whose source has a problem @cap:apprendre-une-skill/ecran identity_changed: the card warns, names the skill the source serves now, and offers no update
catalog card, installed skill whose source has a problem @cap:apprendre-une-skill/ecran source_not_found: the card warns that the source is gone
catalog card, installed skill whose source has a problem @cap:apprendre-une-skill/ecran ordinary states are unchanged: up to date shows the host and "Installed", a pending update its badge
workspace table, installed skill whose source has a problem @cap:apprendre-une-skill/ecran shows a warning per problem code, the update badge for a pending update, and nothing for an up-to-date skill
passed
update-flow a source that no longer holds the skill @cap:apprendre-une-skill/moteur identity_changed: the badge becomes the problem, with the slug upstream now declares; no "unchanged" claim
update-flow a source that no longer holds the skill @cap:apprendre-une-skill/moteur source_not_found: a 404 after a pending update records the problem, not "no update"
update-flow a source that no longer holds the skill @cap:apprendre-une-skill/moteur source_not_found: a source that no longer holds any SKILL.md is the same problem
6 more
update-flow a source that no longer holds the skill @cap:apprendre-une-skill/moteur a later good check clears the problem and reports the real diff again
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
POST /api/skills/install — provenance du code installé @cap:apprendre-une-skill/moteur renvoie un diagnostic utilisateur, jamais une erreur interne brute
listSkillUpdatesAction also lists community skills whose source has a problem, with the code @cap:apprendre-une-skill/moteur
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
8 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
recipeOutcomeMessages @cap:connecter-un-service/ecran a missing skill does not silence a connector not attached, nor the ones to set up
recipeOutcomeMessages @cap:connecter-un-service/ecran a clean outcome says what was attached, then what is left
Deux clients à la fois, Claude Code ET Claude Desktop (#485) @cap:connecter-un-service/ecran montre un bloc par client, avec le texte exact de CETTE install
Deux clients à la fois, Claude Code ET Claude Desktop (#485) @cap:connecter-un-service/ecran « Add to Claude Desktop » montre l’entrée, dit la copie et le redémarrage, puis écrit
Deux clients à la fois, Claude Code ET Claude Desktop (#485) @cap:connecter-un-service/ecran sans la commande du CLI, la carte le dit au lieu d’inventer une commande
passed
CallClock @cap:connecter-un-service/moteur a call that is over never arms its timer again, whatever unwinds after it
CallClock @cap:connecter-un-service/moteur a running call still times out, paused while a person answers
CallClock @cap:connecter-un-service/moteur a question pauses the bound, it never refills it
120 more
CallClock @cap:connecter-un-service/moteur progress from the server still restarts the full bound
MCP server instructions @cap:connecter-un-service/moteur connectMcp returns the instructions a real server published, verbatim
MCP server instructions @cap:connecter-un-service/moteur keeps the whitespace of a published text: an indented code block stays a code block
MCP server instructions @cap:connecter-un-service/moteur whitespace alone is no guidance: null
MCP server instructions @cap:connecter-un-service/moteur a server that publishes none yields null, not an empty string
MCP server instructions @cap:connecter-un-service/moteur the eager toolset carries them next to its descriptors
MCP server instructions @cap:connecter-un-service/moteur the lazy toolset hands the live tools AND instructions to onConnected at first call
an HTTP MCP server cannot send the connector elsewhere (SDK 1.32, GHSA-6prh-2h8m-c8cw) @cap:connecter-un-service/moteur a 301 to another origin is not followed: the foreign origin sees nothing, the connection fails naming the redirect
an HTTP MCP server cannot send the connector elsewhere (SDK 1.32, GHSA-6prh-2h8m-c8cw) @cap:connecter-un-service/moteur a 302 to another origin is not followed: the foreign origin sees nothing, the connection fails naming the redirect
an HTTP MCP server cannot send the connector elsewhere (SDK 1.32, GHSA-6prh-2h8m-c8cw) @cap:connecter-un-service/moteur a 303 to another origin is not followed: the foreign origin sees nothing, the connection fails naming the redirect
an HTTP MCP server cannot send the connector elsewhere (SDK 1.32, GHSA-6prh-2h8m-c8cw) @cap:connecter-un-service/moteur a 307 to another origin is not followed: the foreign origin sees nothing, the connection fails naming the redirect
an HTTP MCP server cannot send the connector elsewhere (SDK 1.32, GHSA-6prh-2h8m-c8cw) @cap:connecter-un-service/moteur a 308 to another origin is not followed: the foreign origin sees nothing, the connection fails naming the redirect
the stdio read buffer has the ceiling Nodal accepts, not the SDK default (SDK 1.30+) @cap:connecter-un-service/moteur a single result above the SDK default (12 MiB) reaches the caller whole
the stdio read buffer has the ceiling Nodal accepts, not the SDK default (SDK 1.30+) @cap:connecter-un-service/moteur a server that floods past the ceiling: the call fails NAMING the cause, the server process is gone, no exception escapes the stream handler
the stdio read buffer has the ceiling Nodal accepts, not the SDK default (SDK 1.30+) @cap:connecter-un-service/moteur a server that crashes keeps the plain `Connection closed`: no cause is invented
the stdio read buffer has the ceiling Nodal accepts, not the SDK default (SDK 1.30+) @cap:connecter-un-service/moteur the size error is raised ONCE, not once per chunk written during the grace period
a stdio MCP server belongs to whoever opened it (#750) @cap:connecter-un-service/moteur opened by a job: closing the connection kills the server behind its launcher; its detached helper dies with the job
a stdio MCP server belongs to whoever opened it (#750) @cap:connecter-un-service/moteur opened outside any job: the connection owns its processes and nothing survives its close
a stdio MCP server belongs to whoever opened it (#750) @cap:connecter-un-service/moteur a command that cannot be launched fails the connection, like the SDK
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur text + image + structuredContent: the model reads every text block in order, is told of the image, and reads the structured result
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur the image block is handed to the seam: attached when admitted, its reason said when not
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur structuredContent alone: the model reads it, serialized
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur a text block that already IS the structuredContent is not repeated (compared as JSON, not as text)
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur an empty text block next to structuredContent: the model reads the structured result, never an empty string
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur resource links, embedded resources and audio are each said, never dropped
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur isError stays a failure, carrying the text the server wrote
an MCP tool result, kept whole and read by the model @cap:connecter-un-service/moteur an empty result is said as empty
connectors and folders @cap:connecter-un-service/moteur the key is encrypted once; an assignment names its operations; a connector of another workspace is refused
connectors and folders @cap:connecter-un-service/moteur a folder already hidden from the Code tab elsewhere in the workspace arrives hidden
a stdio MCP server and its environment @cap:connecter-un-service/moteur is written active, its environment encrypted value by value, and read back as the runner reads it
a stdio MCP server and its environment @cap:connecter-un-service/moteur encrypts with the caller's function when it lends one (the runner lends it to create_mcp)
a stdio MCP server and its environment @cap:connecter-un-service/moteur an environment that cannot be read is said, never a variable dropped in silence
migration 0144_mcp_server_instructions @cap:connecter-un-service/moteur démarre un vrai Postgres et applique les VRAIES migrations
migration 0144_mcp_server_instructions @cap:connecter-un-service/moteur instructions existe, en texte NULLABLE et sans défaut
migration 0144_mcp_server_instructions @cap:connecter-un-service/moteur le texte d’un serveur s’écrit et se relit tel quel ; un serveur sans en garde NULL
0144 sur une installation d’avant @cap:connecter-un-service/moteur un serveur au cache d’avant est reconnecté une fois ; rejouée, la migration ne touche plus rien
MCP server guidance in the prompt @cap:connecter-un-service/moteur one block per server whose tool the job holds; none for a server that publishes nothing or whose tools it does not hold
MCP server guidance in the prompt @cap:connecter-un-service/moteur a job that holds none of the server tools gets nothing — the chat surface, a job whose server failed to connect
MCP server guidance in the prompt @cap:connecter-un-service/moteur caps the text at 4 000 characters and says so
MCP server guidance in the prompt @cap:connecter-un-service/moteur frames every injection payload as third-party text and keeps it whole
MCP server guidance in the prompt @cap:connecter-un-service/moteur a server cannot close the delimiter early
MCP server guidance in the prompt @cap:connecter-un-service/moteur no text the builder did not write can split the prompt: one cache boundary, the one it places
MCP server guidance follows the server that LENDS the tool @cap:connecter-un-service/moteur two legacy slugs on one prefix, disjoint tools: only the lender of the held tool speaks
MCP server guidance follows the server that LENDS the tool @cap:connecter-un-service/moteur a held tool that could belong to either server: no guidance from either, and it is said
MCP server guidance follows the server that LENDS the tool @cap:connecter-un-service/moteur a server that lends a held tool for certain speaks, even beside an ambiguous sibling
the MCP guidance of one prompt is capped as a whole @cap:connecter-un-service/moteur servers past the total cap are left out whole, by slug order, and named
the MCP guidance of one prompt is capped as a whole @cap:connecter-un-service/moteur past the cap, every later server is left out, a small one included
the MCP guidance of one prompt is capped as a whole @cap:connecter-un-service/moteur a text cut at its cap is cut between two characters, never inside one
resolveMcpToolNames @cap:connecter-un-service/moteur an enabled_tools that is not a list does not break the names
le texte publié arrive tel quel dans le prompt @cap:connecter-un-service/moteur un bloc de code indenté en tête reste un bloc de code
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
MCP server instructions reach the agent that holds the server @cap:connecter-un-service/moteur a first (eager) connection writes them before the prompt; the request carries the framed text, once per server that published some
MCP server instructions reach the agent that holds the server @cap:connecter-un-service/moteur an agent attached with no tool of the server enabled, or not attached, reads nothing of it
MCP server instructions reach the agent that holds the server @cap:connecter-un-service/moteur a lazy connection (first tool call) rewrites them: this job keeps its prompt, the next one reads the new text; a server that stops publishing is cleared
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur refuses the job, naming both servers: two instances of one server (same slug)
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur refuses the job, naming both servers: slugs folding onto one prefix, both lending ping (guide-srv / guide--srv)
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur runs a pre-#661 attachment whose lent names do not collide: guide-srv lends ping, guide--srv lends nothing
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur runs a pre-#661 attachment whose lent names do not collide: a lends nothing, a- lends a___ping
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur runs a pre-#661 attachment whose lent names do not collide: a lends a__ping, a- lends a___ping — a___ping also starts with a__
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur a non-canonical server on its own overlaps nothing: its call runs, its approval names it
one tool name, one MCP server, inside a job @cap:connecter-un-service/moteur two instances of one server, each given to a different agent: each call reaches its own
an MCP tool result reaches the model as the server wrote it @cap:connecter-un-service/moteur inline: text blocks in order with the image said for one server, structuredContent for the other; the rows keep everything
an MCP tool result reaches the model as the server wrote it @cap:connecter-un-service/moteur on resume after approval: the approved call gives the model the same text
an MCP tool result reaches the model as the server wrote it @cap:connecter-un-service/moteur more image bytes than a request carries: the call attaches what fits, says the rest, and the row keeps no byte
an MCP tool result reaches the model as the server wrote it @cap:connecter-un-service/moteur more text than the budget: the text is cut and says so, the machine form survives whole
a third-party tool error is framed like its success; the gate own errors are not @cap:connecter-un-service/moteur inline: the server isError text reaches the model framed; an invalid call refused by the gate stays bare
a third-party tool error is framed like its success; the gate own errors are not @cap:connecter-un-service/moteur on resume after approval: the approved call that fails reaches the model framed
one budget for what the model reads of a tool result, the frame included, on every path @cap:connecter-un-service/moteur a text block that IS the machine form, larger than the budget: the id and status survive
one budget for what the model reads of a tool result, the frame included, on every path @cap:connecter-un-service/moteur content full of the token the frame neutralizes: the frame still closes, within the budget
one budget for what the model reads of a tool result, the frame included, on every path @cap:connecter-un-service/moteur a long failure the server raised: framed, the machine form kept, the whole block within the budget
a third party’s result is cut, then framed, within the budget @cap:connecter-un-service/moteur content full of the delimiter token: the frame still closes, within the budget, the cut said
a third party’s result is cut, then framed, within the budget @cap:connecter-un-service/moteur a long page from a connector: within the budget, the frame closed
a third party’s result is cut, then framed, within the budget @cap:connecter-un-service/moteur a result under the budget is framed whole, never cut
a third party’s result is cut, then framed, within the budget @cap:connecter-un-service/moteur a long failure the tool raised: the whole `{ error }` block, escaping included, within the budget
the canonical MCP slug grammar @cap:connecter-un-service/moteur accepts words joined by single hyphens, every catalog-style slug
the canonical MCP slug grammar @cap:connecter-un-service/moteur refuses a doubled, leading or trailing hyphen, and anything but [a-z0-9-]
the canonical MCP slug grammar @cap:connecter-un-service/moteur every catalog slug is canonical: the catalog is a creation path too
the canonical MCP slug grammar @cap:connecter-un-service/moteur the HTML pattern says the same thing, anchored as a browser anchors it
the canonical MCP slug grammar @cap:connecter-un-service/moteur two different canonical slugs never overlap: the prefix is a bijection without `__`
mcpToolNamespacesOverlap @cap:connecter-un-service/moteur same slug: two instances of one catalog server
mcpToolNamespacesOverlap @cap:connecter-un-service/moteur slugs that fold onto the same prefix
mcpToolNamespacesOverlap @cap:connecter-un-service/moteur one namespace extending the other (a trailing hyphen)
mcpToolNamespacesOverlap @cap:connecter-un-service/moteur distinct namespaces, even when one slug starts with the other
findMcpNamespaceOverlap @cap:connecter-un-service/moteur names the first overlapping pair, or null
findMcpNamespaceOverlap @cap:connecter-un-service/moteur the refusal names both servers and the way out
a tool name is attributed to the server that LENDS it @cap:connecter-un-service/moteur mcpExposedToolNames: discovered tools narrowed by the whitelist, prefixed
a tool name is attributed to the server that LENDS it @cap:connecter-un-service/moteur attributeMcpTool: namespace AND list — the namespace alone cannot tell guide-srv from guide--srv
a tool name is attributed to the server that LENDS it @cap:connecter-un-service/moteur attributeMcpTool: an unknown list next to another server is never a certainty (review pass 2)
a tool name is attributed to the server that LENDS it @cap:connecter-un-service/moteur findMcpToolNameCollision: only a name lent by two servers
raisedByTool marks an error the tool itself raised, never a platform failure after it @cap:connecter-un-service/moteur the tool succeeded, then the platform failed: the error is the product’s, not flagged
create_mcp refuses a slug outside the canonical grammar: no doubled, leading or trailing hyphen (#661) @cap:connecter-un-service/moteur
attach_mcp refuses a server whose tool names would collide with one the agent holds (#661) @cap:connecter-un-service/moteur
attach_mcp two instances answer one slug: attach_mcp and detach_mcp list them and pick none; a name picks one (#661) @cap:connecter-un-service/moteur
addNodalToClaudeDesktopAction @cap:connecter-un-service/moteur un non-propriétaire est refusé, et rien n’est écrit
addNodalToClaudeDesktopAction @cap:connecter-un-service/moteur sans NODAL_CLI_ARGV, l’action refuse au lieu d’inventer une commande
addNodalToClaudeDesktopAction @cap:connecter-un-service/moteur écrit l’entrée de CETTE install dans le fichier de Claude Desktop de la machine
addNodalToClaudeDesktopAction @cap:connecter-un-service/moteur une seconde instance (NODALAI_HOME) écrit SON dossier dans l’entrée
addNodalToClaudeDesktopAction @cap:connecter-un-service/moteur une install à plusieurs comptes est refusée
recommended MCP servers the workspace holds SEVERAL of (#661) @cap:connecter-un-service/moteur attaches none of them and says why, naming each instance
setAgentMcpServerAssignmentAction — one tool name, one server @cap:connecter-un-service/moteur refuses a second instance of a server the agent holds, names both, writes nothing
setAgentMcpServerAssignmentAction — one tool name, one server @cap:connecter-un-service/moteur refuses slugs that fold onto one prefix, and a namespace extending another
setAgentMcpServerAssignmentAction — one tool name, one server @cap:connecter-un-service/moteur the same instance on two agents, distinct servers on one, and re-saving a tool list all pass
a pair attached before #661 can be narrowed, never widened into a collision (review pass 2) @cap:connecter-un-service/moteur unticking the shared tool on one of them is allowed; ticking it back is refused, naming the tool
createMcpServerFromCatalogAction — the canonical slug grammar @cap:connecter-un-service/moteur refuses a custom slug with a doubled, leading or trailing hyphen, before anything connects
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur lit NODAL_CLI_ARGV, et rend null plutôt qu’une commande inventée
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur Claude Code : la commande entière, tout chemin Windows entre guillemets
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur Claude Code : install Windows sans espace, chaque antislash sous guillemets
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur Claude Code : install npx Windows, chaque antislash sous guillemets
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur Claude Code : install macOS / Linux, chaque antislash sous guillemets
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur Claude Desktop : le node en commande, le reste en arguments, et aucun secret
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur chaque client lance le serveur MCP de l’instance qui a donné la commande
la commande de chaque client, pour CETTE install @cap:connecter-un-service/moteur le fichier de Claude Desktop, par système
withNodalEntry — la config de Claude Desktop @cap:connecter-un-service/moteur garde les autres serveurs et les autres clés, et pose `nodal`
withNodalEntry — la config de Claude Desktop @cap:connecter-un-service/moteur remplace une entrée `nodal` existante, et le dit
withNodalEntry — la config de Claude Desktop @cap:connecter-un-service/moteur un fichier illisible n’est pas réécrit : l’erreur remonte
writeNodalIntoClaudeDesktop — sur le disque @cap:connecter-un-service/moteur copie l’ancien fichier avant de le réécrire, et garde ses serveurs
writeNodalIntoClaudeDesktop — sur le disque @cap:connecter-un-service/moteur sans dossier Claude, rien n’est créé : Claude Desktop n’est pas installé ici
writeNodalIntoClaudeDesktop — sur le disque @cap:connecter-un-service/moteur un fichier illisible reste tel quel, sans copie
createMcpServerFromCatalogAction, stdio @cap:connecter-un-service/moteur writes each environment value encrypted, that the runner reads back as it was typed
a profile whose recommended server the attach rule refuses @cap:connecter-un-service/moteur creates the agent, attaches nothing, and hands the rule’s own words to the user
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
migration 0162_archive_preferred_language @cap:se-souvenir/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0162_archive_preferred_language @cap:se-souvenir/moteur archives every row the interview wrote, and only those
migration 0162_archive_preferred_language @cap:se-souvenir/moteur records the migration in the journal drizzle-kit actually reads
17 more
provider call deadline (#608) @cap:se-souvenir/moteur an embedding the provider never answers fails in bounded time, and says why
provider call deadline (#608) @cap:se-souvenir/moteur a streamed turn keeps its own clocks: thinking past the default is not cut
provider call deadline (#608) @cap:se-souvenir/moteur a one-shot call keeps its own budget: thinking past the default is not cut
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
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
the embedding provider reads conversations by their handle (#824) @cap:se-souvenir/moteur a memory's write: the fact is embedded with the handle; the STORED fact keeps the truth
the embedding provider reads conversations by their handle (#824) @cap:se-souvenir/moteur the startup backfill: a memory without a vector is embedded with the handle
the embedding provider reads conversations by their handle (#824) @cap:se-souvenir/moteur a recall's query goes through the SAME rewrite as the memories it is compared with
the embedding provider reads conversations by their handle (#824) @cap:se-souvenir/moteur a memory with no workspace of its own: its agent gives it one — write AND backfill
the embedding provider reads conversations by their handle (#824) @cap:se-souvenir/moteur no workspace at all, not even through an agent: NOT embedded, said with the row id, vector NULL — write AND backfill
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)
77 more
Approvals tab @cap:regler-autonomie/ecran 3-way control is present and interactive when write tools exist
every tool has its row, and the tab shows it (#917) @cap:regler-autonomie/ecran opening the tab writes a row per tool, each control shows its row, and the shared-file setting is one of them
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 downloads and runs inline code without asking, and asks for the rest; "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
the autonomy level is a template, applied to all only on request @cap:regler-autonomie/ecran says what the level does now: what a new agent or tool starts with
the autonomy level is a template, applied to all only on request @cap:regler-autonomie/ecran "Apply to all agents" asks first, and writes nothing before the answer
the autonomy level is a template, applied to all only on request @cap:regler-autonomie/ecran cancelling applies nothing
the autonomy level is a template, applied to all only on request @cap:regler-autonomie/ecran a level chosen but not saved cannot be applied: save it first
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran a connector operation shows ITS row, whatever the operation asks by default
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran a tool without a row shows no choice and says it is refused: no computed default
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran a change sends the row it writes, and the row shows it
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran a refused write puts the row back as the server holds it
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran relâche la ligne quand la promesse d’enregistrement rejette
every row shows the value stored for this agent, and nothing else (#917) @cap:regler-autonomie/ecran n'affiche pas les lignes de l'agent précédent quand on change d'agent
the shared-file setting has its own row (#917) @cap:regler-autonomie/ecran is shown beside the built-in tools, with its value, and a change sends its row
the shared-file setting has its own row (#917) @cap:regler-autonomie/ecran is not shown for an agent with no tool that can replace a shared file
every tool the agent holds is on the tab (#917) @cap:regler-autonomie/ecran "Other tools" lists the ones no section names, with their row, and says what no setting lifts
a row confined to a folder lives beside the tool row (#361, #917) @cap:regler-autonomie/ecran the tool row shows its own value; the folder row is said under it, with its value
a row confined to a folder lives beside the tool row (#361, #917) @cap:regler-autonomie/ecran changing the tool row leaves the folder row alone: one write, no folder in it
a row confined to a folder lives beside the tool row (#361, #917) @cap:regler-autonomie/ecran Remove deletes the folder row only, by its folder
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 each tool shows ITS row; there is no "Follow the server" any more
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 the server row sets every tool of the server; with a tool set apart, it asks first
les outils d'un serveur MCP, un par un @cap:regler-autonomie/ecran without a server row, the server line says new tools follow the level, and refuses nothing
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran chaque ligne allume SON choix, et la phrase dit ce qu’elle fait
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran there is no "no choice" state and no "Let the workspace autonomy decide"
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran says the floor no setting lifts
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran Block et Ask s’enregistrent sans confirmation, et envoient LEUR action
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran « Run without asking » demande d’abord, et n’écrit rien avant la réponse
Run commands : une ligne, comme tout outil (#468, #917) @cap:regler-autonomie/ecran un refus du serveur remet le choix d’avant
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran ouvre sur ce que le propriétaire décide ici, et d’où vient un réglage
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran dit ce que devient un outil bloqué
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran présente les outils natifs, et les rend par label et summary
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran porte les trois décisions du curseur
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran rend une operation de connecteur par ses textes de proprietaire, jamais par sa description
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran dit ce que sont les commandes, et la liste qui les borne
les textes de l'onglet Autonomie @cap:regler-autonomie/ecran dit ce que l'agent peut faire de son équipe, et ce qu'être en lecture seule veut dire
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 says a row confined to a folder under the tool, with its value, and its Remove
une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran ne dit aucun dossier quand l'agent n'en a pas
une ligne d'outil parle au propriétaire @cap:regler-autonomie/ecran a row without a value is said as refused, with no choice painted
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 downloads and runs inline code without asking, and asks for the rest (#614)
ShellChecklistSection @cap:regler-autonomie/ecran the download row says where Allowed reaches, the model stores included (#614)
ShellChecklistSection @cap:regler-autonomie/ecran says what a reading can promise: a script is read, one it cannot read is code written into a command (#635)
ShellChecklistSection @cap:regler-autonomie/ecran the row for what reaches the screen, a printer or someone asks by default, even on a policy stored before it (#667)
ShellChecklistSection @cap:regler-autonomie/ecran a click on Never for it saves that kind with that state (#667)
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, #917) @cap:regler-autonomie/ecran says what each row does
runCommandsTruth: what really happens to a command (#464, #917) @cap:regler-autonomie/ecran reads the brake before Run without asking
runCommandsTruth: what really happens to a command (#464, #917) @cap:regler-autonomie/ecran a missing row is said as refused, never filled with a default
passed
the approval rules @cap:regler-autonomie/moteur run_command: its row is written and replaced, never removed; a folder row lives beside it (#917)
the approval rules @cap:regler-autonomie/moteur a tool row: replaced in place, never removed; a folder row is removed alone
the approval rules @cap:regler-autonomie/moteur a template row rewrites the rows it covers: a server for its tools, Everyone for every agent
69 more
the approval rules @cap:regler-autonomie/moteur the read-only preset blocks its tools; removing it gives each back the value handed in, and keeps a row set by hand
migration 0156_autonomy_rows @cap:regler-autonomie/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0156_autonomy_rows @cap:regler-autonomie/moteur a tool row and a folder row of the same agent coexist; duplicates of either are refused
migration 0156_autonomy_rows @cap:regler-autonomie/moteur a rule for every agent (agent_id NULL) stays unique, and an empty condition is no folder
migration 0156_autonomy_rows @cap:regler-autonomie/moteur the generated folder follows condition_json, and cannot be written
migration 0156_autonomy_rows @cap:regler-autonomie/moteur a workspace created after 0156 is born written: it has nothing from before to keep
migration 0156_autonomy_rows @cap:regler-autonomie/moteur a workspace that existed when 0156 ran stays NULL: its first boot keeps what its screen showed
migration 0156_autonomy_rows @cap:regler-autonomie/moteur records the migration in the journal drizzle-kit actually reads
the writer: one row per agent and tool, in the database @cap:regler-autonomie/moteur a new agent gets a row for every tool it holds, and the shared-file setting
the writer: one row per agent and tool, in the database @cap:regler-autonomie/moteur attaching an MCP server writes a row per tool; a tool the server adds later inherits its setting
the writer: one row per agent and tool, in the database @cap:regler-autonomie/moteur the workspace level changes no existing row: only rows written after the change follow it
the first write after the upgrade keeps what the screen showed (#917) @cap:regler-autonomie/moteur per tool: the screen value where the screen showed one, never wider than what the gate applied
the first write after the upgrade keeps what the screen showed (#917) @cap:regler-autonomie/moteur the shared-file setting: what applied under the level when the four tools agreed
the first write after the upgrade keeps what the screen showed (#917) @cap:regler-autonomie/moteur at boot: every agent gets its rows, the workspace is marked done, and a later built-in follows the level
"Apply to all agents" (#917) @cap:regler-autonomie/moteur rewrites every agent row from the level, removes the template rules, keeps folder rows
"Apply to all agents" (#917) @cap:regler-autonomie/moteur a rule for an unknown agent id is never written
a job writes the autonomy rows of the tools it holds (#917) @cap:regler-autonomie/moteur an agent with no row: the job start writes one for every tool it holds, and its call runs on that row
a job writes the autonomy rows of the tools it holds (#917) @cap:regler-autonomie/moteur the level decides nothing at run time: a row on Ask first asks under fully_autonomous
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur gmail_send_email asks under the shipped default, propose_confirm and destructive_gate
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur gmail_send_email runs under fully_autonomous
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur gmail_send_email runs with an auto_approve rule (the card’s Always allow) and with the agent’s own rule (Yolo)
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur an approved call runs exactly once: the resume’s synthetic auto_approve rule does not re-gate it
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur every operation marked requiresApproval, of every connector, asks under the shipped default and propose_confirm
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur drive_share_file and apify_run_actor ask by default (#744); gcal_create_event and notion_add_comment still do not
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur under destructive_gate: a destructive operation asks, a write one marked requiresApproval runs (the existing relaxation)
the gate asks for a real connector operation marked requiresApproval @cap:regler-autonomie/moteur CONTROL: an operation not marked requiresApproval runs without asking in every mode
explainTemplateRules: what a NEW row inherits @cap:regler-autonomie/moteur orders the template rules most specific first, the agent row left out
explainTemplateRules: what a NEW row inherits @cap:regler-autonomie/moteur issue #357: a server trusted, one of its NEW tools inherits that trust
explainTemplateRules: what a NEW row inherits @cap:regler-autonomie/moteur a rule confined to a folder is never a template: a new row is valid everywhere
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur a tool that does not ask by itself starts Autonomous under every level
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur propose_confirm keeps every asking tool on Ask first
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur fully_autonomous lets them run, EXCEPT what runs code on this machine
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur destructive_gate: ordinary work runs, a destructive tool asks, a command is judged by the checklist
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur an MCP tool asks by default, runs under the autonomous levels unless destructive
levelTemplate: what each level writes for a tool @cap:regler-autonomie/moteur the shared-file setting starts Ask first, Autonomous only under full autonomy
templateAutonomy: a rule the owner set gives the new row its value @cap:regler-autonomie/moteur a server the owner trusted: its new tool starts with that trust, whatever the level
templateAutonomy: a rule the owner set gives the new row its value @cap:regler-autonomie/moteur a rule for every agent naming the tool comes before the server
templateAutonomy: a rule the owner set gives the new row its value @cap:regler-autonomie/moteur a `*` Autonomous never makes a code-running tool Autonomous; hardening still applies
templateAutonomy: a rule the owner set gives the new row its value @cap:regler-autonomie/moteur a row the agent already holds is not a template: only the level and template rules count
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur tool Autonomous, setting Ask first: a call that replaces a shared file asks
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur tool Autonomous, setting Autonomous: it runs, and the write is not asked again
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur setting Block: the call is refused with what the owner forbade, and nothing runs
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur tool Ask first, setting Autonomous: the stricter row still asks
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur a call that replaces nothing runs, and the write checks again (#505)
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur a tool that cannot replace a shared file never reads the setting
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur no setting row: a call of a file tool is refused with its reason, never run
executeTool — the shared-file setting has its own row (#917) @cap:regler-autonomie/moteur the level gives the setting its FIRST value only: Ask first, or Autonomous under full autonomy
executeTool — a tool without a row is refused (#917) @cap:regler-autonomie/moteur refuses with the reason, runs nothing, logs it, and writes the audit row
executeTool — a tool without a row is refused (#917) @cap:regler-autonomie/moteur a rule for every agent, a `*` rule or a server rule never stands in for the row
executeTool — a tool without a row is refused (#917) @cap:regler-autonomie/moteur the workspace level is not read at run time: the same row gives the same outcome under every level
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
the Autonomy tab reads rows the agent holds, written first (#917) @cap:regler-autonomie/moteur an agent without rows: the tab writes them all, then returns exactly those
the Autonomy tab reads rows the agent holds, written first (#917) @cap:regler-autonomie/moteur attaching an MCP server writes a row for each tool it lends
the workspace level is a template; Apply to all rewrites (#917) @cap:regler-autonomie/moteur saving a new level changes no row; Apply to all agents does
the read-only preset turned off gives the rows back, never deletes them (#917) @cap:regler-autonomie/moteur on: each preset tool blocked; off: each tool back to the level’s value, still a row
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
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çà
89 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 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 #465 — une QUESTION dans la cloche ne s’approuve pas : elle renvoie là où elle se répond
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
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
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 ligne, le dit : plus de « Tool default » calculé pour un outil qui n’a pas de ligne (#917)
la carte dit quelle règle a décidé @cap:approuver-une-action/ecran le réglage « shared file » se nomme en mots, pas par son nom de ligne
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 a deux états, Open et Close @cap:approuver-une-action/ecran #465 — une QUESTION en attente ne se répond pas ici : la carte renvoie là où elle vit
la carte a deux états, Open et Close @cap:approuver-une-action/ecran #465 — un id de conversation VIDE : le libellé et l’adresse disent tous deux le run
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 dit où écrit un téléchargement retenu parce qu’il sort des espaces (#614)
la carte dit ce que la liste de l’agent a vu (#464) @cap:approuver-une-action/ecran dit dans quel script, à quelle ligne, et ce qui n’a pas pu être lu (#635)
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
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran dit QUI demande, cite la question telle quelle, et montre les images jointes
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran dessine le formulaire demandé, et rien d’une approbation
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran le bouton d’accord porte le libellé que le serveur lui donne
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran Envoyer part avec exactement ce qui a été rempli
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran une valeur hors bornes est dite sous son champ, et rien ne part
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran Refuser part sans contenu
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran répondue : ce qui a été envoyé, avec les libellés, et plus de formulaire
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran retirée par le serveur : la carte le dit
la question d’un serveur MCP, sur l’écran @cap:approuver-une-action/ecran la page Approvals dessine la carte de la question, pas celle d’une approbation
ce qui part est ce que la personne a laissé @cap:approuver-une-action/ecran un booléen facultatif non touché ne part pas ; touché, il part tel quel
ce qui part est ce que la personne a laissé @cap:approuver-une-action/ecran un champ jamais rempli ne part pas, et un obligatoire le dit
ce qui part est ce que la personne a laissé @cap:approuver-une-action/ecran répondue, la carte dit « Answered » : elle ne prétend pas que le serveur l’a reçue
ce qui part d’un choix multiple, et d’un champ __proto__ @cap:approuver-une-action/ecran un choix multiple vidé par la personne part vide, au lieu de laisser le défaut du serveur
ce qui part d’un choix multiple, et d’un champ __proto__ @cap:approuver-une-action/ecran un champ nommé __proto__ part comme un champ
chaque raison de fermeture se dit @cap:approuver-une-action/ecran aucune raison du runner ne retombe sur le texte par défaut
faire confiance à un serveur depuis l'onglet Connectors écrit la ligne du serveur (#917) @cap:approuver-une-action/ecran pour cet agent : la ligne du serveur, sans boîte en plus
faire confiance à un serveur depuis l'onglet Connectors écrit la ligne du serveur (#917) @cap:approuver-une-action/ecran « pour tous mes agents » envoie la portée entité
passed
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur une connexion de job annonce le mode formulaire au serveur
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur accept : la question arrive à la personne, sa réponse arrive au serveur
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur decline : le serveur lit un refus, sans contenu
345 more
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur la connexion paresseuse d’un job répond aussi
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur personne pour répondre ici : le serveur reçoit cancel
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur une question posée hors de tout appel reçoit cancel
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur les images jointes sont lues ; une pièce qui n’est pas une image est écartée, pas la question
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur les libellés que le serveur donne à ses boutons arrivent avec la question
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur un libellé invalide est écarté et dit ; la question est posée quand même
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur un serveur qui retire sa question interrompt le signal de la demande
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur une question encore ouverte quand son appel se termine est interrompue
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur le délai d’appel ne compte pas l’attente humaine
élicitation MCP, contre un vrai serveur stdio @cap:approuver-une-action/moteur le délai d’appel compte encore le travail du serveur après la réponse
un appel pose au plus ELICITATIONS_PER_CALL_MAX questions @cap:approuver-une-action/moteur les questions au-delà reçoivent une erreur qui dit pourquoi ; la personne n’en voit aucune
approval_requests creation order @cap:approuver-une-action/moteur rows sharing one requested_at come back in creation order, oldest first and newest first
approval_requests creation order @cap:approuver-une-action/moteur seq grows with every insertion, whatever the kind
approval_requests creation order @cap:approuver-une-action/moteur listConversationRuns lists the pending requests of a run in creation order
the guard that no reader orders approval_requests by requested_at @cap:approuver-une-action/moteur flags the Drizzle builder form, nested parentheses included
the guard that no reader orders approval_requests by requested_at @cap:approuver-une-action/moteur flags raw SQL on approval_requests, in a template and in a string
the guard that no reader orders approval_requests by requested_at @cap:approuver-une-action/moteur lets the creation order and other tables through
no reader orders approval_requests by requested_at @cap:approuver-une-action/moteur finds none in apps/, packages/ and scripts/
migration 0140_approval_card_messages @cap:approuver-une-action/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0140_approval_card_messages @cap:approuver-une-action/moteur creates approval_card_messages with the columns the runner writes and reads
migration 0140_approval_card_messages @cap:approuver-une-action/moteur records the migration in the journal drizzle-kit actually reads
migration 0150_approval_requests_seq @cap:approuver-une-action/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0150_approval_requests_seq @cap:approuver-une-action/moteur adds seq as a NOT NULL bigint fed by the sequence a bigserial would own
migration 0150_approval_requests_seq @cap:approuver-une-action/moteur orders rows already written by their time and keeps counting above them
migration 0146_elicitation_draft @cap:approuver-une-action/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0146_elicitation_draft @cap:approuver-une-action/moteur adds approval_requests.draft, a nullable jsonb
migration 0146_elicitation_draft @cap:approuver-une-action/moteur records the migration in the journal, after every migration numbered before it
migration 0154_file_move_rules @cap:approuver-une-action/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0154_file_move_rules @cap:approuver-une-action/moteur file_move inherits the owner’s decision on file_write, for every agent that has one, and nothing else
migration 0154_file_move_rules @cap:approuver-une-action/moteur records the migration in the journal drizzle-kit actually reads
migration 0145_mcp_elicitation @cap:approuver-une-action/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0145_mcp_elicitation @cap:approuver-une-action/moteur accepts kind 'elicitation' next to the two kinds that were there, and nothing else
migration 0145_mcp_elicitation @cap:approuver-une-action/moteur adds approval_requests.response, a nullable jsonb
migration 0145_mcp_elicitation @cap:approuver-une-action/moteur creates approval_request_attachments: images only, one per position, gone with their request
migration 0145_mcp_elicitation @cap:approuver-une-action/moteur records the migration in the journal drizzle-kit actually reads
Telegram : carte à boutons libres @cap:approuver-une-action/moteur sendCard pose le clavier tel quel, une rangée par rangée
Discord : carte à boutons libres @cap:approuver-une-action/moteur déclare ce qu’elle peut porter : 5 rangées de 5
Discord : carte à boutons libres @cap:approuver-une-action/moteur sendCard pose une rangée de composants par rangée
Discord : carte à boutons libres @cap:approuver-une-action/moteur editMessageText réécrit la carte AVEC ses boutons
Discord : carte à boutons libres @cap:approuver-une-action/moteur une carte au-delà de ce que Discord porte est refusée, jamais coupée
Slack : carte à boutons libres @cap:approuver-une-action/moteur sendCard pose un bloc d’actions par rangée sous le texte
Slack : carte à boutons libres @cap:approuver-une-action/moteur editMessageText réécrit la carte AVEC ses boutons
le texte d’une carte à boutons ne notifie personne @cap:approuver-une-action/moteur Discord : aucune mention ne pinge, utilisateurs compris
le texte d’une carte à boutons ne notifie personne @cap:approuver-une-action/moteur Slack : le texte part en plain_text, jamais en mrkdwn
le texte d’une carte à boutons ne notifie personne @cap:approuver-une-action/moteur Telegram déclare ce que son clavier porte : 100 boutons, 8 par rangée
Discord : une réécriture de carte ne notifie personne @cap:approuver-une-action/moteur editMessageText : aucune mention ne pinge
Slack : le texte de repli d’une carte est neutralisé @cap:approuver-une-action/moteur sendCard et editMessageText échappent < > & dans `text`
after a resync, the waiting cards come back (#1012) @cap:approuver-une-action/moteur a card asked before the runner restarted reaches the device after `resync`, read from the cards route
after a resync, the waiting cards come back (#1012) @cap:approuver-une-action/moteur a re-read the network interrupted is done again, before the next `ready`
a re-read after resync settles what the gap settled (review of #1013, pass 2) @cap:approuver-une-action/moteur a card settled during the gap gets its card.closed after resync, marked as learned from the re-read
a re-read after resync settles what the gap settled (review of #1013, pass 2) @cap:approuver-une-action/moteur a card still waiting is not delivered twice; a new one is delivered once
a re-read after resync settles what the gap settled (review of #1013, pass 2) @cap:approuver-une-action/moteur two resync in a row: each re-read settles what it no longer lists, and delivers nothing twice
a re-read after resync settles what the gap settled (review of #1013, pass 2) @cap:approuver-une-action/moteur a settled card is never brought back: not by a replay, not by a re-read that still lists it
a re-read after resync settles what the gap settled (review of #1013, pass 2) @cap:approuver-une-action/moteur a card.closed on the stream says its source and its text, once
Layer 1 — baseline discipline la règle de `purpose` vit dans le schéma et le refus, plus dans le socle @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
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
handleApprovalCallback — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur apr:<id>:a sur une élicitation : refusé, rien n'est écrit
handleApprovalCallback — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur apr:<id>:r sur une élicitation : refusé, rien n'est écrit
handleApprovalCallback — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur apr:<id>:wc sur une élicitation : refusé, rien n'est écrit
approval cards follow their request @cap:approuver-une-action/moteur records where the card went: channel, delivering agent, conversation, message id
approval cards follow their request @cap:approuver-une-action/moteur answered elsewhere (dashboard): the Telegram card states the decision and loses its buttons
approval cards follow their request @cap:approuver-une-action/moteur expired by the TTL sweep: the cron tick rewrites the Discord card as expired, and counts exactly it
approval cards follow their request @cap:approuver-une-action/moteur expired because its run was cancelled (cancelJobTree): the Telegram card of the MCP job says so
approval cards follow their request @cap:approuver-une-action/moteur a question answered elsewhere: its Telegram card shows the chosen option, buttons gone
approval cards follow their request @cap:approuver-une-action/moteur a channel that cannot edit (WhatsApp): nothing is sent, the card is closed as cannot_edit, and it is SAID
approval cards follow their request @cap:approuver-une-action/moteur a card is rewritten once: the sweep after an answer finds nothing left to do
approval cards follow their request @cap:approuver-une-action/moteur a card whose request is still pending is left alone
a failed edit is not a success @cap:approuver-une-action/moteur an edit that fails is retried on the next tick, and succeeds there
a failed edit is not a success @cap:approuver-une-action/moteur a tick whose edit fails counts it as failed, never as updated
a failed edit is not a success @cap:approuver-une-action/moteur gives up after 5 failed edits, SAYS so, and never takes the card again
a failed edit is not a success @cap:approuver-une-action/moteur missing credentials are a transient failure: the card is updated once they are back
a failed edit is not a success @cap:approuver-une-action/moteur an error reading the cards reaches the caller (the tick reports it) instead of looking like "nothing to do"
a tap on the card: one write, the same text @cap:approuver-une-action/moteur Telegram ✅: the card is rewritten ONCE, by the settlement point
a tap on the card: one write, the same text @cap:approuver-une-action/moteur Telegram « Always allow » confirmed: ONE write, and it says the tool will now run without asking
a tap on the card: one write, the same text @cap:approuver-une-action/moteur « Always allow » under the auto-run brake: the card says it will keep asking (same text, from the same point)
a tap on the card: one write, the same text @cap:approuver-une-action/moteur Discord ✅: the tap is acknowledged BEFORE the decision, without a write, and the card is rewritten ONCE by the settlement point
a tap on the card: one write, the same text @cap:approuver-une-action/moteur race: the request expires while « Always allow? » is being shown — the card ends without buttons, saying expired
a tap on the card: one write, the same text @cap:approuver-une-action/moteur race: the request is answered elsewhere while « Back » restores the card — the card ends without buttons
every write of a card goes through the card protocol @cap:approuver-une-action/moteur a 429 streak makes the card give up; a tap on it puts it back in the queue, and the tick repairs it
every write of a card goes through the card protocol @cap:approuver-une-action/moteur a tap on a settled request whose card was never recorded adopts the card and settles it
every write of a card goes through the card protocol @cap:approuver-une-action/moteur « Always allow? » then « Back » while the dashboard decides: the card ends on the settled text
every write of a card goes through the card protocol @cap:approuver-une-action/moteur « Back » on a request without entity (« Still pending ») while the dashboard decides: the card ends on the settled text
every write of a card goes through the card protocol @cap:approuver-une-action/moteur a confirmation tap on a request already closed never puts buttons back
every write of a card goes through the card protocol @cap:approuver-une-action/moteur showApprovalCard on a request already closed never writes the asked view — only the settled text
every write of a card goes through the card protocol @cap:approuver-une-action/moteur « Back » on a request without entity keeps Approve / Reject while it is pending, and a tap on them decides it
every write of a card goes through the card protocol @cap:approuver-une-action/moteur showApprovalCard: a failing final settlement is logged, never thrown at the handler — the tick takes it over
a card rendered from its row shows the row as it stands @cap:approuver-une-action/moteur a change written while the card is being shown is shown before the lease is released
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur un refus avec note, depuis le dashboard : la tête la reçoit pendant qu’elle attend
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur une approbation avec note sur un PETIT-enfant : la tête, pas l’intermédiaire
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur une question répondue d’un bouton TELEGRAM : la réponse choisie va à la tête
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur une réponse LIBRE du dashboard : ses mots, tels quels
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur le formulaire d’un serveur MCP : ses valeurs vont à la tête
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur une carte sur la TÊTE elle-même : rien de plus dans sa file, elle a son résultat d’outil
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur la tête a FINI : rien n’est écrit, aucune tête ne naît de sa file
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur un clic seul, sans un mot : rien à citer
les mots de la personne sur une carte vont à la tête du run @cap:approuver-une-action/moteur deux réponses qui se croisent : une seule décision, une seule remise
la décision ne dépend jamais de la remise, et le cadre dit qui a répondu @cap:approuver-une-action/moteur une chaîne de parents en BOUCLE : la décision est écrite, la remise manque et se dit
la décision ne dépend jamais de la remise, et le cadre dit qui a répondu @cap:approuver-une-action/moteur un parent d’une AUTRE entité : la décision est écrite, rien ne traverse
la décision ne dépend jamais de la remise, et le cadre dit qui a répondu @cap:approuver-une-action/moteur la tête a fini : la personne le lit sur TELEGRAM, là où elle a répondu
la décision ne dépend jamais de la remise, et le cadre dit qui a répondu @cap:approuver-une-action/moteur un MEMBRE qui répond du dashboard est dit membre, jamais propriétaire
la décision ne dépend jamais de la remise, et le cadre dit qui a répondu @cap:approuver-une-action/moteur une réponse du dashboard SANS répondant est refusée, la carte reste ouverte
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur le DASHBOARD : la file de la tête et sa requête au modèle portent user:<id>, jamais l’e-mail
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur l’API (une session, pas le web) : user:<id> du compte de la session, jamais son e-mail
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur un compte qui n’existe plus : la forme le dit, fixe, au lieu d’en changer en silence
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur TELEGRAM : l’id du chat, celui que les outils d’envoi acceptent, jamais l’id de la ligne
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur DISCORD, et tout autre canal : l’id de la conversation du canal, jamais l’id de la ligne
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur WHATSAPP : une conversation directe s’appelle par un numéro — le modèle n’en lit que le handle
#810 — le modèle lit un rôle et un id opaque, jamais une donnée de contact @cap:approuver-une-action/moteur une conversation qu’aucune ligne n’autorise : le rôle le dit, l’adresse reste celle du canal
la tête lit les mots de la personne à sa reprise @cap:approuver-une-action/moteur sa PREMIÈRE requête porte le résultat du délégué, PUIS la note, mot pour mot
personWordsOnCard @cap:approuver-une-action/moteur cite la note d’un refus mot pour mot, sous le cadre de la carte
personWordsOnCard @cap:approuver-une-action/moteur garde une note de plusieurs lignes et ses espaces telle quelle
personWordsOnCard @cap:approuver-une-action/moteur une question : la réponse, et la note quand il y en a une
personWordsOnCard @cap:approuver-une-action/moteur un formulaire de serveur MCP : ses valeurs, en données
personWordsOnCard @cap:approuver-une-action/moteur rien à citer : un clic seul, une note vide ou d’espaces, un formulaire vide
personWordsOnCard @cap:approuver-une-action/moteur une carte sans agent nommé : le champ manque, rien n’est inventé
personWordsOnCard @cap:approuver-une-action/moteur un MEMBRE qui répond est dit membre : rien ne le fait passer pour le propriétaire
personWordsOnCard @cap:approuver-une-action/moteur un répondant qu’aucune ligne ne décrit est dit tel quel
personWordsOnCard @cap:approuver-une-action/moteur cardCarriesWords lit les mêmes champs que le message cite
la question part là où la demande est née @cap:approuver-une-action/moteur Telegram : les images puis la carte, dans la conversation de la demande, pas celle du propriétaire
la question part là où la demande est née @cap:approuver-une-action/moteur une demande faite sur le web ne reçoit rien sur Telegram
la question part là où la demande est née @cap:approuver-une-action/moteur un chat enregistré sur un AUTRE canal n’est jamais utilisé : la question reste sur le dashboard
la question part là où la demande est née @cap:approuver-une-action/moteur un canal sans boutons reçoit la question et le renvoi au dashboard, avec la raison
la question part là où la demande est née @cap:approuver-une-action/moteur un formulaire trop grand pour le canal n’est pas amputé : renvoi au dashboard, avec la raison
remplir la carte depuis le canal @cap:approuver-une-action/moteur un choix posé est gardé en base et la carte réécrite le montre
remplir la carte depuis le canal @cap:approuver-une-action/moteur un geste venu d’une autre conversation est refusé et ne touche rien
remplir la carte depuis le canal @cap:approuver-une-action/moteur ✏️ puis une réponse tapée : refusée hors bornes (dit), prise dans les bornes
remplir la carte depuis le canal @cap:approuver-une-action/moteur une réponse à un autre message que la carte suit son chemin habituel
remplir la carte depuis le canal @cap:approuver-une-action/moteur Send : un formulaire incomplet n’est pas envoyé, et le dit
remplir la carte depuis le canal @cap:approuver-une-action/moteur Send d’une carte périmée n’envoie rien et redessine la carte
remplir la carte depuis le canal @cap:approuver-une-action/moteur Send d’un formulaire complet : la demande est tranchée avec exactement ces valeurs
remplir la carte depuis le canal @cap:approuver-une-action/moteur Decline : la demande est refusée ; un geste sur la carte tranchée le dit
remplir la carte depuis le canal @cap:approuver-une-action/moteur un bouton qui ne désigne plus rien est refusé, avec la raison
le brouillon d’une question close @cap:approuver-une-action/moteur un geste arrivé après la décision ne réécrit pas le formulaire
un brouillon s’écrit sur celui qui a été lu @cap:approuver-une-action/moteur une écriture sur un brouillon qui a changé depuis sa lecture est refusée
un brouillon s’écrit sur celui qui a été lu @cap:approuver-une-action/moteur Send ne tranche pas sur un brouillon qui a changé depuis sa lecture
un brouillon s’écrit sur celui qui a été lu @cap:approuver-une-action/moteur une valeur qui rendrait la carte trop longue pour le canal n’est pas prise, et le dit
une réponse dans le fil d’une carte n’est qu’une réponse @cap:approuver-une-action/moteur la réponse à la carte d’une question se reconnaît, une autre non
ce que le canal reçoit est ce que la carte dit @cap:approuver-une-action/moteur un renvoi au dashboard n’est pas une carte : une réponse à ce message suit son chemin habituel
ce que le canal reçoit est ce que la carte dit @cap:approuver-une-action/moteur une image qui n’a pas pu partir : pas de carte qui la dirait « au-dessus », le renvoi au dashboard le dit
ce que le canal reçoit est ce que la carte dit @cap:approuver-une-action/moteur la carte porte la description de chaque champ, comme le dashboard
une carte qui ne part pas, une carte déjà tranchée @cap:approuver-une-action/moteur l’envoi de la carte échoue : le renvoi au dashboard part, avec la raison
une carte qui ne part pas, une carte déjà tranchée @cap:approuver-une-action/moteur une réponse dans le fil d’une carte déjà tranchée suit son chemin habituel
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur pose la ligne (kind, outil, appel, formulaire, images) déjà marquée exécutée
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur Envoyer : le serveur reçoit accept et le contenu validé, la ligne le garde
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur Refuser : le serveur reçoit decline, sans contenu
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur personne ne répond à temps : cancel, et la ligne dit pourquoi
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur le run perd son job (annulé) : cancel, `system:job_cancelled`
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur le serveur retire sa question : cancel, `system:server_cancelled`
la question d’un serveur MCP, posée et attendue sans suspendre @cap:approuver-une-action/moteur un formulaire hors du protocole est refusé au serveur, et aucune ligne n’attend
resolveApprovalDecision — une élicitation @cap:approuver-une-action/moteur envoyer sans contenu est refusé, la ligne reste ouverte
resolveApprovalDecision — une élicitation @cap:approuver-une-action/moteur un contenu hors du formulaire est refusé, champ par champ
resolveApprovalDecision — une élicitation @cap:approuver-une-action/moteur un contenu valide est gardé, et le job n’est PAS relancé
resolveApprovalDecision — une élicitation @cap:approuver-une-action/moteur une option de question sur une élicitation est refusée
resolveApprovalDecision — une élicitation @cap:approuver-une-action/moteur un contenu sur une approbation ordinaire est refusé, jamais jeté
les lecteurs du runner : une élicitation n’est pas un appel qui attend @cap:approuver-une-action/moteur une élicitation tranchée, même sans executed_at, ne réveille pas un job suspendu
les lecteurs du runner : une élicitation n’est pas un appel qui attend @cap:approuver-une-action/moteur le balayage TTL ferme une élicitation échue sans relancer le job
une question vit tant que son appel vit @cap:approuver-une-action/moteur le passage de démarrage ne ferme pas la question d’un appel qu’un runner vivant tient
une question vit tant que son appel vit @cap:approuver-une-action/moteur la question d’un job que plus aucun runner ne tient est fermée avec lui, pas ses approbations
une question vit tant que son appel vit @cap:approuver-une-action/moteur le faucheur à cinq minutes ferme aussi la question du job qu’il échoue
une question trop longue est refusée avant toute ligne @cap:approuver-une-action/moteur le serveur reçoit une erreur qui le dit ; aucune ligne n’attend
notifyApprovalCreated — la question d’un serveur MCP @cap:approuver-une-action/moteur une demande faite sur Discord y reçoit la carte à remplir, dans SA conversation
notifyApprovalCreated — la question d’un serveur MCP @cap:approuver-une-action/moteur une demande faite sur le web garde sa question sur le dashboard
notifyApprovalCreated — la question d’un serveur MCP @cap:approuver-une-action/moteur une demande venue du MCP de Nodal (personne sur ce canal) reste sur le dashboard
settledApprovalCardText — une élicitation tranchée @cap:approuver-une-action/moteur répondue, refusée, fermée sans réponse
Discord : un appui sur la carte d’une question de serveur MCP @cap:approuver-une-action/moteur pose la valeur, réécrit la carte avec ses boutons, acquitte le geste
Discord : un appui sur la carte d’une question de serveur MCP @cap:approuver-une-action/moteur un appui venu d’une autre conversation est refusé, à la personne seule
Slack : un appui sur la carte d’une question de serveur MCP @cap:approuver-une-action/moteur pose la valeur et réécrit la carte avec ses boutons
Slack : un appui sur la carte d’une question de serveur MCP @cap:approuver-une-action/moteur Decline : refusé à la personne d’une autre conversation, tranché depuis la bonne
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
what a job launched from a device asks comes back to THAT device (#945) @cap:approuver-une-action/moteur a question reaches device A’s stream as a card — not device B, not the owner’s Telegram — and closes there when answered
what a job launched from a device asks comes back to THAT device (#945) @cap:approuver-une-action/moteur contrast: the same question from a job made elsewhere, with the owner’s chat, goes to the owner’s Telegram
what a job launched from a device asks comes back to THAT device (#945) @cap:approuver-une-action/moteur an approval (a gated action) reaches device A as a card: the agent’s purpose quoted, approve and reject
after a resync, a device re-reads its pending cards (#945) @cap:approuver-une-action/moteur a card asked before a restart survives it: listed as sent, answered, and the job resumes
after a resync, a device re-reads its pending cards (#945) @cap:approuver-une-action/moteur an approval waiting on the device is listed as the card it was sent as; settled ones and forms are not
a job of a device’s run answers on that device, however it was born (#945) @cap:approuver-une-action/moteur a task-board child (born without a chat): its states reach the device, and its card survives a resync
a job of a device’s run answers on that device, however it was born (#945) @cap:approuver-une-action/moteur a delegate’s and a relaunched head’s pending cards are listed for the device of the run
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
a connector operation marked requiresApproval, on the real job loop @cap:approuver-une-action/moteur suspends with a pending request and no Airtable call; once approved, deletes exactly once and completes
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
une question de serveur MCP, de bout en bout @cap:approuver-une-action/moteur serveur demande → ligne → réponse → le serveur reçoit le formulaire rempli
une question de serveur MCP, de bout en bout @cap:approuver-une-action/moteur Refuser : le serveur lit decline, et le job continue
une question de serveur MCP, de bout en bout @cap:approuver-une-action/moteur à la reprise d’un job, une élicitation tranchée n’est jamais relue comme un appel à exécuter
l’attente d’une réponse n’est pas du temps travaillé @cap:approuver-une-action/moteur le temps passé à attendre la personne ne compte pas dans la durée du job
une question de serveur MCP, demandée sur Telegram, répondue sur Telegram @cap:approuver-une-action/moteur image et carte dans la conversation de la demande ; gestes et réponse tapée ; le serveur reçoit le formulaire
return_result tells the model that waiting on a person is delivered, not blocked @cap:approuver-une-action/moteur orchestrator: the real LLM request carries both outcomes in return_result and the baseline half-sentence
return_result tells the model that waiting on a person is delivered, not blocked @cap:approuver-une-action/moteur agent: the real LLM request carries both outcomes in return_result and the baseline half-sentence
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
POST /api/approve — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur transporte le formulaire jusqu’à la ligne, sans relancer le job
POST /api/approve — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur un formulaire invalide rend ses erreurs champ par champ
POST /api/approve — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur envoyer sans contenu : 400 content_required
la question d’un serveur MCP remplie depuis Telegram @cap:approuver-une-action/moteur un appui, ✏️, une réponse tapée, Send : la demande est tranchée et aucun job ne naît
la question d’un serveur MCP remplie depuis Telegram @cap:approuver-une-action/moteur une réponse à un AUTRE message reste un message : un tour de conversation
la question d’un serveur MCP remplie depuis Telegram @cap:approuver-une-action/moteur une valeur refusée est dite dans la conversation, et rien n’est pris
makeDiscordInteractionAck @cap:approuver-une-action/moteur before any acknowledgement, an ephemeral reply is the initial response
makeDiscordInteractionAck @cap:approuver-une-action/moteur after acknowledge (deferUpdate), an ephemeral reply goes out as a follow-up and still reaches the tapper
routeDiscordInteraction — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur un tap ✅ sur une élicitation est refusé, la ligne reste ouverte
routeSlackInteraction — la question d’un serveur MCP (0145) @cap:approuver-une-action/moteur un tap ✅ sur une élicitation est refusé, la ligne reste ouverte
le socket Slack reçoit chaque bouton que le routeur sait router @cap:approuver-une-action/moteur approbation, question de serveur, confirmation d’accès
ADAPTER_REGISTRY: each connector tool carries its descriptor @cap:approuver-une-action/moteur every tool of every factory has the risk and default approval of its descriptor
ADAPTER_REGISTRY: each connector tool carries its descriptor @cap:approuver-une-action/moteur covers every connector, both factories, and every operation marked requiresApproval
ADAPTER_REGISTRY: each connector tool carries its descriptor @cap:approuver-une-action/moteur every descriptor has a tool: the factories build exactly the operations the UI shows
ADAPTER_REGISTRY: each connector tool carries its descriptor @cap:approuver-une-action/moteur Gmail's sends are destructive, as their descriptor says
bindOperationDescriptors fails loud, never defaults @cap:approuver-une-action/moteur a tool without a descriptor throws, naming the connector and the tool
bindOperationDescriptors fails loud, never defaults @cap:approuver-une-action/moteur a descriptor without a tool throws, naming the operation
bindOperationDescriptors fails loud, never defaults @cap:approuver-une-action/moteur applies risk and approval from the descriptor, whatever the tool object carried
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur a script that installs: said with the file and the line, never "likely read"
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur what the text shows and what the code does are both said
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur code written into the command, and a script it could not read
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur a declared proof says it too
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur without reasons, the line reads the text as before
computeApprovalImpactLine — what the gate read in the code a command runs (#635) @cap:approuver-une-action/moteur a token in a path is masked
la grammaire des boutons @cap:approuver-une-action/moteur tient sous les 64 octets de Telegram et se relit
la grammaire des boutons @cap:approuver-une-action/moteur refuse ce qui n’est pas à elle
le brouillon @cap:approuver-une-action/moteur part des défauts du serveur ; facultatif, un interrupteur ou une liste ne part que touché
le brouillon @cap:approuver-une-action/moteur une liste vidée part vide : la personne a choisi « aucun »
le brouillon @cap:approuver-une-action/moteur un champ nommé __proto__ est un champ du brouillon
le brouillon @cap:approuver-une-action/moteur un geste pose une valeur EXPLICITE (rejouer un vieux bouton ne bascule rien)
le brouillon @cap:approuver-une-action/moteur un bouton qui ne désigne aucun champ ou option est refusé, avec la raison
le brouillon @cap:approuver-une-action/moteur ✏️ met un champ en attente de la valeur tapée
la valeur tapée en réponse @cap:approuver-une-action/moteur lit un nombre dans ses bornes, et libère l’attente
la valeur tapée en réponse @cap:approuver-une-action/moteur refuse une valeur hors bornes ou illisible, et garde l’attente
la valeur tapée en réponse @cap:approuver-une-action/moteur un texte libre est gardé tel quel ; sans champ en attente, rien n’est lu
la carte @cap:approuver-une-action/moteur cite la question, montre les valeurs, et porte un bouton par geste
la carte @cap:approuver-une-action/moteur les boutons portent les libellés que le serveur leur donne
la carte @cap:approuver-une-action/moteur dit quel champ attend une réponse tapée, et comment la donner
la carte @cap:approuver-une-action/moteur une carte que le canal ne peut pas porter est refusée, avec la raison
la carte @cap:approuver-une-action/moteur la révision change avec les valeurs, pas avec leur ordre
la carte tient dans un message du canal @cap:approuver-une-action/moteur une carte plus longue que le canal n’en montre est refusée, avec la raison
la carte : un texte tiers reste dans son cadre @cap:approuver-une-action/moteur chaque ligne du message du serveur est citée : aucune ne se fait passer pour la carte
la carte : un texte tiers reste dans son cadre @cap:approuver-une-action/moteur une carte avec plus de boutons que le canal n’en porte est refusée, avec la raison
une réponse tapée va au champ qu’elle visait @cap:approuver-une-action/moteur le champ en attente a changé depuis la lecture : refusée, rien n’est écrit
parseElicitationSchema @cap:approuver-une-action/moteur lit chaque sorte de champ du protocole, avec titres, bornes et défauts
parseElicitationSchema @cap:approuver-une-action/moteur refuse un champ qu’il ne sait pas dessiner, avec la raison
parseElicitationSchema @cap:approuver-une-action/moteur refuse un champ qui n’admet aucune réponse valide, quelle que soit sa sorte
validateElicitationContent @cap:approuver-une-action/moteur rend le contenu valide tel quel
validateElicitationContent @cap:approuver-une-action/moteur dit chaque problème, champ par champ, et ne corrige rien
validateElicitationContent @cap:approuver-une-action/moteur un champ obligatoire absent est refusé
readElicitationAttachments @cap:approuver-une-action/moteur garde les images valides, écarte les autres avec leur raison
readElicitationAttachments @cap:approuver-une-action/moteur plafonne la taille et le nombre
readElicitationAttachments @cap:approuver-une-action/moteur sans pièce jointe, rien ; une clé qui n’est pas une liste est dite
readElicitationActions — les libellés que le serveur donne à ses boutons @cap:approuver-une-action/moteur lit les deux libellés, nettoyés de tout ce qui n’est pas du texte affichable
readElicitationActions — les libellés que le serveur donne à ses boutons @cap:approuver-une-action/moteur sans clé, aucun libellé : les boutons gardent les leurs
readElicitationActions — les libellés que le serveur donne à ses boutons @cap:approuver-une-action/moteur un libellé invalide est écarté AVEC sa raison, l’autre est gardé
readElicitationActions — les libellés que le serveur donne à ses boutons @cap:approuver-une-action/moteur la ligne garde les libellés ; relus, ils repassent la même règle
les dates d’un formulaire, au sens strict @cap:approuver-une-action/moteur une date du calendrier, rien d’autre
les dates d’un formulaire, au sens strict @cap:approuver-une-action/moteur une date-heure RFC 3339, avec son fuseau
un champ nommé __proto__ est un champ @cap:approuver-une-action/moteur validé, il est gardé comme propriété propre de la réponse
un formulaire a une taille bornée @cap:approuver-une-action/moteur trop de champs, trop d’options, trop gros : refusé avec la raison
les longueurs se comptent en caractères @cap:approuver-une-action/moteur un emoji est un caractère
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: the agent row decides @cap:approuver-une-action/moteur at run time only the agent row for the exact tool applies, whatever else exists
explainApprovalRules: the agent row decides @cap:approuver-une-action/moteur a server, a `*` or an Everyone rule decides NOTHING for a tool without a row
explainApprovalRules: the agent row decides @cap:approuver-une-action/moteur ignores rows belonging to another agent
explainApprovalRules: the agent row decides @cap:approuver-une-action/moteur hands back the WINNING row even when two rules share an id
explainApprovalRules — the folder condition @cap:approuver-une-action/moteur applies, and comes before the tool row, 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 tool row 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 decide RIEN : la ligne de l outil gagne
executeTool — destructive_gate workspace @cap:approuver-une-action/moteur auto-approves ORDINARY run_command (no prompt): the row the level wrote says Autonomous
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
web readers order approval requests by creation @cap:approuver-une-action/moteur /approvals lists same-millisecond requests newest created first
web readers order approval requests by creation @cap:approuver-une-action/moteur the conversation feed shows elicitations in the order they were asked
web readers order approval requests by creation @cap:approuver-une-action/moteur the sidebar recents break a same-second answer tie by creation, newest first
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 la ligne de l’outil et sa ligne de dossier COEXISTENT : changer l’une ne touche pas l’autre (#917)
la règle confinée à un dossier @cap:approuver-une-action/moteur un changement qui garde le dossier le GARDE vraiment
une permission partout ne touche jamais une ligne de dossier (#917) @cap:approuver-une-action/moteur une autorisation GLOBALE sur le même outil écrit la ligne de l’outil, et laisse le dossier
une permission partout ne touche jamais une ligne de dossier (#917) @cap:approuver-une-action/moteur Run commands et la bascule code_task écrivent la ligne de l’outil, jamais celle du dossier
une permission partout ne touche jamais une ligne de dossier (#917) @cap:approuver-une-action/moteur la ligne d’un outil ne se retire pas : sans elle, la porte refuserait l’outil
la chaîne d’une demande SANS agent @cap:approuver-une-action/moteur ne montre aucune ligne : une règle pour tous les agents ne décide d’aucun appel (#917)
la chaîne d’une demande SANS agent @cap:approuver-une-action/moteur pour un outil qui remplace un fichier partagé, la carte montre aussi le réglage, gagnant quand l’outil est Autonomous
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
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur Envoyer transporte le contenu jusqu’au runner, tel que la personne l’a rempli
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur un entier hors bornes est refusé AVANT le runner, avec le champ et la raison
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur Envoyer sans contenu n’est pas une approbation : refusé, rien ne part
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur Refuser part sans contenu
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur un contenu sur une approbation ordinaire est refusé, jamais jeté en silence
resolveApprovalAction sur une élicitation @cap:approuver-une-action/moteur les erreurs de champ du runner sont rendues lisibles
les lecteurs web : une élicitation n’est pas une approbation @cap:approuver-une-action/moteur listApprovalsAction rend la question (serveur, message, images SANS octets)
les lecteurs web : une élicitation n’est pas une approbation @cap:approuver-une-action/moteur RECENTS dit « printer asked », jamais l’appel de l’outil MCP
les lecteurs web : une élicitation n’est pas une approbation @cap:approuver-une-action/moteur le fil montre la question en attente HORS du groupe replié du run
GET /api/approvals/<id>/attachments/<n> @cap:approuver-une-action/moteur sert l’image de sa propre entité, avec son type et nosniff
GET /api/approvals/<id>/attachments/<n> @cap:approuver-une-action/moteur 404 pour l’image d’une autre entité, comme pour une absente
listApprovalsAction — the card names the instance the requesting agent holds @cap:approuver-une-action/moteur two instances of one server, one per agent: each approval names its own
listApprovalsAction carries the gate reasons (#464) @cap:approuver-une-action/moteur reads them back, masked
listApprovalsAction carries the gate reasons (#464) @cap:approuver-une-action/moteur reads back the lines found in a script and the scripts not read, masked (#635)
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: its row is lit, Block reads back, and the floor is said @cap:executer-une-commande/ecran
chatFailureText @cap:executer-une-commande/ecran auto_run_paused
chatFailureText @cap:executer-une-commande/ecran auto_run_state_unreadable
74 more
chatFailureText @cap:executer-une-commande/ecran cli_runtime_error: boom
CLI runtime permissions, as stored @cap:executer-une-commande/ecran back to read only clears the shell: returning to write does not bring it back
CLI runtime permissions, as stored @cap:executer-une-commande/ecran shell auto is refused in read mode, and nothing is stored
CLI runtime permissions, as stored @cap:executer-une-commande/ecran shell auto is refused in no setting at all (read by default), and nothing is stored
the sandbox switch, persisted @cap:executer-une-commande/ecran the owner turns it off and on; the base says so, read by the runner reader
the sandbox switch, persisted @cap:executer-une-commande/ecran anyone else is refused, and nothing changes
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran adds a real folder; adding it again is refused as already allowed
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran refuses the data folder of Nodal and any folder under it, with its code and the folder that holds it, writing nothing
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran a relative path or a missing folder is refused
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran a drive root asks for a confirmation first, and is written only once confirmed
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran the home folder asks for a confirmation too, and names the Nodal data it holds
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran a folder that holds the home folder (C:Users, /home) asks for a confirmation, and is written only once confirmed
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran the parent of a moved NODALAI_HOME asks for a confirmation; the instance itself stays refused
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran removing an added folder forgets it; removing a detected one records the removal; adding it back restores it
the allowed folders, persisted as gestures only @cap:executer-une-commande/ecran the tool cache cannot be removed, and the reason is said
getSandboxAction reads the runner and checks its answer @cap:executer-une-commande/ecran asks for the workspace of the session, and adds who may change it
getSandboxAction reads the runner and checks its answer @cap:executer-une-commande/ecran an answer of another shape is an error said, never half a screen
getSandboxAction reads the runner and checks its answer @cap:executer-une-commande/ecran a refusal of the runner keeps its code; an unreachable runner is said
sandboxBannerWords @cap:executer-une-commande/ecran silent only when the runner says the sandbox confines
sandboxBannerWords @cap:executer-une-commande/ecran speaks while it is off, unavailable, not on this system, or unread
sandboxBannerWords @cap:executer-une-commande/ecran a code it does not know is shown as it is, never replaced by a made-up sentence
the words of the sandbox section @cap:executer-une-commande/ecran splits a folder into its name and its parent, a volume root being its own name, on any system
the words of the sandbox section @cap:executer-une-commande/ecran tags a folder by where it comes from, or by why it does not apply
the words of the sandbox section @cap:executer-une-commande/ecran the perimeter counts what the runner counted, in warn only when the user turned it off
the words of the sandbox section @cap:executer-une-commande/ecran a volume root names the system it belongs to
the words of the sandbox section @cap:executer-une-commande/ecran a folder that holds the home folder or Nodal data names them, and the known limit on the data
the words of the sandbox section @cap:executer-une-commande/ecran an agent outside the sandbox is named by the runtime label; an unknown runtime is never called confined
SandboxSection, active @cap:executer-une-commande/ecran the state card says it confines, names the engine in words and when it applies
SandboxSection, active @cap:executer-une-commande/ecran the known limits open as plain sentences indexed by code, never the backend text
SandboxSection, active @cap:executer-une-commande/ecran the three perimeter cards: the folder count the runner gives, the data folder, the refused ports
SandboxSection, active @cap:executer-une-commande/ecran allowed folders: name, parent, source tag, one action column, removed ones apart
SandboxSection, active @cap:executer-une-commande/ecran agent folders are grouped by folder, with a pill per agent; a runtime outside the sandbox is warned, not hidden
SandboxSection, active @cap:executer-une-commande/ecran turning it off asks first with the consequence; confirmed, the card turns to off
SandboxSection, active @cap:executer-une-commande/ecran adding a volume root shows the confirmation the action asks for, then adds it confirmed
SandboxSection, active @cap:executer-une-commande/ecran a refusal of Nodal's data folder is said inline, and can be dismissed
SandboxSection, active @cap:executer-une-commande/ecran someone who is not the owner sees everything and changes nothing
SandboxSection, active @cap:executer-une-commande/ecran uses no em dash (UI copy rule)
SandboxSection, off and unavailable @cap:executer-une-commande/ecran off: the card says so in warn, the perimeter is Anywhere / Nothing / Everything, folders are kept but not applied
SandboxSection, off and unavailable @cap:executer-une-commande/ecran turning it back on asks nothing
SandboxSection, off and unavailable @cap:executer-une-commande/ecran on a system without an engine yet, it names the system, and every control is off
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran knows every unavailable code the engine can give
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NOT_IMPLEMENTED stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NOT_IMPLEMENTED stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NOT_IMPLEMENTED the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BACKEND_MISSING stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BACKEND_MISSING stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BACKEND_MISSING the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PLATFORM_UNSUPPORTED stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PLATFORM_UNSUPPORTED stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PLATFORM_UNSUPPORTED the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_SELF_TEST_FAILED stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_SELF_TEST_FAILED stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_SELF_TEST_FAILED the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_START_FAILED stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_START_FAILED stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_START_FAILED the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_NODE_UNAVAILABLE stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_NODE_UNAVAILABLE stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_BROKER_NODE_UNAVAILABLE the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PROXY_UNREACHABLE stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PROXY_UNREACHABLE stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_PROXY_UNREACHABLE the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NODAL_PORTS_UNKNOWN stored choice true: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NODAL_PORTS_UNKNOWN stored choice false: the switch is OFF and locked, the choice is kept and said, no owner-only tag
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran when the sandbox is unavailable with SANDBOX_NODAL_PORTS_UNKNOWN the banner and the Settings row say the same as the card
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran available and on: the switch is on and clickable, with the owner-only tag and no stored-choice line
SandboxSection, the switch says what the engine applies @cap:executer-une-commande/ecran available and off by the owner: the switch is off but clickable, and no stored-choice line
Runtime card, shell commands setting @cap:executer-une-commande/ecran Claude Code in write mode: enabling asks first, then sends shell auto
Runtime card, shell commands setting @cap:executer-une-commande/ecran Claude Code, shell on: turning it off sends shell none, with no confirmation
Runtime card, shell commands setting @cap:executer-une-commande/ecran Claude Code in read only: the switch is off and locked, and says why
Runtime card, shell commands setting @cap:executer-une-commande/ecran Claude Code under the workspace brake: off, locked, and it says the brake is why
Runtime card, shell commands setting @cap:executer-une-commande/ecran Claude Code whose shell tools are forbidden elsewhere: shown off, with the reason
Runtime card, shell commands setting @cap:executer-une-commande/ecran Codex: no switch, the sandbox rule is stated
Runtime card, shell commands setting @cap:executer-une-commande/ecran Codex under the workspace brake: the screen says it does not start, as the runner refuses it
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
1241 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
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un objet libre dont les octets ne hachent pas vers son nom est refusé
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un objet dont l’en-tête annonce une autre taille que son contenu est refusé
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un objet lié en dur depuis le workspace n’est pas adopté : le magasin garde les octets vérifiés
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un objet déjà dans le magasin n’est jamais remplacé, même par les mêmes octets décompressés
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un paquet corrompu est refusé, et rien n’en entre dans le magasin
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur un paquet lié en dur depuis le workspace n’est pas adopté : le magasin garde le paquet vérifié
objects leave the scratch only verified, and bound to what was verified @cap:executer-une-commande/moteur l’import est borné par la borne de l’instantané : une bombe zlib le fait échouer, fort
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur un index marqué « assume-unchanged » par le processus planté est refusé, et l’index du magasin reste le bon
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur un index plus gros que ce qu’un index de cet arbre peut peser est refusé SANS être lu
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur la borne de taille laisse passer l’index honnête d’un arbre large et profond, sous-dépôt compris
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur un index dont une entrée ne correspond pas à l’arbre photographié est refusé
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur un index honnête est gardé, sans les extensions qu’un processus planté pourrait forger
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur l’index repris du jetable garde la date que git lui a donnée : une réécriture du même tic reste vue
the scratch index enters the store only checked against the snapshot and rewritten @cap:executer-une-commande/moteur restoreCheckpoint ne garde pas l’index du jetable : un « assume-unchanged » planté ne cache rien à la photo suivante
scratch and incoming folders are reaped when an operation leaves them @cap:executer-une-commande/moteur un jetable de plus d’un jour est retiré à l’opération suivante ; un jetable récent est laissé
checkpoint store isolation: a worktree-reading git never gets the store as a writable root (#628 pass 5) @cap:executer-une-commande/moteur snapshot: every worktree git runs with the store out of its writable roots
checkpoint store isolation: a worktree-reading git never gets the store as a writable root (#628 pass 5) @cap:executer-une-commande/moteur frozen-index status: the worktree git runs with the store out of its writable roots
checkpoint store isolation: a worktree-reading git never gets the store as a writable root (#628 pass 5) @cap:executer-une-commande/moteur restore: the safety snapshot and the checkout run with the store out of their writable roots
readWorkspaceSandbox @cap:executer-une-commande/moteur a new workspace: the switch on, no gesture on the folders
readWorkspaceSandbox @cap:executer-une-commande/moteur persists the switch and the gestures, and the reader returns what was written
readWorkspaceSandbox @cap:executer-une-commande/moteur a column in an unknown shape fails loud with its code, never read as an empty list, and no gesture writes over it
readWorkspaceSandbox @cap:executer-une-commande/moteur an unknown workspace fails loud, it is never read as on
readWorkspaceSandbox @cap:executer-une-commande/moteur a value the reader would refuse is never written
readWorkspaceSandbox @cap:executer-une-commande/moteur a gesture that changes nothing writes nothing, and says what it found
applySandboxFolderGesture — one gesture on the gestures already made @cap:executer-une-commande/moteur add: a removed folder is restored first, even one that would need a confirmation
applySandboxFolderGesture — one gesture on the gestures already made @cap:executer-une-commande/moteur remove: an addition is forgotten, a detected folder is recorded removed once
applySandboxFolderGesture — one gesture on the gestures already made @cap:executer-une-commande/moteur restore: only a removed folder is restored
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
simultaneous gestures on the allowed folders all land @cap:executer-une-commande/moteur starts a real Postgres and applies the real migrations
simultaneous gestures on the allowed folders all land @cap:executer-une-commande/moteur a removal and an addition at the same time: both are in the base, the removed folder stays removed
simultaneous gestures on the allowed folders all land @cap:executer-une-commande/moteur two additions, and a restoration with a removal, at the same time: nothing is lost
bloc `## Git` : seulement pour qui peut lancer git @cap:executer-une-commande/moteur absent sans run_command ni code_task, présent avec l’un ou l’autre
bloc `## Git` : seulement pour qui peut lancer git @cap:executer-une-commande/moteur une session CLI de code garde le bloc : son shell est le sien, hors de la liste Nodal
buildTeamBlock — ce que chaque agent peut réellement faire (#506) @cap:organiser-equipe/moteur CLI runtime: the shell announced is the one the agent row and the brake give its turn @cap:executer-une-commande/moteur
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
buildClaudeTurnArgs write mode WITHOUT shell: Bash and PowerShell leave the palette, nothing is pre-allowed @cap:executer-une-commande/moteur
buildClaudeTurnArgs write mode WITH shell: Bash and PowerShell are pre-allowed, never also removed @cap:executer-une-commande/moteur
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur job path, claude CLI: commands only in write mode with shell 'auto', minus what is forbidden
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur job path, brake on: Claude still answers, with no shell; Codex does not start
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur job path: the brake engaged during the PREPARATION decides the turn
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur job path: the brake engaged DURING a turn with a shell cuts the CLI
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur chat path, claude CLI: commands only in write mode with shell 'auto', minus what is forbidden
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur chat path, brake on: Claude still answers, with no shell; Codex does not start
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur chat path: the brake engaged during the PREPARATION decides the turn
CLI runtime shell posture, from the agent row @cap:executer-une-commande/moteur chat path: the brake engaged DURING a turn with a shell cuts the CLI
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur job path: the session and the project registry are written before the brake verdict
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur job path: a Stop that lands with the brake is a cancellation, and the session is kept
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur job path: after another run re-claimed the job, the stale run writes no session and no current project
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur chat path: a Stop that lands with the brake is a stopped answer, not a brake failure
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur job path: a turn that answered while the brake was engaged stays a success
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur chat path: a turn that answered while the brake was engaged stays a success
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur chat path: a turn the brake cut keeps what it said, and what it wrote joins the project
a turn cut by the brake ends like any other turn @cap:executer-une-commande/moteur chat path: a turn the brake cut before it wrote or said anything moves no project
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur job path: a turn with a shell does not start when the brake cannot be read
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur job path: a turn with no shell does not need the brake, and runs
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur job path: a brake that stops being readable DURING the turn cuts the CLI
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur chat path: a turn with a shell does not start when the brake cannot be read
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur chat path: a turn with no shell does not need the brake, and runs
an unreadable brake stops a turn with a shell, and says so @cap:executer-une-commande/moteur chat path: a brake that stops being readable DURING the turn cuts the CLI
commandsPlacement — where the commands of each runtime run (#876) @cap:executer-une-commande/moteur nodal runs them through its tools, in the sandbox
commandsPlacement — where the commands of each runtime run (#876) @cap:executer-une-commande/moteur every CLI runtime this runner serves runs them in its own harness, outside the sandbox
commandsPlacement — where the commands of each runtime run (#876) @cap:executer-une-commande/moteur a runtime this runner does not serve is unknown, never assumed confined
watchBrakeDuringTurn @cap:executer-une-commande/moteur a brake read still in flight when the turn ends does not change what stopped it
watchBrakeDuringTurn @cap:executer-une-commande/moteur while the turn runs, the same read stops it
the auto-run brake acts on rows (#917) @cap:executer-une-commande/moteur engaged: every code-running tool of the agent asks, its Autonomous row dormant
the auto-run brake acts on rows (#917) @cap:executer-une-commande/moteur a rule for every agent on run_command does not stand in for the agent row: the brake still writes one
the auto-run brake acts on rows (#917) @cap:executer-une-commande/moteur a Block row stays Block: the brake only hardens
the auto-run brake acts on rows (#917) @cap:executer-une-commande/moteur released: the rows are applied as they are
releaseIfEnded @cap:executer-une-commande/moteur a job still alive keeps its processes: processing, pending (self-chain), awaiting approval or delegation
releaseIfEnded @cap:executer-une-commande/moteur a finished job releases them, whatever the end: completed, failed, cancelled
releaseIfEnded @cap:executer-une-commande/moteur a job whose row is gone releases them too
releaseIfEnded @cap:executer-une-commande/moteur closing one job leaves the other jobs’ scopes open
releaseIfEnded @cap:executer-une-commande/moteur the periodic sweep releases a job stopped while suspended, which no run sees end
every end of a job kills the process one of its commands left running, without the sandbox, in its command’s group (#750) @cap:executer-une-commande/moteur the job ends completed: the run that saw it end kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, in its command’s group (#750) @cap:executer-une-commande/moteur the job ends failed: the run that saw it end kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, in its command’s group (#750) @cap:executer-une-commande/moteur Stop: the job is cancelled while suspended, the sweep kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, in its command’s group (#750) @cap:executer-une-commande/moteur reclaimed: the job of a runner that stopped beating is failed, and its daemon dies
every end of a job kills the process one of its commands left running, without the sandbox, detached from its command (#750) @cap:executer-une-commande/moteur the job ends completed: the run that saw it end kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, detached from its command (#750) @cap:executer-une-commande/moteur the job ends failed: the run that saw it end kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, detached from its command (#750) @cap:executer-une-commande/moteur Stop: the job is cancelled while suspended, the sweep kills the daemon
every end of a job kills the process one of its commands left running, without the sandbox, detached from its command (#750) @cap:executer-une-commande/moteur reclaimed: the job of a runner that stopped beating is failed, and its daemon dies
a lost job releases its processes before the row can be claimed again (#750) @cap:executer-une-commande/moteur the resumed run’s command, started right after the row went back to pending, survives the reclaim
a reaper whose candidate came back to life releases nothing and writes nothing (#750) @cap:executer-une-commande/moteur 'reclaimJobsOfDeadRunners, a job it wo…': its command survives, its row is untouched
a reaper whose candidate came back to life releases nothing and writes nothing (#750) @cap:executer-une-commande/moteur 'resetOrphanedJobs: the run suspends f…': its command survives, its row is untouched
a reaper whose candidate came back to life releases nothing and writes nothing (#750) @cap:executer-une-commande/moteur 'failStalePendingJobs: a worker claims…': its command survives, its row is untouched
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
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur with no stored policy, a real `curl -o` runs, writes the file, and creates no approval
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a stored `download: ask` still asks, and the file is not written
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur with no stored policy, an install still asks
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur with no stored policy, `node -e` and `python -c` run with no approval row
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a stored `inline_code: ask` still asks
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a target outside the workspaces asks, names the place, and the file is not written
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a stored `download: never` blocks: the agent is told, no one is asked, nothing is written
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a script that installs a package asks, names the line, and does not run (#635)
run_command — an agent nobody configured downloads into its workspace without asking (#614) @cap:executer-une-commande/moteur a script that only writes its own file runs, really, with no approval row (#635)
run_command — what reaches a printer or the screen asks, and a decline says where to go (#667) @cap:executer-une-commande/moteur a print through the shell suspends with its kind named; declined, the model reads the remedy
run_command — what a command starts lives for the JOB, and Stop kills the running command (#628, #750) @cap:executer-une-commande/moteur Stop during a run_command: the command is killed at once and the job ends cancelled
run_command — what a command starts lives for the JOB, and Stop kills the running command (#628, #750) @cap:executer-une-commande/moteur a server started by command 1 answers command 2 of the same job, then dies when the job completes
probeWorkspaceGit runs git in the sandbox: a planted core.fsmonitor and filter never run on the host @cap:executer-une-commande/moteur (Windows, MXC available) TÉMOIN : git status sur l’hôte exécute le piège
probeWorkspaceGit runs git in the sandbox: a planted core.fsmonitor and filter never run on the host @cap:executer-une-commande/moteur (Windows, MXC available) la sonde décrit le dépôt sans rien lancer sur l’hôte
takeCliTurnCheckpoints runs git in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) TÉMOIN : une photo prise sur l’hôte exécute le piège du sous-dépôt
takeCliTurnCheckpoints runs git in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) la photo de deux tours ne lance rien sur l’hôte
GET /api/sandbox @cap:executer-une-commande/moteur says the state, the limits and the perimeter with the real paths of this machine
GET /api/sandbox @cap:executer-une-commande/moteur groups agent folders by real folder, counts each writable folder once, and says where each runtime runs its commands
GET /api/sandbox @cap:executer-une-commande/moteur reads the switch from the base at every call: off is said, and so is unavailable
GET /api/sandbox @cap:executer-une-commande/moteur unknown Nodal ports are said with their code, never left out
GET /api/sandbox @cap:executer-une-commande/moteur an unreadable setting answers 500 with its code, never a guessed state
GET /api/sandbox @cap:executer-une-commande/moteur a session caller reads only its own workspace; another one is not found
sandbox — run_command, run_skill_script and proof commands go through ONE confinement @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'run_command': writes inside its workspace, never outside
sandbox — run_command, run_skill_script and proof commands go through ONE confinement @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'run_skill_script': writes inside its workspace, never outside
sandbox — run_command, run_skill_script and proof commands go through ONE confinement @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'proof command (declare_verification)': writes inside its workspace, never outside
broker Node pin @cap:executer-une-commande/moteur la somme épinglée est un SHA-256 (64 hexa) pour chaque arch Windows
ensureBrokerNode @cap:executer-une-commande/moteur télécharge, vérifie la somme, et garde le node.exe sous le dossier du bac à sable
ensureBrokerNode @cap:executer-une-commande/moteur une somme qui ne correspond pas lève BrokerNodeUnavailable, et n’écrit rien
ensureBrokerNode @cap:executer-une-commande/moteur réseau coupé : BrokerNodeUnavailable avec le code et l’erreur réelle
ensureBrokerNode @cap:executer-une-commande/moteur un node.exe en cache dont la somme CORRESPOND n’est pas retéléchargé
ensureBrokerNode @cap:executer-une-commande/moteur un node.exe ALTÉRÉ est écarté au lancement, puis retéléchargé (vérifié) à l’ouverture suivante
verifyPinnedNodeSync @cap:executer-une-commande/moteur passe sur la somme épinglée ; lève BrokerNodeUnavailable si le fichier manque
verifyPinnedNodeSync @cap:executer-une-commande/moteur le produit vérifie contre la somme épinglée de l’arch, pas contre une valeur reçue
production layout: the sandbox is available with Nodal’s data dir in place @cap:executer-une-commande/moteur (Windows, MXC base-container) the probe, whose scripts live under the data dir, says available
production layout: a confined command cannot read Nodal’s data dir, its workspace stays usable, git works in it @cap:executer-une-commande/moteur (Windows, MXC) secrets.key, config.json and pg-data stay unreadable; only the children NAMES are listed
production layout: a confined command cannot read Nodal’s data dir, its workspace stays usable, git works in it @cap:executer-une-commande/moteur (Windows, MXC) the secrets stay unreadable under their 8.3 alias and through a junction to the data dir (review pass 5)
production layout: a confined command cannot read Nodal’s data dir, its workspace stays usable, git works in it @cap:executer-une-commande/moteur (Windows, MXC) the workspace is readable and writable
production layout: a confined command cannot read Nodal’s data dir, its workspace stays usable, git works in it @cap:executer-une-commande/moteur (Windows, MXC) git init, commit, branch and status work in a workspace under the data dir
production layout: a confined command cannot read Nodal’s data dir, its workspace stays usable, git works in it @cap:executer-une-commande/moteur (Windows, MXC) the worktree-reading container (Nodal’s own git) works on the workspace but CANNOT write the checkpoint store (review pass 5, P1)
the host channel cannot be forged from inside the job container @cap:executer-une-commande/moteur (Windows, MXC base-container) a confined command cannot forge a running command’s result: the victim keeps its real exit code and duration
job host — its channel is its standard streams @cap:executer-une-commande/moteur init → ready ; run → started, la sortie de la commande, son code ; l’entrée fermée, il s’arrête (code 0)
job host — its channel is its standard streams @cap:executer-une-commande/moteur n’ouvre aucune connexion : sa source ne charge ni `net` ni `http`
job host — its channel is its standard streams @cap:executer-une-commande/moteur son entrée fermée, il sort 0 et le dit sur sa sortie d’erreur (jamais une raison vide)
a job owns what a command leaves running, in its command’s process group (#750, #755) @cap:executer-une-commande/moteur a grandchild whose parent exited lives for the next command, then dies when the scope closes
a job owns what a command leaves running, in its command’s process group (#750, #755) @cap:executer-une-commande/moteur closing one job never kills the processes of another job
a job owns what a command leaves running, detached from its command (own session) (#750, #755) @cap:executer-une-commande/moteur a grandchild whose parent exited lives for the next command, then dies when the scope closes
a job owns what a command leaves running, detached from its command (own session) (#750, #755) @cap:executer-une-commande/moteur closing one job never kills the processes of another job
a job owns every process it starts outside the sandbox (#750, #755) @cap:executer-une-commande/moteur the running command itself is killed with its whole tree by kill() (timeout, Stop)
a job owns every process it starts outside the sandbox (#750, #755) @cap:executer-une-commande/moteur a runner killed outright leaves nothing of its job once the reclaiming runner calls killLeftoversOfJob (skipped where a detached descendant cannot be found: macOS)
Windows without the sandbox: the job’s Job Object holds what `start /b` detaches (#755) @cap:executer-une-commande/moteur a `start /b` server outlives its command, then dies with the job
Linux without the sandbox: what the job tag catches, and the limit it leaves (#750) @cap:executer-une-commande/moteur measured: a detached (setsid) daemon has LEFT its command’s process group — only the job tag finds it
Linux without the sandbox: what the job tag catches, and the limit it leaves (#750) @cap:executer-une-commande/moteur documented limit: a descendant started with an EMPTIED environment carries no tag and survives the job
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur chaque ouverture en attente est rejetée avec SANDBOX_BROKER_START_FAILED et l’erreur de l’OS
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur une ouverture APRÈS l’échec relance le courtier et échoue de même, au lieu d’écrire à un processus mort
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur un courtier lancé qui MEURT (ici : le SDK introuvable depuis `resolveFrom`) règle la même attente, avec SANDBOX_BROKER_EXITED et ce qu’il a écrit
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur la somme ÉPINGLÉE du Node est vérifiée à CHAQUE lancement : un binaire changé entre deux lancements est écarté, rien n’est lancé (#628, P1-2)
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur écrire à / tuer un conteneur dont le courtier est MORT ne relance AUCUN courtier (seule une ouverture lance, et vérifie son Node)
MxcBroker — a broker that cannot start leaves nothing pending @cap:executer-une-commande/moteur la sonde du backend rend `unavailable` avec le code SANDBOX_BROKER_START_FAILED
hostPrograms — the host path, unchanged @cap:executer-une-commande/moteur TÉMOIN : sur l’hôte, git exécute le piège (le marqueur de l’hôte apparaît)
hostPrograms — the host path, unchanged @cap:executer-une-commande/moteur rejette comme execFile : code non nul dans `code`, borne de temps dans `killed`
openNodalPrograms — git on a planted repo runs IN the sandbox, nothing on the host @cap:executer-une-commande/moteur (Windows, MXC available) git lance la commande plantée (trace) DANS le conteneur, JAMAIS sur l’hôte ; sa sortie est juste
openNodalPrograms — git on a planted repo runs IN the sandbox, nothing on the host @cap:executer-une-commande/moteur (Windows, MXC available) rejette comme execFile dans le conteneur : `code` non nul, `killed` sur la borne
openNodalPrograms — the workspace switch @cap:executer-une-commande/moteur switched off: the session runs on the host, and the program really runs there
openNodalPrograms — the workspace switch @cap:executer-une-commande/moteur switched on: the session goes through the sandbox (its container is asked for)
openNodalPrograms — the workspace switch @cap:executer-une-commande/moteur an unreadable setting opens no session at all, it is never read as on or off
composeAllowedFolders — detected minus removed plus added @cap:executer-une-commande/moteur applies the gestures to what is detected on a real machine, and the opening uses that list
composeAllowedFolders — detected minus removed plus added @cap:executer-une-commande/moteur only gestures are stored: a store installed later appears on its own
composeAllowedFolders — detected minus removed plus added @cap:executer-une-commande/moteur the tool cache is never removed, even when the stored gestures name it
composeAllowedFolders — detected minus removed plus added @cap:executer-une-commande/moteur an added folder that no longer exists is shown missing, ignored at opening, and logged with a code
composeAllowedFolders — detected minus removed plus added @cap:executer-une-commande/moteur a removal whose store is gone stays shown, so the gesture does not vanish
allowedFolderRefusal — the data folder of Nodal can never be allowed @cap:executer-une-commande/moteur refuses the data folder itself and any folder under it, naming the folder that holds it
allowedFolderRefusal — the data folder of Nodal can never be allowed @cap:executer-une-commande/moteur covers this instance too when it lives elsewhere (NODALAI_HOME), not just ~/.nodalai
allowedFolderRefusal — the data folder of Nodal can never be allowed @cap:executer-une-commande/moteur a stored addition inside the data folder is shown refused and makes the opening fail loud
broadFolder — what asks for a confirmation before it is allowed, decided by what the folder holds @cap:executer-une-commande/moteur a volume root and the home folder are broad, and say the Nodal data they hold; any other folder is not
broadFolder — what asks for a confirmation before it is allowed, decided by what the folder holds @cap:executer-une-commande/moteur a folder that holds the home folder asks too, on this machine
broadFolder — what asks for a confirmation before it is allowed, decided by what the folder holds @cap:executer-une-commande/moteur Windows view: C:\Users holds the home and the data, the home holds the data, C:\ is a volume root
broadFolder — what asks for a confirmation before it is allowed, decided by what the folder holds @cap:executer-une-commande/moteur Windows view: the parent of a moved NODALAI_HOME, and of a moved entry, holds Nodal data
broadFolder — what asks for a confirmation before it is allowed, decided by what the folder holds @cap:executer-une-commande/moteur POSIX view: /home holds the home and the data, / is a volume root, a moved instance makes its parent broad
startNodalProxy @cap:executer-une-commande/moteur forwards to a non-Nodal local port, refuses a denied Nodal port (HTTP)
startNodalProxy @cap:executer-une-commande/moteur refuses the denied port on ::1 and on a LAN address too, not only 127.0.0.1
startNodalProxy @cap:executer-une-commande/moteur a remote host on the same port number is NOT refused (only local endpoints)
startNodalProxy @cap:executer-une-commande/moteur CONNECT to a denied local port is refused, by the RESOLVED address
startNodalProxy @cap:executer-une-commande/moteur refuses the denied port reached through a loopback alias (127.0.0.2) and a mapped IPv6
startNodalProxy @cap:executer-une-commande/moteur refuses the denied port reached through a NAME that resolves to loopback
startNodalProxy — pass 4: current interfaces, fail closed, every address @cap:executer-une-commande/moteur une adresse devenue locale APRÈS le démarrage est refusée sur un port de Nodal (interfaces relues à chaque connexion)
startNodalProxy — pass 4: current interfaces, fail closed, every address @cap:executer-une-commande/moteur un nom qui ne se résout pas est REFUSÉ avec un code, et le nom n’est jamais joint
startNodalProxy — pass 4: current interfaces, fail closed, every address @cap:executer-une-commande/moteur chaque adresse résolue est essayée dans l’ordre : une première adresse morte passe à la suivante
startNodalProxy — an upstream that resets the connection is no unhandled error @cap:executer-une-commande/moteur le proxy tient le socket amont : un RST de l’amont après la réponse ne lève aucune erreur non gérée, et la réponse était entière
sandbox network — the proxy regime: third-party local + internet yes, Nodal no @cap:executer-une-commande/moteur (Windows, proxy reachable) the proxy regime is actually exercised where release:check requires it
sandbox network — the proxy regime: third-party local + internet yes, Nodal no @cap:executer-une-commande/moteur (Windows, proxy reachable) a confined command reaches ComfyUI but not a Nodal port, and raw TCP has no route
sandbox network — the proxy regime: third-party local + internet yes, Nodal no @cap:executer-une-commande/moteur (Windows, proxy reachable) a server one command starts is reached by the next command of the same job, through the proxy
sandbox network — the proxy regime: third-party local + internet yes, Nodal no @cap:executer-une-commande/moteur (Windows, proxy reachable) a server one job starts is reached by a command of ANOTHER job, through the proxy (named limit)
sandbox proxy regime — what an unavailable status must say per tier (all systems) @cap:executer-une-commande/moteur appcontainer-dacl: the probe says SANDBOX_PLATFORM_UNSUPPORTED with the tier, and that is what the suite accepts
sandbox proxy regime — what an unavailable status must say per tier (all systems) @cap:executer-une-commande/moteur a tier the SDK probe could not read: the probe says `isolationTier=unknown`, and that is what the suite accepts
sandbox proxy regime — what an unavailable status must say per tier (all systems) @cap:executer-une-commande/moteur the proxy-unreachable code is NOT an acceptable answer on a tier other than base-container, and the tier code is not one on base-container
claudeShellFlags @cap:executer-une-commande/moteur each shell tool is either granted up front or removed from the palette, never left pending
claudeShellFlags @cap:executer-une-commande/moteur extra disallowed tools join the removed ones
claudeShellFlags @cap:executer-une-commande/moteur Codex has no Claude shell tools: its sandbox decides
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur the issue lines, as the gate receives them
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur powershell -Command "cd decoy" & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur pwsh -c "Set-Location decoy" & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cmd /c "pushd decoy" & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur sh -c "cd decoy"; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur sudo sh -c "cd decoy"; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur env cd decoy; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur nohup sh -c "cd decoy"; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur timeout 5 sh -c "cd decoy"; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur xargs sh -c "cd decoy" < list; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur find . -exec sh -c "cd decoy" ; ; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur start /b cmd /c "cd decoy" & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur python -m cd decoy; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur (cd decoy); ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy | cat; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cat a | cd decoy; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy & ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy && true & ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur { cd decoy; } | cat; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur echo $(cd decoy); ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur echo "$(cd decoy)"; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur echo `cd decoy`; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur diff <(cd decoy) a; ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur bash <<EOF cd decoy EOF ./x.sh
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy | more & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur echo (cd decoy) & x.bat
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a job sent to the background
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: Start-Job { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: Start-Job -ScriptBlock { Set-Location decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: sajb { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: $j = Start-Job { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: $j=Start-Job { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: Start-ThreadJob { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: 1..3 | ForEach-Object -Parallel { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: 1..3 | % -Parallel { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: 1..3 | foreach -Pa { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: 1..3 | ForEach-Object -UseNewRunspace { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: 1..3 | % -UseNew { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: Invoke-Command -ComputerName srv { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: icm -Session $s -ScriptBlock { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur PowerShell: a script block run in another runspace or process: Invoke-Command -AsJob { cd decoy }; .\x.ps1
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur a child's moves still reach its own later commands
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur call cd decoy & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur (cd decoy) & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur cd decoy && x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur { cd decoy; } && ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur eval "cd decoy"; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur command cd decoy; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur cd decoy || exit 1; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur cd decoy && ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur if cd decoy; then echo in; fi; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur true && echo; cd decoy; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur if x; then echo; fi; cd decoy; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur ver && echo & cd decoy & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur (cd decoy); .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur cd decoy | Out-Null; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur iex 'cd decoy'; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur & { cd decoy }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur Invoke-Command { cd decoy }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur Invoke-Command -NoNewScope { cd decoy }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur try { cd decoy } catch { }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: false && . ./env.sh; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: true || . ./env.sh; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: true && (cd sub; ./a.sh) && . ./env.sh; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if false; then . ./env.sh; fi; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if true; then echo; else . ./env.sh; fi; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: while false; do . ./env.sh; done; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: until true; do . ./env.sh; done; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: for i in ; do . ./env.sh; done; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: case $x in a) . ./env.sh;; esac; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: { false && . ./env.sh; }; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: f() { . ./env.sh; }; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: function f { . ./env.sh; }; ./x.sh
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: ver && env.bat & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: ver || env.bat & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if exist a env.bat & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if exist a (env.bat) & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if exist a (echo) else (env.bat) & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: for %d in (a) do env.bat & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: for %d in (a) do (env.bat) & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: ver && prepare.bat & x.bat
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if ($x) { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: if ($x) { } else { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: foreach ($d in $a) { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: while ($x) { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: Get-Item a | ForEach-Object { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: 1..3 | % -Process { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: try { } catch { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: function f { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: { .\env.ps1 }; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: Test-Path a && .\env.ps1; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a script that may not run leaves the line where it was, or where it ends: Test-Path a && { echo } | .\env.ps1; .\x.ps1
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur sh: what only bash runs in its own process leaves the folder unknown
a folder move made in the line's own process moves it (#717) @cap:executer-une-commande/moteur a PowerShell subexpression read twice, when it is not quoted, leaves the folder unknown
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur mkdir out && cd out && ./gen.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur mkdir -p build && cd build && cmake .. && make && ./run.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && ./a.sh; ./x.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && (./a.sh; ./b.sh); ./x.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && ./a.sh | ./b.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && (true; true) && ./a.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur bash -c "false && cd sub"; ./x.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if x; then cd out && ./a.sh; fi; ./x.sh: posix runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur ver && cd out && x.bat: windows runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if exist a (cd out && x.bat) & y.bat: windows runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur Test-Path a && cd out && .\x.ps1: windows runs in the folder moved into
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur mkdir -p build && cd build && make; ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && ./a.sh; ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy && (./a.sh; ./b.sh); ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur false && cd decoy || ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur true || cd decoy && ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if x; then cd out && ./a.sh; fi; ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if false; then cd decoy; fi && ./x.sh: posix, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur ver && cd out & x.bat: windows, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if exist a cd out && x.bat: windows, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur if exist a (cd out) && x.bat: windows, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur Test-Path a && cd out; .\x.ps1: windows, past it, is in either folder
a move that may not run is made for what follows it through && alone (#717, Nodal review) @cap:executer-une-commande/moteur a download joined to the move by && lands where it moved
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur . ./env.sh; ./x.sh: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur if x; then echo; fi; . ./env.sh; ./x.sh: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur true && echo; . ./env.sh; ./x.sh: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur ver && echo & env.bat & x.bat: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur & { .\env.ps1 }; .\x.ps1: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur Invoke-Command { .\env.ps1 }; .\x.ps1: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur try { .\env.ps1 } catch { }; .\x.ps1: only where the script ends
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur cmd: a batch file run directly or with call
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur cmd: a name without its extension may be a batch file of the folder: the gate looks
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur PowerShell: a path without its extension may be a .ps1; a bare name is not looked for in the folder
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur sh: what `.` reads; a script run directly is a child
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur PowerShell: a .ps1 run directly, dot-sourced or called keeps its location
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur a script run as a child moves nothing of the line
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur a script the text does not name leaves the folder unknown
a script run in the line's own process leaves it where it ends (#717) @cap:executer-une-commande/moteur cmd's setlocal keeps a batch file's moves inside it, in a batch file only
a line whose shell is not known, read as both (#717) @cap:executer-une-commande/moteur where cmd and sh read a move differently, the folder after it is not known
a line whose shell is not known, read as both (#717) @cap:executer-une-commande/moteur where they agree, the move is read
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a child process moves nothing of the line
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur read with PowerShell's grammar, `&` only starts the next command of the same process
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a download inside a child is read from its folder
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur the line's own process moves it
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a script run in the line's process leaves the download where it ends
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a name the shell may resolve to a script of the folder, and a move that may not happen
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a batch file's setlocal
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo done >NUL 2>&1
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur x.bat 2>&1
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur curl -o a.jpg https://x/a 2>&1
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur 1>&2 echo hi
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo hi >&2 & x.bat
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur type a.txt <&0 & x.bat
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo x 2> &1
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo x > out.txt & y.bat
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo x>out.txt
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur dir 2>>err.log
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur dir >> "err log.txt" & y.bat
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo x > "out file.txt" & y.bat
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo "a>b" 2>&1
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo H &>NUL
cmd: a redirection, handle duplication included, is no command and no word (#717, Nodal review pass 5) @cap:executer-une-commande/moteur no word of a redirection is looked for as a script
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Force binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -FORCE binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -force binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Fo binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -For binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Forc binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Rec binds ["recurse"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -r binds ["recurse"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -cf binds ["confirm"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -LP binds ["literalpath"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -PSPath binds ["literalpath"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -wi binds ["whatif"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur –Force binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur —Recurse binds ["recurse"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur ―Fo binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Force:$false binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur -Fo:$true binds ["force"] on Remove-Item
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur an ambiguous prefix counts as each parameter it could bind (PowerShell runs nothing)
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur a word that is not a parameter word is null; an unknown name binds nothing
psParameterNames: one word, as PowerShell binds it @cap:executer-une-commande/moteur the powershell CLI takes `/`, a doubled dash and its own aliases, and no `:` value
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force → true
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Fo → true
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:$true → true
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:1 → true
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force: $true → true
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:$false → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:$FALSE → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:0 → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force: $false → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Recurse → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur C:\x → false
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur -Force:$f → null
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur @params → null
psSwitch: a switch set, cleared, or decided at run time @cap:executer-une-commande/moteur `--` ends the parameters: what follows is positional
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur every guarded program, every spelling of -Recurse and -Force, on a drive root
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur the ticket: `Remove-Item -Recurse -Fo C:\`, and the parameters in any order
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur a splat may set both switches: it asks
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur through every wrapper the floor already sees through
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur a switch cleared with `:$false` or `:0` sets nothing
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur still only a machine-wide target: a project folder or one switch is not the floor
the floor reads Remove-Item as PowerShell binds it (#694) @cap:executer-une-commande/moteur rm's own options, abbreviated as getopt allows, and grouped
Start-Process read as PowerShell binds it (open_or_send, #694) @cap:executer-une-commande/moteur a document handed by -FilePath, its prefix, its alias or another dash opens, window or not
Start-Process read as PowerShell binds it (open_or_send, #694) @cap:executer-une-commande/moteur a shell verb, under any spelling, is a desktop action
Start-Process read as PowerShell binds it (open_or_send, #694) @cap:executer-une-commande/moteur a window kept away by any spelling of -NoNewWindow or -WindowStyle Hidden: no open
Start-Process read as PowerShell binds it (open_or_send, #694) @cap:executer-une-commande/moteur a window not surely kept away opens
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a -OutFile C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a -OutF C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a –OutFile C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a -OutFile: C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Invoke-WebRequest https://x/a -outfile:C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Start-BitsTransfer -Source https://x/a –Destination C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Start-BitsTransfer -Source https://x/a -Dest C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Out-File -Encoding utf8 -Fi C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Out-File -Encoding utf8 C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Set-Content -Encoding utf8 C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Add-Content -LP C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Tee-Object -Pa C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Out-File –FilePath C:\out\a writes ["C:\\out\\a"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur iwr https://x/a | Out-File -Bogus C:\out\a writes [null]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Set-Location -Path D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Set-Location -Pat D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Set-Location -StackName s D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur sl -Path:D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur Push-Location -LP D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd -Path D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd –Path D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd -P D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd /d D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd D:\x; iwr https://x -OutFile a moves into ["D:\\x"]
where a PowerShell line writes, read as PowerShell binds it (#694) @cap:executer-une-commande/moteur cd -; iwr https://x -OutFile a moves into [null]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur -Command and -EncodedCommand, under every spelling, are inline code
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur a script file is not inline code
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -File x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -Fi x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur pwsh /f x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur pwsh --file x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -ExecutionPol Bypass -Fil x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -ExecutionPol Bypass x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -WindowS Hidden -NoProf x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -File x.ps1 -Command y runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -- x.ps1 runs ["x.ps1"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur powershell -ExecutionPol Bypass Get-Date runs ["code:Get-Date"]
the powershell CLI read as it binds its words (#694) @cap:executer-une-commande/moteur -Command, under any spelling, is a command line read by commandUnits, not a source
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur a file given to an interpreter, in every language and form
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur a file run directly: a relative path, a script name, source and call
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur a bare name is looked up on the PATH when it is not in the folder
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur the code written into a command, for an interpreter whose code is not a command line
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur what is not a source: modules, command lines already read, subcommands, programs
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur a path decided when the command runs is named as such, not guessed
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur a cd before the file moves where it is read from
programSources: where the code a command runs is (#635) @cap:executer-une-commande/moteur in the strings of a script, a file name is data unless an interpreter is given it
a shell runs its -c even in a group of options (#635) @cap:executer-une-commande/moteur bash -lc and sh -ec are read like bash -c
a shell runs its -c even in a group of options (#635) @cap:executer-une-commande/moteur an option after the script file is the script's own
the language of a file (#635) @cap:executer-une-commande/moteur by its extension, then by its shebang
a control construct runs the command after its keyword (review of #683) @cap:executer-une-commande/moteur sh: if/then/else, while/do, groups and sub-shells
a control construct runs the command after its keyword (review of #683) @cap:executer-une-commande/moteur cmd: if … ( … ), for … do, call inside a block
a control construct runs the command after its keyword (review of #683) @cap:executer-une-commande/moteur PowerShell: if/foreach/while script blocks
a control construct runs the command after its keyword (review of #683) @cap:executer-une-commande/moteur a bracket inside an argument is not a command (review of PR #474)
a command starts where the shell grammar lets one start (review pass 2 of #683) @cap:executer-une-commande/moteur sh: case patterns, select, function bodies, eval and exec
a command starts where the shell grammar lets one start (review pass 2 of #683) @cap:executer-une-commande/moteur cmd: brackets, else and do
a command starts where the shell grammar lets one start (review pass 2 of #683) @cap:executer-une-commande/moteur PowerShell: every script block, and Invoke-Expression
a command starts where the shell grammar lets one start (review pass 2 of #683) @cap:executer-une-commande/moteur what is quoted is an argument, wherever its brackets and keywords are
cmd conditions without brackets, and here-docs fed to a program (#683) @cap:executer-une-commande/moteur cmd: the command after an if condition, without brackets
cmd conditions without brackets, and here-docs fed to a program (#683) @cap:executer-une-commande/moteur a here-doc or here-string fed to a shell or an interpreter is its source
cmd conditions without brackets, and here-docs fed to a program (#683) @cap:executer-une-commande/moteur a file fed on standard input to a shell or an interpreter is its source
cmd conditions without brackets, and here-docs fed to a program (#683) @cap:executer-une-commande/moteur a here-doc fed to anything else is data to sh, and no source
cmd conditions without brackets, and here-docs fed to a program (#683) @cap:executer-une-commande/moteur destructive_gate and the impact line still see a body fed to a shell
here-document operators as sh reads them (review pass 3 of #683) @cap:executer-une-commande/moteur a << in quotes, in a comment or in arithmetic opens nothing
here-document operators as sh reads them (review pass 3 of #683) @cap:executer-une-commande/moteur a body whose end marker never comes stays judged, line by line
a here-document body is no script grammar (review pass 5 of #683) @cap:executer-une-commande/moteur an apostrophe, a quote or a $(( in a body leaves the next here-document whole
a here-document body is no script grammar (review pass 5 of #683) @cap:executer-une-commande/moteur the substitutions of an unquoted body run; a quoted body is data
a here-document body is no script grammar (review pass 5 of #683) @cap:executer-une-commande/moteur a body fed to a shell runs as its commands, quoted marker or not
a here-document body is no script grammar (review pass 5 of #683) @cap:executer-une-commande/moteur an unterminated body stays read as lines
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur a shell reached through a pipe or a wrapper runs the body
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur an interpreter reached through a pipe reads the body as its source
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur a body is data only when a known data reader reads it, piped to nothing that runs
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur an interpreter behind a wrapper reads the body as its source
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur csh and tcsh are shells everywhere: what they are fed and their -c line
the reader of what a command feeds on its input (review pass 6 of #683) @cap:executer-une-commande/moteur no shell is missing from the readers: every shell runs what it is fed
data readers cannot execute, unreadable interpreters are judged (review pass 7 of #683) @cap:executer-une-commande/moteur sed and awk can execute what they read: their body is judged
data readers cannot execute, unreadable interpreters are judged (review pass 7 of #683) @cap:executer-une-commande/moteur expect, an interpreter Nodal does not read, has its body judged as commands
data readers cannot execute, unreadable interpreters are judged (review pass 7 of #683) @cap:executer-une-commande/moteur no data reader can run anything: not a shell, a launcher, an interpreter or an executor
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur the script of the ticket: pip run by the interpreter itself
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur every way a Python script starts a program
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur a value decided at run time is a `$`: a download into it is unreadable, not inside
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur JavaScript, Ruby, Perl and PHP: the strings a program is started with
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur shell, cmd and PowerShell sources are read line by line, continuations joined
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur comments are not read, in any language
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur a script that only reads and writes its own files runs nothing
readSource: the commands a source runs, with their line (#635) @cap:executer-une-commande/moteur a string that begins with a command is read as one, printed or not; a sentence is not
readSource decodes each language string escapes (review of #683) @cap:executer-une-commande/moteur Python: hex, octal, u and U escapes; a raw string stays as written
readSource decodes each language string escapes (review of #683) @cap:executer-une-commande/moteur JavaScript: hex, u and u-brace escapes, and a line continuation
readSource decodes each language string escapes (review of #683) @cap:executer-une-commande/moteur Ruby, PHP, Perl: double quotes decode; single quotes keep the backslash
a program named with its path, in a string (review pass 3 of #683) @cap:executer-une-commande/moteur is judged by its name; a data file or an address is not a program
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 when nothing is stored, downloads and inline code run, every other kind asks (#614)
resolveShellPolicy @cap:executer-une-commande/moteur a stored "ask" is kept over the default (#614)
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)
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl -s -o out/a.jpg https://x/a.jpg
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl --output=/tmp/a https://x/a
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl -sLo C:\Users\k\.ssh\authorized_keys https://x/k
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl -O https://x/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl --output-dir /opt/x -O https://x/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur curl https://x/a.zip > /tmp/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur wget https://x/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur wget -O ../a.zip https://x/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur wget -P /var/tmp https://x/a.zip
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur Invoke-WebRequest -Uri https://x/a -OutFile 'D:\hors\a.jpg'
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur iwr https://x/a -OutFile:a.jpg
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur Start-BitsTransfer -Source https://x/a -Destination C:\temp\a
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur aria2c -d /data -o m.bin https://x/m
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur aria2c https://x/m
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur git clone https://github.com/x/y D:\hors-espace
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur git clone --depth 1 -b main https://github.com/x/y
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur git -C /elsewhere clone https://github.com/x/y z
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur pip download torch -d wheels
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur hf download org/m f.safetensors --local-dir models/unet
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur a target it cannot read is null: a variable, a home path, a sub-shell
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur each target says how many of the line's folders come before it
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur the folders the line moves into are kept in order
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur a value glued to a short option is read, by the same reader for curl, wget and aria2c
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur the null sink of the host is no place, for every form of write (#669)
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur every other name is an ordinary place, on every host, shown as written (#669)
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur what a descriptor alias leads to is never guessed: each of these writes is reported (#669)
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur a null sink in the same line never hides a real place, in any order and any form (#669)
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) every write-capable operator yields its target, attached or spaced
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) the two commands of review pass 3 report the outside file
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) adjacent redirections are each found, in both orders, with a sink on either side
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) a duplication, an input, a here-document and a substitution name no file
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) a redirection is read as each shell reads it: in a payload, past an escaped quote, never in quotes
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur redirection operators are scanned one by one, wherever they stand (#669) the null sink of each host is still nowhere in any operator form
downloadWrites: where a download line writes (#614, review P1b) @cap:executer-une-commande/moteur a program with its own store names no path: nothing to judge
cmd's @ prefix and start's switches with a value (#667, review of #682 pass 6) @cap:executer-une-commande/moteur @ before a command is cmd's prefix, at the start and after & && || (
cmd's @ prefix and start's switches with a value (#667, review of #682 pass 6) @cap:executer-une-commande/moteur a quoted @ is text, and PowerShell keeps its @( @{ @args
cmd's @ prefix and start's switches with a value (#667, review of #682 pass 6) @cap:executer-une-commande/moteur start /D takes a path, spaced, glued or quoted; /NODE, /AFFINITY, /MACHINE take a value
cmd's @ prefix and start's switches with a value (#667, review of #682 pass 6) @cap:executer-une-commande/moteur a quoted value of /D is the value, never the title: one reading of start
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur cmd and PowerShell have no backslash escape: a quote after a backslash closes the string
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur sh keeps its backslash escape: the same text is one echo there
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur cmd's quotes are double quotes only; ^ is its escape; ; is no separator there
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur PowerShell: backtick escapes, '' and "" double a quote, & starts a command
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur ( ) { } start a command, glued or spaced, in sh and PowerShell; ( ) in cmd blocks
command boundaries follow the shell that reads the line (#667, review of #682 pass 3) @cap:executer-une-commande/moteur quoted parentheses and braces are text, and code stays inline code only
delete_files: every delete command, from the floor’s own list (#693) @cap:executer-une-commande/moteur each name of the one list is a delete_files kind, an alias where PowerShell reads it
delete_files: every delete command, from the floor’s own list (#693) @cap:executer-une-commande/moteur and the floor reads each of them, recursive and forced, on a whole disk
delete_files: every delete command, from the floor’s own list (#693) @cap:executer-une-commande/moteur the ticket: `erase file.txt` (cmd) and `ri file.txt` (PowerShell)
delete_files: every delete command, from the floor’s own list (#693) @cap:executer-une-commande/moteur the unix delete commands, and rsync deleting
delete_files: every delete command, from the floor’s own list (#693) @cap:executer-une-commande/moteur what deletes nothing is not delete_files
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur every program the reader knows has its case here, and every case is a program it knows
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows msiexec
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows wusa
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows dism
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows pnputil
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows winget
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows choco
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows scoop
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows setup
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows cinst
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows cuninst
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows cup
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-module
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows inmo
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-module
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows update-module
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows upmo
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-script
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-script
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows update-script
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-package
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-package
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-packageprovider
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-psresource
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows isres
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-psresource
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows usres
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows update-psresource
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows udres
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-appxpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-apppackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-msixpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-appxpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-apppackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-msixpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-windowsfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-windowsfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-windowsfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-windowsfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-appxprovisionedpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-appprovisionedpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-provisionedapppackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-provisionedappxpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-appxprovisionedpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-appprovisionedpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-provisionedapppackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-provisionedappxpackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-windowspackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-windowspackage
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-windowscapability
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-windowscapability
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows enable-windowsoptionalfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows disable-windowsoptionalfeature
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows add-windowsdriver
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows remove-windowsdriver
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows install-language
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur windows uninstall-language
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur macos installer
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur macos softwareupdate
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur macos brew
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur macos port
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur macos mas
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux apt-get
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux apt
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux aptitude
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux dpkg
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux rpm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux dnf
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux dnf5
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux yum
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux microdnf
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux tdnf
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux zypper
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux pacman
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux yay
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux paru
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux xbps-install
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux xbps-remove
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux pkg_add
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux pkg_delete
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux apk
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux emerge
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux snap
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux flatpak
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux pkcon
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux nix-env
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux nix
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur linux pkg
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform npm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pnpm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform yarn
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform bun
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pip
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pip3
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pipx
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform uv
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform go
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform gem
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform cargo
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform rustup
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform conda
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform mamba
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform micromamba
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform bundle
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform bundler
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform composer
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform poetry
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pdm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pipenv
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform dotnet
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform nuget
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform deno
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform nvm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform fnm
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform volta
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform pyenv
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform rbenv
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform nodenv
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform asdf
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform mise
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform sdk
install_software: every standard installer of Windows, macOS and Linux, one case per program (#693) @cap:executer-une-commande/moteur cross-platform comfy
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur Windows
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur macOS
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur Linux
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur a package file run as a program goes to its installer
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur wrapped as each OS runs them: the wrapper does not hide the installer, nor its simulation
install_software: written out by hand, one per OS, outside any table (#693) @cap:executer-une-commande/moteur destructive_gate gates what the kind files, a simulation included
install_software: a simulation asks like the install it simulates (#710, Codex pass 2) @cap:executer-une-commande/moteur Codex: `--simulate` as the value of `-c` installs, and asks
install_software: a simulation asks like the install it simulates (#710, Codex pass 2) @cap:executer-une-commande/moteur the same shape on other programs: a dry-run or read flag taken as a value
install_software: a simulation asks like the install it simulates (#710, Codex pass 2) @cap:executer-une-commande/moteur PowerShell: -WhatIf that is a value is no -WhatIf, and a unit has lost its quotes
install_software: a simulation asks like the install it simulates (#710, Codex pass 2) @cap:executer-une-commande/moteur each OS’s simulations ask, written out by hand
install_software: a simulation asks like the install it simulates (#710, Codex pass 2) @cap:executer-une-commande/moteur a read names no action, and stays unflagged
install_software: a verb of the program anywhere in its words asks (#710) @cap:executer-une-commande/moteur nix: a two-value option before `profile install`
install_software: a verb of the program anywhere in its words asks (#710) @cap:executer-une-commande/moteur an option value hides the verb, on each OS
install_software: a verb of the program anywhere in its words asks (#710) @cap:executer-une-commande/moteur Codex pass 2 still asks
install_software: a verb of the program anywhere in its words asks (#710) @cap:executer-une-commande/moteur accepted over-ask: a read that names a verb word of its program asks
install_software: a verb of the program anywhere in its words asks (#710) @cap:executer-une-commande/moteur a read with no verb of its program anywhere stays unflagged
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur Codex: the verb in a variable
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur sh: a parameter expansion, a command substitution, backticks
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur cmd: %VAR%, a batch parameter, delayed !VAR!
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur PowerShell: a variable, a subexpression, a splat
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur a program name decided at run time is inline code already, not read again here
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur the earlier Codex cases still ask
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur accepted over-ask: a read whose operand is decided at run time asks
install_software: a word decided at run time could be the verb, and asks (#710, Codex pass 3) @cap:executer-une-commande/moteur a runtime word elsewhere on the line, or a literal read, stays unflagged
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur Codex: an alias, then its use
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur sh, bash, zsh, fish: an alias, `hash -p`, the alias arrays
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur PowerShell: Set-Alias, New-Alias, Import-Alias, and the alias: and function: drives
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur PowerShell: the alias and function providers however the path names them (Codex, pass 5)
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur cmd: a doskey macro
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur the earlier Codex cases still ask
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur accepted over-ask: a line that only shows an alias or a function
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur a function written with its body is read where it stands, not redefined
a line that redefines a command name asks, as inline code (#710, Codex pass 4) @cap:executer-une-commande/moteur a line that redefines nothing is unchanged
a program named with the extension Windows runs it by is that program (#710, Codex pass 6) @cap:executer-une-commande/moteur an installer named with .cmd, .bat, .ps1 or .exe, in any case, installs
a program named with the extension Windows runs it by is that program (#710, Codex pass 6) @cap:executer-une-commande/moteur a delete command named with its extension deletes
a program named with the extension Windows runs it by is that program (#710, Codex pass 6) @cap:executer-une-commande/moteur a read named with its extension stays a read
a script named after a folder change moves no folder (#710, Codex pass 8) @cap:executer-une-commande/moteur where a download lands is read from the folder the line is in
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur the reproduction of #667: Start-Process -Verb Print, wrapped in powershell -Command
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur the OS launchers, on Windows, macOS and Linux
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur every -Verb of Start-Process is a desktop action: Print, PrintTo, Open, Edit, RunAs
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur printers and spoolers: lp, lpr, Out-Printer, print, a desktop program told to print
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur mail sent from the shell reaches someone
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur a desktop program opens its window, unless it is told to run headless
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur a document run as a command opens in its program
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur a program started in the background, without a window, is judged by what it starts
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur what a launcher starts is judged for every kind of action
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur cmd's start: the first quoted argument is the window title, never what it starts
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur PowerShell's start alias has no title: its quoted first argument is what it starts
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur cmd /c with one quoted line reads the line, never a program named after it
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur a PowerShell script run by name runs, it is not a document
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur the help or version of a launcher prints and exits
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur a mention is not the action: echo, a string, a file name, a subcommand
open_or_send: what reaches the screen, a printer or someone (#667) @cap:executer-une-commande/moteur false positives over everyday commands: none
open_or_send in the policy (#667) @cap:executer-une-commande/moteur is a kind of its own on the checklist, asked by default
open_or_send in the policy (#667) @cap:executer-une-commande/moteur a stored policy without the key reads "ask", every other state kept
open_or_send in the policy (#667) @cap:executer-une-commande/moteur a stored state for it is read, and a wrong one refused
open_or_send in the policy (#667) @cap:executer-une-commande/moteur the approval card says what the command does
cmd's run-time forms name a program decided at run time (#667, review of #682 pass 5) @cap:executer-une-commande/moteur for variables, batch parameters and delayed expansion
cmd's run-time forms name a program decided at run time (#667, review of #682 pass 5) @cap:executer-une-commande/moteur a percent in an argument, or a literal percent, is not a program
desktop programs open a window, on every OS (#667, closes #686) @cap:executer-une-commande/moteur editors, viewers, office, browsers, mail, file managers and terminals
desktop programs open a window, on every OS (#667, closes #686) @cap:executer-une-commande/moteur their command-line uses open no window
exec wrappers: what they run is read (#667, review of #682 pass 5) @cap:executer-une-commande/moteur the floor sees through them
exec wrappers: what they run is read (#667, review of #682 pass 5) @cap:executer-une-commande/moteur every kind too, and their own uses run nothing
exec wrappers: what they run is read (#667, review of #682 pass 5) @cap:executer-une-commande/moteur a wrapper not in the table stays one unit: what it runs is not read
exec wrappers: what they run is read (#667, review of #682 pass 5) @cap:executer-une-commande/moteur the allowlist refuses them, as every program that runs another
a unit that reaches out is never excused as a help or a version (#667, closes #691) @cap:executer-une-commande/moteur a desktop program, a document or a launcher with a help flag still opens a window
a unit that reaches out is never excused as a help or a version (#667, closes #691) @cap:executer-une-commande/moteur a program that prints and exits is still excused
iex runs code the text may not hold (#667, review of #682 pass 8) @cap:executer-une-commande/moteur iex on a variable, an expression or the pipeline of a command is decided at run time
iex runs code the text may not hold (#667, review of #682 pass 8) @cap:executer-une-commande/moteur a literal piped into iex is the code it runs, read for every kind
VS Code extensions change installed software (#667, review of #682 pass 8) @cap:executer-une-commande/moteur installing, updating or removing an extension is install_software, like a package
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur a program named by a variable or a substitution is decided at run time, in every shell
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur a named program, a variable in an ARGUMENT, or a literal in single quotes is not
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur PowerShell: a variable statement is an expression; the command it assigns from is read
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur what it costs: these everyday forms ask
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur iex and Invoke-Expression evaluate their string: inline code, read for every kind
a program decided at run time asks (#667, review of #682 pass 4) @cap:executer-une-commande/moteur a path-qualified program is that file, never the shell builtin of the same name
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur every program documented as running another one has its grammar
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur wsl, timeout, nohup, nice, time, env, sudo, doas, runas, busybox, exec, call: what they start is read
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur every kind, not only this one: a deletion or an install started through them is one
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur cmd: every switch before /c or /k is cmd's own
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur the shell that reads the payload is the one of the wrapper that runs it, nested both ways
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur everyday commands through a wrapper are not read as reaching out
a program that runs another: what it runs is read (#667, review of #682 pass 2) @cap:executer-une-commande/moteur the outer program stays a unit, and a wrapper never makes a read look like work
the catastrophic floor and inline code read through every wrapper (#667, review of #682) @cap:executer-une-commande/moteur the floor sees a machine-wide destroyer through every program that runs another
the catastrophic floor and inline code read through every wrapper (#667, review of #682) @cap:executer-une-commande/moteur a mention, a project folder or a help is not a destroyer, wrapped or not
the catastrophic floor and inline code read through every wrapper (#667, review of #682) @cap:executer-une-commande/moteur inline code is read through every program that runs another
the catastrophic floor and inline code read through every wrapper (#667, review of #682) @cap:executer-une-commande/moteur a script file or a plain program through a wrapper is not inline code
the catastrophic floor and inline code read through every wrapper (#667, review of #682) @cap:executer-une-commande/moteur a backslash before the last quote ends a path; before an inner quote it escapes it
each kind says what it acts on (#715) @cap:executer-une-commande/moteur every kind of the checklist has a target, and only inline code and a download read theirs apart
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur PowerShell: what a pipeline hands Remove-Item, in every spelling
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur PowerShell: a variable, a splat, the pipeline variable, an environment variable
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur PowerShell: `gci *.tmp | ri` asks: the reading does not establish what an upstream command lists
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur cmd: a loop variable, an environment variable, delayed expansion
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur PowerShell binds its parameters only where PowerShell reads the line
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur programs that run a command with words of their own, read as xargs is: parallel, fd -x
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur sh: xargs, find -exec, a variable, a substitution, a loop, the home folder
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur a target the text establishes runs as before, in every shell
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur a pipeline binds nothing when the text names the path: the target is the one written
delete_files: a target the text does not establish asks (#715) @cap:executer-une-commande/moteur the provider cmdlets that erase content or an entry are deletions, read as Remove-Item is
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur stop_programs
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur system_settings
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur install_software
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur open_or_send
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur inline code: its program, as before (#667)
every other kind: what the text does not establish asks (#715) @cap:executer-une-commande/moteur a download is never judged here: where it writes is judged against the workspaces by the gate
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur opaque: a program decided at run time, which asks under any autonomy
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur opaque never blinds the floor: what may run behind the option is read, and reaches it
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur busybox: `--` ends its options, as every reader’s
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur the options each manual holds still find the command, and its kind
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur a glued optional value is no command: `watch -d1 ls` runs ls, unasked as on main
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur GNU parallel with no command runs its arguments or its input: decided at run time, its arguments read
an option a program’s grammar cannot classify makes what it runs opaque (#715) @cap:executer-une-commande/moteur what manages a program runs nothing: `wsl --list`, `busybox --list`
reading options that hide the command is linear, and bounded across nesting (#715) @cap:executer-une-commande/moteur 60 unknown options: timeout, bash -c, wsl, sudo, each with the verdict of 2
reading options that hide the command is linear, and bounded across nesting (#715) @cap:executer-une-commande/moteur nested programs whose options hide the command: bounded, never an exception, the floor held
reading options that hide the command is linear, and bounded across nesting (#715) @cap:executer-une-commande/moteur unknown options: 8 times the options cost about 8 times, not 64
reading options that hide the command is linear, and bounded across nesting (#715) @cap:executer-une-commande/moteur nested programs: 8 times the nesting costs about 8 times, not 64
a PowerShell alias is one only where PowerShell reads the line (#715) @cap:executer-une-commande/moteur cli, clc, clp, rp and ri name any program elsewhere
a PowerShell alias is one only where PowerShell reads the line (#715) @cap:executer-une-commande/moteur read by PowerShell, each is the cmdlet it names
vitest base: the checker @cap:executer-une-commande/moteur is green on a package whose own config merges the base first
vitest base: the checker @cap:executer-une-commande/moteur is red on a package with no config of its own, even when a parent has one
vitest base: the checker @cap:executer-une-commande/moteur is red on a config that does not import the base at all
vitest base: the checker @cap:executer-une-commande/moteur is red when the base is imported but is not what mergeConfig takes first
vitest base: the checker @cap:executer-une-commande/moteur is red on a default export that is not a mergeConfig call
vitest base: the checker @cap:executer-une-commande/moteur accepts every extension vitest accepts
vitest base: the checker @cap:executer-une-commande/moteur is red on a vite.config next to a good vitest config, in any extension
vitest base: the checker @cap:executer-une-commande/moteur is red on two vitest configs
vitest base: the checker @cap:executer-une-commande/moteur ignores a package whose test script does not run vitest
vitest base: this repository @cap:executer-une-commande/moteur every package that runs vitest has its own config merging the shared base first
vitest base: this repository @cap:executer-une-commande/moteur the base carries a timeout above vitest default of 5 s, for tests and hooks
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
code_task argv follows the platform shell rule @cap:executer-une-commande/moteur claude write: the rule, asked for Claude with no setting, decides the shell flags
code_task argv follows the platform shell rule @cap:executer-une-commande/moteur claude write: a rule that grants a shell tool reaches the argv
runCli — Stop @cap:executer-une-commande/moteur the job’s Stop kills the running CLI at once, long before its timeout
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
the constat’s git runs in the sandbox: a planted core.fsmonitor and filter never run on the host @cap:executer-une-commande/moteur (Windows, MXC available) TÉMOIN : le même git, sur l’hôte, exécute le piège
the constat’s git runs in the sandbox: a planted core.fsmonitor and filter never run on the host @cap:executer-une-commande/moteur (Windows, MXC available) les deux phases du constat lisent le dépôt piégé sans rien lancer sur l’hôte, et constatent l’écriture
checkpoints’ git runs in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) TÉMOIN : une photo prise sur l’hôte exécute le piège du sous-dépôt
checkpoints’ git runs in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) la photo d’un tour par le vrai executeTool ne lance rien sur l’hôte
checkpoints’ git runs in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) le repli du constat sur l’index figé ne lance rien sur l’hôte
checkpoints’ git runs in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) la restauration ne lance rien sur l’hôte
a link to a network share is refused like the share itself (#614, review of #618) @cap:executer-une-commande/moteur the resolver refuses it as a UNC path
a link to a network share is refused like the share itself (#614, review of #618) @cap:executer-une-commande/moteur file_write through it is refused
a link to a network share is refused like the share itself (#614, review of #618) @cap:executer-une-commande/moteur a download through it asks, and names the place
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 the launcher the PATH resolves, with every argument
run_command with a list runs NO shell @cap:executer-une-commande/moteur does not start the launcher for a command that only shares the first word of a multi-word entry
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
run_skill_script Stop during a run_skill_script: the script is killed at once and its marker stops growing @cap:executer-une-commande/moteur
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) writes inside its workspace
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) shell redirection outside: refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) overwriting an existing file outside: refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) node -e outside: refused, canary intact, the refusal names the path
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) a Python script outside: refused, canary intact, the refusal names the path
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) a child process outside: refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) a junction created by the command, written through: refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) a symlink created by node, written through: refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) a junction made BEFORE the command (outside the sandbox), written through: refused
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) rename OUT of the workspace (move, fs.renameSync): refused, the file stays inside
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) delete outside (del, fs.unlinkSync, rmdir): refused, canary intact
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'start /b': the server outlives its command, and it dies when the job ends
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'a detached child (spawn detached + un…': the server outlives its command, and it dies when the job ends
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) 'PowerShell Start-Process': the server outlives its command, and it dies when the job ends
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) closing one job does not touch another job’s processes
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) Stop (the job signal) kills the running command at once
sandbox, Windows (MXC) — run_command writes only inside its folders @cap:executer-une-commande/moteur (Windows only: the macOS and Linux backends come in later PRs of #628 — skipped on a Windows without the MXC base-container tier, e.g. the GitHub Windows Server runner) npm install of a local tarball works confined (offline, cache in the Nodal tool cache)
sandbox, Windows without the MXC base-container tier — run_command runs unconfined and the reason is said @cap:executer-une-commande/moteur the status names the tier; the command runs; its result says it was not confined, with the code
runShellCommand — bac à sable indisponible @cap:executer-une-commande/moteur la commande tourne comme avant, le résultat dit `unconfined` avec le code, la raison est journalisée UNE fois
runShellCommand — bac à sable indisponible @cap:executer-une-commande/moteur un backend qui se déclare indisponible : sa raison est citée telle quelle
runShellCommand — bac à sable disponible qui ne démarre pas @cap:executer-une-commande/moteur la commande est REFUSÉE avec la raison du backend, et ne tourne pas sans lui
runShellCommand — bac à sable disponible qui ne démarre pas @cap:executer-une-commande/moteur dans une séquence de preuve, le refus est une panne d’infra (infra_error), jamais un vert
runShellCommand — le Stop du job (#750) @cap:executer-une-commande/moteur le signal tue la commande en cours : ABORTED, bien avant son timeout, et son processus est mort
runShellCommand — le Stop du job (#750) @cap:executer-une-commande/moteur un job déjà arrêté ne lance plus rien
runShellCommand — sans bac à sable, ce qu’une commande laisse tourner vit jusqu’à la fin du JOB @cap:executer-une-commande/moteur la commande 2 joint le serveur que la commande 1 a lancé ; fermer le job le tue
runShellCommand — sans bac à sable, ce qu’une commande laisse tourner vit jusqu’à la fin du JOB @cap:executer-une-commande/moteur fermer UN job ne touche pas aux processus d’un autre
a command that ran without the sandbox says so in its result @cap:executer-une-commande/moteur run_command: `sandbox` = { confined: false, code }
a command that ran without the sandbox says so in its result @cap:executer-une-commande/moteur run_skill_script: `sandbox` = { confined: false, code }
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur on by default: the command goes to the container, with the job folders
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur switched off: run_command runs unconfined, writes for real, and says SANDBOX_DISABLED
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur switched off: run_skill_script says SANDBOX_DISABLED too, its real output intact
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur the setting is re-read at every command: on, off, on again within the same job
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur a folder the user added reaches the writable roots of the next container
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur an unreadable setting refuses the command with its code, and nothing runs
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur a job created without a workspace (an internal /api/agent caller) follows the workspace of its agent
the workspace sandbox switch, through the real tools @cap:executer-une-commande/moteur a job whose agent belongs to no workspace either is refused, never run under a guessed setting
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur the run of the ticket: a Python script that pip-installs asks for installing software
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur the notifier receives what the gate read, the same as the row
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur "never" refuses the script, tells the agent what, and asks no one
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur every interpreter and every way of running a file, on every OS
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur the code written into a command is read the same way
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur a script run by a script is read too, and named where it is
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur a script that only reads and writes its own files runs unasked
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur a binary run directly is a program like any other: judged by its name
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur a download in a script runs inside the workspace, and asks when the script sends it outside
a command that runs a script is judged by the script (#635) @cap:executer-une-commande/moteur past a cd that may fail, the folder the line started in is judged too (#723)
a script that cannot be read is code nobody read ahead (#635) @cap:executer-une-commande/moteur outside the workspaces, missing, too large, or named at run time: asked under "ask", and why
a script that cannot be read is code nobody read ahead (#635) @cap:executer-une-commande/moteur by default it runs, like a script downloaded then run in the same line
a script that cannot be read is code nobody read ahead (#635) @cap:executer-une-commande/moteur a script path decided at run time asks even by default
a script that cannot be read is code nobody read ahead (#635) @cap:executer-une-commande/moteur "never" refuses it
a script that cannot be read is code nobody read ahead (#635) @cap:executer-une-commande/moteur a bare name not in the folder is a program from the PATH, not a missing script
review pass 1 of #683: no source a command runs goes unjudged @cap:executer-une-commande/moteur P1: a source with a NUL byte is still read; one that is not text is unread
review pass 1 of #683: no source a command runs goes unjudged @cap:executer-une-commande/moteur P2: string escapes are decoded as the language decodes them
review pass 1 of #683: no source a command runs goes unjudged @cap:executer-une-commande/moteur P2: the command inside a one-line control construct is judged
review pass 1 of #683: no source a command runs goes unjudged @cap:executer-une-commande/moteur P2: past the reading budget, the rest is unread, never dropped
review pass 2 of #683: a script the system runs is source, and every shell construct is read @cap:executer-une-commande/moteur C1: a script run directly that holds a NUL is still read
review pass 2 of #683: a script the system runs is source, and every shell construct is read @cap:executer-une-commande/moteur C1: an executable (ELF, PE, Mach-O) is a program; bytes that are neither text nor one are unread
review pass 2 of #683: a script the system runs is source, and every shell construct is read @cap:executer-une-commande/moteur C2: case, select, functions, switch, try and trap blocks are read, in sh and PowerShell
cmd conditions and here-docs at the gate (#683) @cap:executer-une-commande/moteur a cmd script with if, without brackets, is read
cmd conditions and here-docs at the gate (#683) @cap:executer-une-commande/moteur a here-doc in a script is read in the language of the program it feeds, at its line
cmd conditions and here-docs at the gate (#683) @cap:executer-une-commande/moteur a here-doc and a here-string in the command itself, and a file on standard input
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur pass 5: an apostrophe in a body does not hide the next here-document
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur C2 (pass 4): a comment after ) and (( )) arithmetic open no here-document
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur P2 (pass 4): destructive_gate holds a here-document fed to a shell
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur C2: a quoted << opens no here-document, and the lines after it are judged
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur C3: a machine-wide destroyer in a script reaches the floor, typed or not
review pass 3 of #683: no line dropped, and the hard floor reads the code too @cap:executer-une-commande/moteur C3: a string that only mentions a destroyer is no command
review pass 6 of #683: the reader of a here-document @cap:executer-une-commande/moteur a body piped to sh, or fed to sudo -u x sh, is judged as commands
isCatastrophicCall needs only the workspaces @cap:executer-une-commande/moteur gives the same verdict from { workspaces } as from a full context
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur delete_files: the forms of the ticket ask, naming the kind and the command
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur delete_files: a target the text establishes runs as before
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur a line read in a script is judged the same way, and the card says where
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur every other kind follows the same rule
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur the two cases that already asked are instances of the rule: their verdicts are unchanged
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur one reading of a word decided at run time for every kind: a download target too
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur several kinds in one line: each asks for its own target, and only for it
an allowed kind asks when the text cannot establish its target (#715) @cap:executer-une-commande/moteur forms that had no kind at all are now deletions, held under the default policy
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 runs by default, a stored "ask" 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 a Yolo agent as migration 0125 is asked for a deletion whose files the text does not name (#715)
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)
an agent nobody configured downloads without asking (#614) @cap:executer-une-commande/moteur under destructive_gate and under a Yolo rule, a download runs with no approval row
an agent nobody configured downloads without asking (#614) @cap:executer-une-commande/moteur a stored "ask" for downloads still asks, naming the download
an agent nobody configured downloads without asking (#614) @cap:executer-une-commande/moteur what a download is chained to is still judged: code runs, an install and a deletion ask
an allowed download asks when it writes outside the workspace (#614, review of #618) @cap:executer-une-commande/moteur a target outside the workspaces asks, and the card says where
an allowed download asks when it writes outside the workspace (#614, review of #618) @cap:executer-une-commande/moteur a target inside the workspace runs, absolute or relative, and a later cd does not move it
an allowed download asks when it writes outside the workspace (#614, review of #618) @cap:executer-une-commande/moteur each place outside is attached to the command that writes there
an allowed download asks when it writes outside the workspace (#614, review of #618) @cap:executer-une-commande/moteur a download through a dangling link is judged where the link points
an allowed download asks when it writes outside the workspace (#614, review of #618) @cap:executer-une-commande/moteur a stored "never" for downloads blocks, inside the workspace too
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur the exact command of 02/10, from a resolved folder, runs with no approval row
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a download sent to the null sink of the host asks no one, in any form
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a download really outside the workspace still asks, naming the place
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur the card names the place as written: never a path the command did not write (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur the null sink in the line never hides the real place, in any form (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur $null is a plain file name for the shell run_command uses, so it asks (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a redirection inside a wrapper or after an escaped quote still asks (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur every name that is not the null sink is a place, and asks, shown as written (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a Windows device name is a device on Windows and a real file elsewhere (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur the host the commands run on decides what a Windows device name is, on any machine running the tests (#669)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a script named after an interpreter is read as the script it is (#710, Codex pass 7)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur a script named after cd moves no folder of the reading (#710, Codex pass 8)
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur run_command with no cwd and several workspaces: the agent is told, no one is asked
nowhere is not a place, and an unaddressed start never reaches a person (#669) @cap:executer-une-commande/moteur code_task, the other tool with a starting folder, refuses the same way
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur with the default policy, each is held for the person, under destructive_gate and under a Yolo rule
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur an agent stored before #667, even with every kind allowed, is asked
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur allowed by the owner, it runs; a background dev server is never held
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur "never" refuses, asks no one, and points the agent to a tool that asks the person
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur a program decided at run time asks under the default policy, and "never" on inline code refuses it
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur "never" refuses what a group or a block starts, glued or spaced
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur every kind refused says the same remedy, never naming a tool
what reaches the screen, a printer or someone is asked (#667) @cap:executer-une-commande/moteur after a decline, the model reads which kinds held the command and the same remedy
a line that redefines a command name asks (#710, Codex pass 4) @cap:executer-une-commande/moteur asks under the default policy, and "never" on inline code refuses it
a line that redefines a command name asks (#710, Codex pass 4) @cap:executer-une-commande/moteur a helper function written with its body runs unasked
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur cmd: the batch file after one that changes folder is read from that folder
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur cmd: a batch file's setlocal takes its moves back at its end, and at endlocal
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur sh: what `.` reads moves the line; a script run directly does not
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur sh: after `source`, which only bash has, the folder is not known: what follows asks
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur PowerShell: a .ps1 a script runs leaves it in the location the .ps1 ends in
a script run in the line's own process leaves the line where it ends (#717) @cap:executer-une-commande/moteur a script of the line that is not read leaves the folder unknown: what follows asks
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cmd /c "cd decoy" & cleanup.bat reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur powershell -Command "cd decoy" & cleanup.bat reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy | more & cleanup.bat reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur bash -c "cd decoy" && ./cleanup.sh reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur (cd decoy) && ./cleanup.sh reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy | cat; ./cleanup.sh reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur cd decoy & ./cleanup.sh reads the starting folder’s cleanup
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur a child's own later commands run where it moved
a folder move made in a child process stays there (#717) @cap:executer-une-commande/moteur a script line's child keeps its move from the script's next lines
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a script run in the line's process that leaves the workspace takes the download out with it
where a download lands follows the same folder moves (#717) @cap:executer-une-commande/moteur a child that leaves the workspace does not take the download with it
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur false && cd decoy; ./cleanup.sh reads the starting folder’s cleanup.sh
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur if false; then cd decoy; fi; ./cleanup.sh reads the starting folder’s cleanup.sh
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur for i in ; do cd decoy; done; ./cleanup.sh reads the starting folder’s cleanup.sh
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur cd nonexistent; ./cleanup.sh reads the starting folder’s cleanup.sh
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur mkdir out; cd out; ./cleanup.sh reads the starting folder’s cleanup.sh
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur the folder moved into too
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur a file in no folder of the line runs nothing, as in the starting folder
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur a script's move, on an earlier line of it, is a move too
past its && chain, a move may not have been made: the files of every folder the line may be in are read (#717, Nodal review passes 1 and 3) @cap:executer-une-commande/moteur cmd: a move on the right of && or in an if body
a move joined by && to what follows is made for it (#717, Nodal review) @cap:executer-une-commande/moteur mkdir out && cd out && ./gen.sh reads out/gen.sh only
a move joined by && to what follows is made for it (#717, Nodal review) @cap:executer-une-commande/moteur mkdir -p build && cd build && cmake .. && make, and a download there, ask nothing
a script named without its extension is the script the shell finds (#717, Nodal review pass 1) @cap:executer-une-commande/moteur cmd: a bare name or a path that is a batch file of the folder is read, and leaves the line where it ends
a script named without its extension is the script the shell finds (#717, Nodal review pass 1) @cap:executer-une-commande/moteur a batch file found that may not run: both folders; a program: the one the line is in
a script named without its extension is the script the shell finds (#717, Nodal review pass 1) @cap:executer-une-commande/moteur a folder the gate cannot look into: what the word is, and the folder after it, are not known
a script named without its extension is the script the shell finds (#717, Nodal review pass 1) @cap:executer-une-commande/moteur cmd: an .exe of the same name comes first; a name not in the folder is a program
a script named without its extension is the script the shell finds (#717, Nodal review pass 1) @cap:executer-une-commande/moteur PowerShell: a path without .ps1 is the .ps1 of the folder
a bare name not found after a move is a program of the PATH (#717, Nodal review pass 2) @cap:executer-une-commande/moteur cd sub && npm.cmd test asks nothing
a bare name not found after a move is a program of the PATH (#717, Nodal review pass 2) @cap:executer-une-commande/moteur cd sub & npm.cmd test asks nothing
a bare name not found after a move is a program of the PATH (#717, Nodal review pass 2) @cap:executer-une-commande/moteur cd out && run.bat asks nothing
a bare name not found after a move is a program of the PATH (#717, Nodal review pass 2) @cap:executer-une-commande/moteur cd sub; deploy.sh asks nothing
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur sh: past `cd sub;`, a download and a script are judged from the starting folder too
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur cmd: #723's line, the starting folder's prepare.bat read after a cd that may fail
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur PowerShell: `cd missing; .\run` reads the starting folder's run.ps1
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur PowerShell: a Set-Location, then a download, judged from both folders
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur a word that may be a script, in a folder the gate cannot look into, asks (pass 4): a harmless prepare.bat in the workspace
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur a word that may be a script, in a folder the gate cannot look into, asks (pass 4): none
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur in a folder not known, a word that may be a script of it asks
a cd may fail whatever the disk holds when the gate judges: every folder the line may be in is judged (#723, Nodal review pass 3) @cap:executer-une-commande/moteur a line may be in at most MAX_FOLDERS folders: past that, not known
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo done >NUL 2>&1 reads no decoy
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur x.bat 2>&1 reads no decoy
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur curl -o a.jpg https://x/a 2>&1 reads no decoy
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur 1>&2 echo hi reads no decoy
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur echo hi >&2 & x.bat reads no decoy
cmd: the & of a handle duplication separates nothing (#717, Nodal review pass 5) @cap:executer-une-commande/moteur cd .. & echo done >NUL 2>&1 asks nothing
the gate judges the text, not the machine it runs on (#717) @cap:executer-une-commande/moteur cmd: a download target written with backslashes leaves the workspace
the gate judges the text, not the machine it runs on (#717) @cap:executer-une-commande/moteur PowerShell: a Set-Location, then a download, judged from both folders
the gate judges the text, not the machine it runs on (#717) @cap:executer-une-commande/moteur PowerShell on a POSIX host: a backslash still separates folders
the gate judges the text, not the machine it runs on (#717) @cap:executer-une-commande/moteur a folder move written with backslashes enters each folder it names
the gate judges the text, not the machine it runs on (#717) @cap:executer-une-commande/moteur a download from a folder entered with backslashes is judged from there
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: curl -o .\./evil.zip https://x/f writes outside, and asks
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: curl https://x/f > .\./out writes outside, and asks
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: curl -o \.\./evil.zip https://x/f writes outside, and asks
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: curl -o .\.\/evil.zip https://x/f writes outside, and asks
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: wget -O .\./evil.zip https://x/f writes outside, and asks
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: a cd written with escapes moves where sh goes
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: a program name written with escapes is the program sh runs
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur each reading is judged from where the line starts, never from the other's folders
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: a script written with escapes is the one sh runs
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: an escaped backslash inside the workspace stays inside
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur sh: a backslash sh keeps (in quotes) is still read as a separator: one question too many
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur PowerShell on a POSIX host, inline: a backslash still separates folders
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur cmd: a caret is taken out as cmd takes it (`echo .^.\evil.zip` prints `..\evil.zip`)
a path is judged as the shell that runs the line hands it on (#717, Nodal review pass 7) @cap:executer-une-commande/moteur cmd and PowerShell keep a backslash: #669 unchanged on a Windows host
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: cur\l https://x/f > .\./out asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: \curl https://x/f > .\./out asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: ir\m https://x/f > .\./out asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: cu^rl https://x/f > ..\out asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: curl https://x/f > .^.\out asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: curl https://x/f > ""../x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: curl https://x/f > ""../x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: curl https://x/f > ''..\x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: curl https://x/f > ''..\x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: curl https://x/f > "a"/../../x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: curl https://x/f > "a"/../../x asks
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur posix: curl URL > out.txt asks nothing
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur windows: curl URL > out.txt asks nothing
a redirection is read with its command, by each shell that reads the line (#717, Nodal review pass 8) @cap:executer-une-commande/moteur a sh script on a Windows host: its line is read by sh, the download seen there
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: ( curl https://x/a ) > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: { curl https://x/a; } > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: ( ( curl https://x/a ) ) > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: { ( curl https://x/a ); } > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: for i in 1; do curl https://x/a; done > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: while true; do curl https://x/a; done > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: if true; then curl https://x/a; fi > ../outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur windows: ( curl https://x/a ) > ..\outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur windows: ( ( curl https://x/a ) ) > ..\outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur windows: if 1==1 ( curl https://x/a ) > ..\outside.txt asks
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur PowerShell: a parenthesis redirected writes its output
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: ( cd ..; curl https://x/a ) > out.txt is opened before the group runs, in the folder the line is in
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur windows: (cd .. & curl https://x/a) > out.txt is opened before the group runs, in the folder the line is in
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur posix: ( npm test ) > log.txt 2>&1 asks nothing
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur windows: ( npm test ) > log.txt 2>&1 asks nothing
a group's redirection is its commands' (#717, Nodal review pass 9) @cap:executer-une-commande/moteur a redirection alone runs nothing and lands no download
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur for u in "$@"; do if [[ $u == https* ]]; then curl "$u"; fi; done > ../log asks
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur while read l; do case $l in a) curl https://x/a;; esac; done > ../log asks
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur for i in 1; do while true; do if true; then curl https://x/a; fi; break; done; done > ../log asks
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur if true; then while true; do ! curl https://x/a; break; done; fi > ../log asks
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur ! for i in 1; do curl https://x/a; done > ../log asks
sh compounds nest on every word in command position (#717, Nodal review pass 10) @cap:executer-une-commande/moteur a loop's redirection inside an if is the loop's, not the if's first command's
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in if) curl https://x/a;; for) echo;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in (done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in \done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in d\one) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in "done") curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in a) echo;& done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in done) ( curl https://x/a ) > ../f;; esac asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in done) ( curl https://x/a ) > ../f;; esac asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur case $x in start|done) curl https://x/a;; esac > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur time for i in 1; do curl https://x/a; done > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur time -p for i in 1; do curl https://x/a; done > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur coproc { curl https://x/a; } > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur coproc NAME { curl https://x/a; } > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur coproc while true; do curl https://x/a; break; done > ../f asks
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur a pattern named after a closer closes nothing: the loop's redirection is the loop's
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur `;&` falls through in the same shell: a cd before it moves what follows
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur a pattern keeps its clause's commands may-not-run: the folder before the move is read too
a case pattern is no reserved word, and time, coproc, ! lead to a command (#717, Nodal review pass 11) @cap:executer-une-commande/moteur an ordinary case on several lines asks nothing
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur case $mode in @(dev|prod)) (rm -rf build);; esac: the clause after an extglob pattern is read
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur case $x in !(z)) (rm -rf build);; esac: the clause after an extglob pattern is read
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur case $x in @(a|b(c))) (rm -rf build);; esac: the clause after an extglob pattern is read
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if true; then case $x in done) curl https://x/a;; esac > ../f; fi: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur for f in 1; do case $f in done) curl https://x/a;; esac > ../f; done: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if false; then :; else case $x in done) curl https://x/a;; esac > ../f; fi: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if case $x in done) curl https://x/a;; esac > ../f; then :; fi: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur ! case $x in done) curl https://x/a;; esac > ../f: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur time case $x in done) curl https://x/a;; esac > ../f: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur coproc case $x in done) curl https://x/a;; esac > ../f: the case, wherever a command starts, ends at `in`; `done)` is its pattern
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur (case $x in a) curl https://x/a;; esac) > ../f asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if true; then case $x in done) curl https://x/a;; esac > ../f; fi asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur for f in 1; do case $f in done) curl https://x/a;; esac > ../f; done asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if false; then :; else case $x in done) curl https://x/a;; esac > ../f; fi asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur if case $x in done) curl https://x/a;; esac > ../f; then :; fi asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur ! case $x in done) curl https://x/a;; esac > ../f asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur time case $x in done) curl https://x/a;; esac > ../f asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur coproc case $x in done) curl https://x/a;; esac > ../f asks
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur a case in a substitution asks nothing
one reader of case patterns, as bash reads them (#717, Nodal review pass 12) @cap:executer-une-commande/moteur a pattern that never ends is said: the line asks
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur case $x in $(rm -rf / $(echo x))) :;; esac: the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur bash -c 'case $x in $(rm -rf / $(echo x))) :;; esac': the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur case $x in `rm -rf /`) :;; esac: the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur cat <<EOF $(rm -rf / $(echo x)) EOF: the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur echo "$(case $x in a) rm -rf /;; esac)": the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur echo "$(echo '(' ; rm -rf /)": the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur echo "$(echo "(" ; rm -rf /)": the floor sees rm -rf /
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur an arithmetic expansion is no code: a variable named like a program runs nothing
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur a substitution with a quoted parenthesis in a pattern is read
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur an arithmetic pattern asks nothing
a substitution is code wherever it stands, nested ones read whole (#717, Nodal review pass 13) @cap:executer-une-commande/moteur every command of nested substitutions is read, quoted or not
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo case; rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(grep case x; rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(rm -rf /; echo $'a\'b')": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo $'a\'b'; rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo $'a\'b'; rm -rf /: the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo ${x//)/}; rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo $[1)]; rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(case $x in a) echo esac;; b) rm -rf /;; esac)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo a # ) rm -rf /)": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo hi; rm -rf /": the floor sees rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur PowerShell: Write-Output "$(Write-Output a # ) Remove-Item -Recurse build)", a comment closes nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur PowerShell: Write-Output "$(<# ) #> Remove-Item -Recurse build)", a comment closes nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur nested ten thousand deep: no crash, and the line asks
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur posix: echo $((a+b)) asks nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur posix: echo "$(date)" asks nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur posix: git commit -m "$(cat msg)" asks nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur posix: echo "$(case $x in a) echo hi;; esac)" asks nothing
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur PowerShell: "$($x.Name)" is no action
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo case in x) ; rm -rf / ": the floor sees no rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(echo $'a\'b') ; rm -rf / ": the floor sees no rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur echo "$(case $x in a) echo hi;; esac) ; rm -rf / ": the floor sees no rm -rf /
a substitution is never dropped, and read with the grammar the scan knows (#717, Nodal review pass 14) @cap:executer-une-commande/moteur PowerShell: a comment in the line is no code
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur rm -rf / ; echo (((((((((((((((((((((((((((((((((x))))))))))))))))))))))))))))))))): the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur ((((((((((((((((((((((((((((((((( rm -rf / ))))))))))))))))))))))))))))))))): the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur rm -rf / ; echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo "$(echo x)")")")")")")")")")")")")")")")")")")")")")")")")")")")")")")")")": the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { rm -rf /; } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }: the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur rm -rf / ; echo $(((((((((((((((((((((((((((((((((((1))))))))))))))))))))))))))))))))))): the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur bash -c 'bash -c '\''bash -c '\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''rm -rf /'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\'''\''': the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur bash -c 'bash -c '\''bash -c '\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''bash -c '\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''echo hi'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\''\'\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\''\'\''\'\'''\'''\''\'\'''\'''\''\'\'''\'''\''': the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur (((((((((((((((((((( rm -rf / )))))))))))))))))))): the floor holds it
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur what stands within the limit is read as any line
a reading limit takes nothing away, and what it cannot read reaches the floor (#717, Nodal review pass 15) @cap:executer-une-commande/moteur a line no reading follows never runs without a human, whatever is allowed
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur pwsh -Command $c: decided at run time, asked, never the floor
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur powershell -Command $c: decided at run time, asked, never the floor
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur iex $c: decided at run time, asked, never the floor
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur & (Get-Item x): decided at run time, asked, never the floor
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur a line that writes the text of the mark is no unread text
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur env nine times: past the depth every reading follows, unread, and the floor holds it
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur wsl nine times: past the depth every reading follows, unread, and the floor holds it
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur busybox nine times: past the depth every reading follows, unread, and the floor holds it
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur source nine times: past the depth every reading follows, unread, and the floor holds it
unread text has a mark of its own, and one depth rule for every reading (#717, Nodal review pass 16) @cap:executer-une-commande/moteur payloads and wrappers mixed past the depth: unread
checkpoints restore runs git in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) TÉMOIN : la même restauration, git sur l’hôte, exécute le piège
checkpoints restore runs git in the sandbox: a planted sub-repository never runs on the host @cap:executer-une-commande/moteur (Windows, MXC available) la commande du CLI restaure sans rien lancer sur l’hôte
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
describeGatedAction dit le geste d’un file_move, déplacement ou copie (#879) @cap:travailler-sur-des-fichiers/ecran
explainApproval — built-in tools keep their deterministic impact file_move : une écriture ciblée sur la destination, là où le fichier arrive (#879) @cap:travailler-sur-des-fichiers/ecran
111 more
computeApprovalImpactLine — file_move : le geste, puis l’écrasement (#879) @cap:travailler-sur-des-fichiers/ecran un déplacement avec replace:true dit « Moves A to B » et qu’il remplace ou retire un fichier partagé
computeApprovalImpactLine — file_move : le geste, puis l’écrasement (#879) @cap:travailler-sur-des-fichiers/ecran un déplacement sans replace ne remplace jamais (#933) : la carte ne dit que la source retirée
computeApprovalImpactLine — file_move : le geste, puis l’écrasement (#879) @cap:travailler-sur-des-fichiers/ecran une copie avec replace:true dit « Copies A to B » et qu’elle écrase le fichier là
computeApprovalImpactLine — file_move : le geste, puis l’écrasement (#879) @cap:travailler-sur-des-fichiers/ecran une copie sans replace ne remplace jamais (#933) : la carte le dit, sans écrasement
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
/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)
DeliveryBlock — un fichier déplacé ou copié dit « moved A to B » (#879) @cap:travailler-sur-des-fichiers/ecran la plaque d’un document et la rangée d’une image nomment la source et la destination
FilesCard — un fichier déplacé ou copié dit d’où il vient (#879) @cap:travailler-sur-des-fichiers/ecran « moved A to B » et « copied A to B », sans bouton de diff
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
568 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
a copy of the workspace index keeps git racy-clean protection @cap:travailler-sur-des-fichiers/moteur snapshot : la réécriture de même taille est photographiée
a copy of the workspace index keeps git racy-clean protection @cap:travailler-sur-des-fichiers/moteur restoreCheckpoint : le fichier réécrit est bien remis, et la réécriture gardée en sûreté
a copy of the workspace index keeps git racy-clean protection @cap:travailler-sur-des-fichiers/moteur statusAgainstFrozenIndex : la copie figée voit la réécriture
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
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur starts a real Postgres and applies the REAL migrations
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur the table exists after the real migrations, with the columns the seam writes
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur a row is read back with the tool and the seq of its call
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur refuses a hash that is not a sha-256, by its named constraint
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur refuses an upper-case hash, by its named constraint
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur refuses the same file twice on the same call, by its named constraint
migration 0149_tool_call_reads @cap:travailler-sur-des-fichiers/moteur deleting the call deletes its rows (on delete cascade)
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur starts a real Postgres and applies the REAL migrations
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur the table exists after the real migrations, with the columns the seam writes
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur a row is read back with the seq of its call
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses a kind outside the three, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses an absent file with a hash, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses a read file without its hash, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses an unreadable file with a hash, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses an after source that is neither written nor read, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur refuses written bytes on a file that is not there, by its named constraint
migration 0148_tool_call_writes @cap:travailler-sur-des-fichiers/moteur deleting the call deletes its rows (on delete cascade)
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur anthropic: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur openai: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur google: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur openrouter: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur mistral: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur groq: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur deepseek: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur openai-compatible: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur moonshot: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur minimax: the base64 is sent once, as an image, never inside the tool result text
an image a tool attached reaches every provider as an image @cap:travailler-sur-des-fichiers/moteur ollama: the base64 is sent once, as an image, never inside the tool result text
withToolResultAttachmentsAsUserParts @cap:travailler-sur-des-fichiers/moteur the tool result keeps its text; the image follows in a user message, introduced by its call
withToolResultAttachmentsAsUserParts @cap:travailler-sur-des-fichiers/moteur several calls and images in one tool message: one user message, in call order
withToolResultAttachmentsAsUserParts @cap:travailler-sur-des-fichiers/moteur a transcript without images is returned as it was
a PDF a tool attached reaches every provider that takes one, as a document @cap:travailler-sur-des-fichiers/moteur anthropic (a document block): the bytes sent once, in the provider form, never inside the tool result text
a PDF a tool attached reaches every provider that takes one, as a document @cap:travailler-sur-des-fichiers/moteur openrouter (a file part, its data URL, named; the owner runs anthropic/claude-haiku-5.5): the bytes sent once, in the provider form, never inside the tool result text
a PDF a tool attached reaches every provider that takes one, as a document @cap:travailler-sur-des-fichiers/moteur google (inline data): the bytes sent once, in the provider form, never inside the tool result text
a PDF a tool attached reaches every provider that takes one, as a document @cap:travailler-sur-des-fichiers/moteur mistral (a document_url data URL): the bytes sent once, in the provider form, never inside the tool result text
a PDF a tool attached reaches every provider that takes one, as a document @cap:travailler-sur-des-fichiers/moteur openai (Responses): an input_file of the bytes
withToolResultAttachmentsAsUserParts, a document @cap:travailler-sur-des-fichiers/moteur the tool result keeps its text; the PDF follows as a file part, introduced by its call
withToolResultAttachmentsAsUserParts, a document @cap:travailler-sur-des-fichiers/moteur an image and a PDF of one call: each in its own form, in order, named as files
the persona file a runtime turn hands to claude @cap:travailler-sur-des-fichiers/moteur carries the persona, then the workspace's CLAUDE.md quoted, then nothing more
the persona file a runtime turn hands to claude @cap:travailler-sur-des-fichiers/moteur is the bare persona when the workspace has no instructions
the persona file a runtime turn hands to claude @cap:travailler-sur-des-fichiers/moteur never reads the instructions of another attached folder, nor of a parent
the persona file a runtime turn hands to claude @cap:travailler-sur-des-fichiers/moteur composeClaudePersona is the one place that builds it
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
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a channel photo path — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a channel file: URL, whatever its name — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: bytes — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a data: URL — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: base64 — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a file part of an image type — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: an https: URL — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a URL object — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url file: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url data: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-data — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: file-data image/png — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: media image/png — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url https: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a channel photo path — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a channel file: URL, whatever its name — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: bytes — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a data: URL — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: base64 — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a file part of an image type — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: an https: URL — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) person: a URL object — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url file: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url data: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-data — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: file-data image/png — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: media image/png — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur anthropic (native) tool: image-url https: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a channel photo path — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a channel file: URL, whatever its name — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: bytes — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a data: URL — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: base64 — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a file part of an image type — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: an https: URL — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a URL object — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url file: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url data: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-data — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: file-data image/png — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: media image/png — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url https: — a model that sees
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a channel photo path — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a channel file: URL, whatever its name — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: bytes — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a data: URL — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: base64 — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a file part of an image type — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: an https: URL — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) person: a URL object — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url file: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url data: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-data — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: file-data image/png — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: media image/png — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur openai-compatible (chat completions) tool: image-url https: — a model that does not see
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur a file part that is not an image is left alone
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur a string no image can be read from is said, never passed on
every image shape, at the wire @cap:travailler-sur-des-fichiers/moteur every inline shape counts toward the budget, on its bytes
a PDF of the transcript @cap:travailler-sur-des-fichiers/moteur a saved PDF reaches Anthropic as a document block, its pages spending the image budget
a PDF of the transcript @cap:travailler-sur-des-fichiers/moteur a model that takes no PDF: the reason in its place, the bytes never read
a PDF of the transcript @cap:travailler-sur-des-fichiers/moteur a .pdf whose bytes are an image is sent as the image it is
a tool result that carries an image reaches the model @cap:travailler-sur-des-fichiers/moteur a model that sees: each image, bytes intact, in a user message right after the tool results
a tool result that carries an image reaches the model @cap:travailler-sur-des-fichiers/moteur a model that does not see: the call says why, and no image or byte leaves
a transcript that carries an image, resumed under a model that does not see @cap:travailler-sur-des-fichiers/moteur the image is said, never sent: the agent model changed while the job waited for an approval
the image budget of a request: the person first, then the newest tool images @cap:travailler-sur-des-fichiers/moteur a tool filling the budget never pushes out the photo the person sent; an evicted image names its file
a PDF file_read returns reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur the document, bytes intact, as a file part after the tool result; the row keeps its path
a PDF file_read returns reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur a model that sees images but takes no PDF: the call says why, and no byte leaves
a transcript that carries a PDF, resumed @cap:travailler-sur-des-fichiers/moteur the resumed request sends the document again, once: neither lost nor doubled
a transcript that carries a PDF, resumed @cap:travailler-sur-des-fichiers/moteur the agent moved to a model that takes no PDF while it waited: the PDF is said, never sent
prompt d’un root sur l’espace partagé du 01/10 @cap:travailler-sur-des-fichiers/moteur Alfred (tableur, shell, voix) : le livrable d’hier n’est plus nommé, les moyens le restent
prompt d’un root sur l’espace partagé du 01/10 @cap:travailler-sur-des-fichiers/moteur un root sans shell (tableur seul) : ni `## Git`, ni rien qui le suppose
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
createFileExclusive — the staging name is replaced before link() @cap:travailler-sur-des-fichiers/moteur never reports success for a file that is not the one it wrote, and leaves no entry at the path
createFileExclusive @cap:travailler-sur-des-fichiers/moteur creates the file with the given content and leaves nothing else in the folder
createFileExclusive @cap:travailler-sur-des-fichiers/moteur writes bytes as given
createFileExclusive @cap:travailler-sur-des-fichiers/moteur refuses an existing file with EEXIST and does not touch its content
createFileExclusive @cap:travailler-sur-des-fichiers/moteur refuses an existing folder with EEXIST
createFileExclusive @cap:travailler-sur-des-fichiers/moteur refuses a DANGLING symbolic link with EEXIST and never creates its target
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
one speech path @cap:travailler-sur-des-fichiers/moteur no product source outside packages/speech/src/providers calls a text-to-speech API
openrouterSpeechAdapter @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
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a request naming no model is refused before any call, never given one
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur reads the sample rate from the answer when it names one
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a bitrate parameter is not read as the sample rate
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur an odd number of bytes is a cut stream: refused, never wrapped
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a 200 that is not audio is said, never wrapped into a broken file
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a 200 with no bytes is said, never written as a silent file
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur an HTTP error carries the status and the vendor’s words; 402 is said as no credit
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur sends a Gemini delivery style as provider options, never inside the spoken text
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur adds no Google option for a model that is not Google, nor for an empty style
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur refuses empty text and an empty voice before any request leaves
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur refuses to bind without a key
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur honours the base URL stored with the key
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur an mp3 answer travels as mp3, bytes untouched, in the file and in the stream
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a container nothing here plays is said, never played
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur lists the speech models OpenRouter serves, each with the voices it lists
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur a models list refused or unreadable is said, never read as empty
openrouterSpeechAdapter @cap:travailler-sur-des-fichiers/moteur declares its stream: raw PCM (#943)
file_move : l’instantané couvre les DEUX dossiers, par le vrai seam (#879) @cap:travailler-sur-des-fichiers/moteur un fichier déplacé de docs vers archive revient à sa place, octets intacts
file_move : l’instantané couvre les DEUX dossiers, par le vrai seam (#879) @cap:travailler-sur-des-fichiers/moteur une copie qui remplace un fichier se défait : l’ancien contenu revient
the system prompt file a code_task run hands to claude @cap:travailler-sur-des-fichiers/moteur carries the workspace CLAUDE.md files, quoted, from the cwd chain only
the system prompt file a code_task run hands to claude @cap:travailler-sur-des-fichiers/moteur removes its temp file when the run is over
the system prompt file a code_task run hands to claude @cap:travailler-sur-des-fichiers/moteur passes no file at all when the workspace has no instructions
the system prompt file a code_task run hands to claude @cap:travailler-sur-des-fichiers/moteur codex never carries the flag: it reads its own AGENTS.md
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
currentContentWrittenByAgentOf reads the disk last (#505) @cap:travailler-sur-des-fichiers/moteur a file changed while the records are being read is not ours
currentContentWrittenByAgentOf reads the disk last (#505) @cap:travailler-sur-des-fichiers/moteur an unchanged file whose last record is this agent’s is ours
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur shot.png: the image itself, its bytes intact, never on the audit row
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur photo.jpg: the image itself, its bytes intact, never on the audit row
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur anim.gif: the image itself, its bytes intact, never on the audit row
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur pic.webp: the image itself, its bytes intact, never on the audit row
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur screenshot: the image itself, its bytes intact, never on the audit row
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur a model that does not see: refused with its reason, no image, no bytes as text
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur a run that says nothing about its model passes no image, and says so
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur a format models do not take is refused as an image, named, never read as text
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur an image above the whole-read cap is refused with its size, even to a model that sees
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur an image outside the readable folders is refused by the folder rule, before any byte
file_read — an image file reaches a model that sees it @cap:travailler-sur-des-fichiers/moteur a text file named .png is read as text
the one rule for every image a tool attaches @cap:travailler-sur-des-fichiers/moteur sniffs the formats from their bytes, and SVG (text) as no image
the one rule for every image a tool attaches @cap:travailler-sur-des-fichiers/moteur admits a model format within the cap to a seeing model, and says why otherwise
one call attaches no more than one request carries @cap:travailler-sur-des-fichiers/moteur by count: the first 20 are attached, each one past them is refused with the budget named
one call attaches no more than one request carries @cap:travailler-sur-des-fichiers/moteur by bytes: 1 MiB images, as many as fit 10 MiB
file_read — a PDF reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur scan.pdf: the document itself, its bytes intact, its pages counted, never on the row
file_read — a PDF reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur scan.bin: the document itself, its bytes intact, its pages counted, never on the row
file_read — a PDF reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur a model that sees images but takes no PDF: refused with its reason, no file, no bytes as text
file_read — a PDF reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur a run that says nothing about its model passes no PDF, and says so
file_read — a PDF reaches a model that takes PDFs @cap:travailler-sur-des-fichiers/moteur a file above the cap whose pages weigh less is passed as its pages, cut out of it
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur without "pages": its first 20 pages, the rest said with how to read it
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur with "pages": that window, and nothing else
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur pages that are not in the document: refused, its pages named
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur pages that weigh more than a PDF can be passed at: as many as fit, said
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur one page heavier than a PDF can be passed at: refused, that page and the cap named
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur an encrypted (restricted) PDF: its window is rendered from the decrypted pages, their text intact, and said
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur "pages" on a file that is no PDF: said, never ignored
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur a file that only starts like a PDF is refused as one, why said, never read as text
file_read — a PDF longer than a request carries is read by windows of pages (#905 review) @cap:travailler-sur-des-fichiers/moteur a binary named .pdf is not a PDF: nothing attached, read as the file it is
the one rule, for a PDF @cap:travailler-sur-des-fichiers/moteur reads a PDF from its first bytes, and counts its pages
the one rule, for a PDF @cap:travailler-sur-des-fichiers/moteur the fixture is what it claims: a text page, and a scanned page with no text in it
the one rule, for a PDF @cap:travailler-sur-des-fichiers/moteur a PDF spends the request budget a page per image, shared with the images
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 with no model nor voice, speaks with the workspace's voice setting, and adds .wav to a bare name
generate_speech @cap:travailler-sur-des-fichiers/moteur explicit model and voice win over the setting
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 which key is missing for the workspace's voice, and writes nothing
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 empty 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 a model that answers mp3 is said as such, and nothing is written
generate_speech @cap:travailler-sur-des-fichiers/moteur writes .WAV as .wav
generate_speech @cap:travailler-sur-des-fichiers/moteur writes the WAV the OpenRouter SpeechAdapter builds from the samples OpenRouter answered
generate_speech @cap:travailler-sur-des-fichiers/moteur a provider refusal through the adapter reaches the agent with the vendor’s words
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
tool_call_reads: what a send read @cap:travailler-sur-des-fichiers/moteur send_file of a local file: the row names the real file and the bytes that were sent
tool_call_reads: what a send read @cap:travailler-sur-des-fichiers/moteur send_image of a local file: the row names the real file and the bytes that were sent
tool_call_reads: what a send read @cap:travailler-sur-des-fichiers/moteur send_video of a local file: the row names the real file and the bytes that were sent
tool_call_reads: what a send read @cap:travailler-sur-des-fichiers/moteur a send from a URL reads no local file: no row
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur file_read: one row on the call, the real path and the hash of the bytes read
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur file_read of a big file through a window: the hash covers the WHOLE file, which the window reads to its end
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur file_edit reads the file it edits: the row holds the bytes BEFORE its own write
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur file_search through contents: one row per file whose contents it read, none for a name-only search
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur skill_file_read: the row names the real file in the skill store and its bytes
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur skill_file_read of a big file through a window: the hash covers the whole file
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur xlsx_create then xlsx_read: the read row names the real file and the bytes on disk, and the create read nothing
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur docx_create then docx_read: the read row names the real file and the bytes on disk, and the create read nothing
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur pptx_create then pptx_read: the read row names the real file and the bytes on disk, and the create read nothing
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur an Office tool that reads before it writes records what it READ: the bytes before its own write
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur a tool that read and then refused (its own ok:false) DID read: the row is on that call
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur a tool that read and then THREW did read: the row is recorded on its failed call
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur a workspace folder reached through a junction: the row carries the REAL path, never the one the agent went through
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur a read that fails (no such file) leaves no row: nothing was read
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur a tool that reads no file (file_list) leaves no row
tool_call_reads: what each call read @cap:travailler-sur-des-fichiers/moteur an insert that fails never blocks the tool: it is logged by its code, and no row means "not recorded"
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur file_write then file_edit on one file: two rows linked to their calls, the chain readable in seq order
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur xlsx_create: one row, absent before, the bytes it left on disk after
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur docx_create: one row, absent before, the bytes it left on disk after
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur pptx_create: one row, absent before, the bytes it left on disk after
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur a call that fails still says what it did: the file it targeted, intact, before and after
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur a call that rewrites the same bytes: before equals after, said, not hidden
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur a command targets a FOLDER: it writes a file, and no per-file row exists for it
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur a read-only tool declares no target and leaves no row
tool_call_writes: what each call did to each file it targeted @cap:travailler-sur-des-fichiers/moteur an insert that fails never blocks the tool: it is logged by its code, and no row means "not recorded"
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur another writer between the rename and the re-read: the row keeps the bytes the call wrote, marked written
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur file_write reports the bytes it wrote: after source written, equal to the file it left
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur xlsx_create reports the bytes it wrote: after source written, equal to the file it left
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur docx_create reports the bytes it wrote: after source written, equal to the file it left
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur pptx_create reports the bytes it wrote: after source written, equal to the file it left
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur a file-target tool that writes WITHOUT reporting its bytes: the after state is a re-read, and the row says so
review pass 1 of #780: the after hash is the bytes the tool wrote @cap:travailler-sur-des-fichiers/moteur a call that wrote nothing has no written bytes: its after state is a re-read, and the row says so
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur reads each folder from the root down to the cwd, the closest last, local file last in its folder
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur never reads above the root, nor below the cwd
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur the root that bounds the read is the deepest attached folder containing the cwd
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur a cwd outside every attached folder is an error, not a guess
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur no instructions anywhere is null, not an empty block
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur quotes the content verbatim, in a wrapper made of attributes only
readWorkspaceMemory — which files, which order, where it stops @cap:travailler-sur-des-fichiers/moteur skips a file with a NUL byte and says so
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur follows an import inside the folder, relative to the file that holds it
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur never reads an import that points outside the folder: relative, absolute or home
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur never reads an import that LOOKS inside but resolves outside through a link
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur refuses a CLAUDE.md itself when its folder is a link leading out
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur does not loop on a cycle, and reads a file reached twice once
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur stops following after 5 hops, leaves the rest as text and says so
readWorkspaceMemory — imports stay inside the folder @cap:travailler-sur-des-fichiers/moteur leaves what is not a file as text without noise: a mention, an e-mail, code
findImportTokens @cap:travailler-sur-des-fichiers/moteur finds @paths outside code and strips trailing punctuation
readWorkspaceMemory — the cap is never silent @cap:travailler-sur-des-fichiers/moteur under the cap: nothing cut, nothing logged
readWorkspaceMemory — the cap is never silent @cap:travailler-sur-des-fichiers/moteur over the cap: keeps the files nearest the cwd, cuts the head of the first that does not fit, leaves out the rest, logs every cut
readWorkspaceMemory — the cap is never silent @cap:travailler-sur-des-fichiers/moteur never splits a multi-byte character when it cuts
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur déplace un fichier binaire d’un dossier à l’autre, sans que ses octets passent par le résultat
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur copie : la source reste, la destination porte les mêmes octets
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur un dossier existant comme destination garde le nom du fichier
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur une destination finie par « / » est un dossier : créé avec create_dirs, refusé sans
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur avec replace:true, un fichier existant dans un dossier de l’agent est remplacé, sans approbation
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur avec replace:true, une copie remplace aussi, et la source reste
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur un dossier comme source est refusé, et la raison le dit
file_move — déplacer et copier @cap:travailler-sur-des-fichiers/moteur une source absente, ou identique à la destination, est refusée
file_move — le périmètre est celui de file_write, des deux côtés @cap:travailler-sur-des-fichiers/moteur une source hors des dossiers de l’agent est refusée, et rien ne bouge
file_move — le périmètre est celui de file_write, des deux côtés @cap:travailler-sur-des-fichiers/moteur une destination hors des dossiers de l’agent est refusée, et la source reste
file_move — le périmètre est celui de file_write, des deux côtés @cap:travailler-sur-des-fichiers/moteur un lien qui sort du dossier ne sert pas de destination
file_move — le périmètre est celui de file_write, des deux côtés @cap:travailler-sur-des-fichiers/moteur un modèle de workflow partagé ne s’emporte pas, mais se copie
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur remplacer un fichier du dossier partagé que ce run n’a pas écrit attend une personne, et rien ne bouge
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur un fichier que ce run a écrit, changé entre la porte et le renommage, n’est pas remplacé
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur retirer du dossier partagé un fichier que ce run n’a pas écrit attend une personne, et rien ne bouge
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur COPIER depuis le dossier partagé le fichier d’un autre ne demande rien : la source reste
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur retirer du dossier partagé un fichier que CE run a écrit ne demande rien
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur une source partagée changée entre la porte et le renommage n’est pas retirée
file_move — la porte d’écrasement de file_write, sur la destination @cap:travailler-sur-des-fichiers/moteur un fichier NEUF dans le dossier partagé ne demande rien
file_move — le constat range la destination créée et la source retirée @cap:travailler-sur-des-fichiers/moteur un déplacement : une ligne « added » pour la destination, une ligne « deleted » pour la source
file_move — le constat range la destination créée et la source retirée @cap:travailler-sur-des-fichiers/moteur une copie : la seule destination est constatée, la source n’a pas bougé
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur un lien entre deux volumes (EXDEV) se fait en copie puis suppression, avec la date de la source
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur avec replace:true, un renommage entre deux volumes (EXDEV) se fait en copie puis suppression
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur avec replace:true, une suppression ratée après la copie est DITE : les deux fichiers existent
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur une source qui ne se retire pas (EBUSY) sur le même volume : rien ne bouge, et la raison le dit
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur une source qui ne se retire pas (EBUSY) entre deux volumes : rien ne bouge, et la raison le dit
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur un fichier encore ouvert ailleurs (EBUSY) sans replace (le lien) échoue avec sa raison, et rien ne bouge
file_move — entre deux volumes, et un fichier tenu par un autre programme @cap:travailler-sur-des-fichiers/moteur un fichier encore ouvert ailleurs (EBUSY) avec replace:true (le renommage) échoue avec sa raison, et rien ne bouge
file_move — la carte du fil dit « moved A to B » @cap:travailler-sur-des-fichiers/moteur un déplacement et une copie portent leur geste et la source
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur deux déplacements en même temps vers le même nom : un seul réussit, aucun document perdu
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur deux copies en même temps vers le même nom : une seule réussit, aucun document perdu
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur un fichier qui arrive au nom à l’instant de la pose n’est pas écrasé (déplacement)
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur un fichier qui arrive au nom à l’instant de la pose n’est pas écrasé (copie)
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur un nom pris dans un dossier de l’agent : refusé, la destination et la source intactes
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur une copie vers un nom pris : refusée, aucun temporaire laissé
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur un nom pris dans le dossier partagé : refusé tout de suite, sans demander personne
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur entre deux volumes (EXDEV), un nom pris est refusé, sans temporaire laissé
file_move — un nom pris n’est jamais remplacé sans replace:true (#933) @cap:travailler-sur-des-fichiers/moteur un lien physique de la source déjà à destination est un nom pris : les deux noms restent
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur une réservation tenue ouverte un instant (EPERM) : le renommage réessaie, et le déplacement se fait
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur une réservation tenue ouverte un instant (EACCES) : le renommage réessaie, et le déplacement se fait
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur une réservation tenue ouverte un instant (EBUSY) : le renommage réessaie, et le déplacement se fait
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur une réservation écrasée exprès entre deux essais n’est jamais remplacée par l’essai suivant
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur un déplacement vers un nom libre : fait, avec la date de la source, rien d’autre dans le dossier
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur une copie vers un nom libre : faite, la source reste, aucun temporaire
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur un déplacement et une copie vers un nom pris : refusés, ni réservation ni temporaire laissés
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur deux déplacements en même temps vers le même nom : un seul réussit, aucun document perdu
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur un fichier qui arrive au nom à l’instant de la réservation n’est pas écrasé
file_move — un volume sans liens physiques (FAT32, exFAT) ne remplace rien non plus (#933) @cap:travailler-sur-des-fichiers/moteur entre deux volumes ET sans liens : un nom pris est refusé, sans temporaire laissé
file_move — un renommage qui ne change que la casse (#933) @cap:travailler-sur-des-fichiers/moteur scan.pdf -> Scan.pdf : renommé, le contenu intact, un seul fichier
file_move — un renommage qui ne change que la casse (#933) @cap:travailler-sur-des-fichiers/moteur une copie sur soi-même en changeant la casse ne fait rien là où la casse ne compte pas
file_move — un retour en arrière reconnaît ce qu’il a posé sans numéro de fichier (revue A de #938) @cap:travailler-sur-des-fichiers/moteur sans liens physiques, un renommage raté retire la réservation : l’appel suivant passe
file_move — un retour en arrière reconnaît ce qu’il a posé sans numéro de fichier (revue A de #938) @cap:travailler-sur-des-fichiers/moteur une marque de réservation qui ne s’écrit pas : la réservation est retirée, et l’erreur dite
file_move — un retour en arrière reconnaît ce qu’il a posé sans numéro de fichier (revue A de #938) @cap:travailler-sur-des-fichiers/moteur une réservation écrasée exprès entre-temps n’est pas retirée : ce fichier n’est pas celui de l’appel
file_move — un retour en arrière reconnaît ce qu’il a posé sans numéro de fichier (revue A de #938) @cap:travailler-sur-des-fichiers/moteur une source qui ne se retire pas sur le même volume (un lien) : ce qui a été posé est retiré
file_move — un retour en arrière reconnaît ce qu’il a posé sans numéro de fichier (revue A de #938) @cap:travailler-sur-des-fichiers/moteur une source qui ne se retire pas entre deux volumes (une copie) : ce qui a été posé est retiré
file_move — un retour en arrière laisse un fichier écrit par-dessus entre-temps (revue A de #938, passe 2) @cap:travailler-sur-des-fichiers/moteur entre deux volumes (une copie) : le fichier écrit par-dessus garde ses octets, la source reste
file_move — un retour en arrière laisse un fichier écrit par-dessus entre-temps (revue A de #938, passe 2) @cap:travailler-sur-des-fichiers/moteur sur le même volume (un lien) : le fichier écrit par-dessus garde ses octets, la source reste
file_move — un déplacement inachevé dit ce qui est sur le disque (revue A de #938, passe 3) @cap:travailler-sur-des-fichiers/moteur sur le même volume (un lien) : « placé », et le fichier aux deux endroits
file_move — un déplacement inachevé dit ce qui est sur le disque (revue A de #938, passe 3) @cap:travailler-sur-des-fichiers/moteur entre deux volumes (une copie) : « placé », et le fichier aux deux endroits
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur replace:true entre deux volumes, la copie écrasée par un autre programme : rien n’a bougé, garder la source
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur replace:true entre deux volumes, la source supprimée par un autre programme : le fichier n’est plus qu’à destination
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur entre deux volumes, la source supprimée par un autre programme : le fichier n’est plus qu’à destination
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur sur le même volume, la source supprimée par un autre programme : le fichier n’est plus qu’à destination
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur entre deux volumes, la source complétée pendant la copie : la copie de l’appel est reconnue, et gardée
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur la source supprimée ET la destination écrasée : dit fort que l’original est perdu de vue
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur la source supprimée ET la destination retirée : rien nulle part, et c’est dit
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur la source là, la destination retirée par un autre programme : rien n’a bougé, garder la source
file_move — un déplacement inachevé se dit d’après le disque, vu une fois (revue A de #938, passe 4) @cap:travailler-sur-des-fichiers/moteur une lecture qui échoue en regardant le disque est dite comme telle, et rien n’est retiré
file_move — le chemin qui réussit ne lit aucun octet du fichier posé (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur un déplacement sur le même volume : aucune lecture
file_move — le chemin qui réussit ne lit aucun octet du fichier posé (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur une copie : aucune lecture
file_move — le chemin qui réussit ne lit aucun octet du fichier posé (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur un déplacement entre deux volumes : aucune lecture
file_move — le chemin qui réussit ne lit aucun octet du fichier posé (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur un déplacement sans liens physiques : aucune lecture
file_move — un lien sur un volume sans numéros de fichier se reconnaît à ses octets (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur la source complétée pendant le retrait raté : le lien est reconnu, retiré, rien n’a bougé
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur sur le même volume (un lien) : la destination garde l’original, et c’est dit
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur entre deux volumes (une copie) : la destination garde l’original, et c’est dit
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur replace:true entre deux volumes : la destination garde l’original, et c’est dit
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur sur le même volume, sans numéros de fichier : la destination garde l’original, et c’est dit
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur entre deux volumes, sans numéros de fichier : la destination garde l’original, et c’est dit
file_move — une source remplacée pendant l’appel n’est jamais prise pour l’original (arbitrage du 03/11) @cap:travailler-sur-des-fichiers/moteur la source remplacée ET la destination écrasée : l’original est perdu de vue, et c’est dit
file_move — un retrait n’a lieu que si les octets restent ailleurs (revue A de #938, passe 5) @cap:travailler-sur-des-fichiers/moteur un lien sur le même volume : un sosie posé sur la source ne fait pas retirer la destination
file_move — un retrait n’a lieu que si les octets restent ailleurs (revue A de #938, passe 5) @cap:travailler-sur-des-fichiers/moteur une copie entre deux volumes : un sosie posé sur la source ne fait pas retirer la destination
file_move — un retrait n’a lieu que si les octets restent ailleurs (revue A de #938, passe 5) @cap:travailler-sur-des-fichiers/moteur une copie dont le temporaire ne se retire pas : un sosie à destination n’est pas retiré, et c’est dit
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
D1 overwrite gate — a file this AGENT wrote belongs to it, whatever the run (#917) @cap:travailler-sur-des-fichiers/moteur a shared file the agent wrote in one run is replaced by its next run without asking anyone
D1 overwrite gate — a file this AGENT wrote belongs to it, whatever the run (#917) @cap:travailler-sur-des-fichiers/moteur a shared file the agent wrote in one run is moved out by its next run without asking anyone
D1 overwrite gate — a file this AGENT wrote belongs to it, whatever the run (#917) @cap:travailler-sur-des-fichiers/moteur the same file changed by a person after the agent wrote it asks again, and nothing moves
D1 overwrite gate — a file this AGENT wrote belongs to it, whatever the run (#917) @cap:travailler-sur-des-fichiers/moteur the same file rewritten by another agent after this agent wrote it asks again, and nothing moves
D1 overwrite gate — a file this AGENT wrote belongs to it, whatever the run (#917) @cap:travailler-sur-des-fichiers/moteur a shared file another agent created asks this agent, and nothing moves
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
un fichier déplacé ou copié garde d’où il vient (#879) @cap:travailler-sur-des-fichiers/moteur le geste et la source voyagent de la carte jusqu’à la liste livrée, rebasés comme le chemin
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
the web’s git init cannot write outside the project, even through a .git planted at the last moment @cap:travailler-sur-des-fichiers/moteur (Windows, MXC available) par les programmes de Nodal, un dossier neuf reçoit un VRAI dépôt (revue passe 7)
the web’s git init cannot write outside the project, even through a .git planted at the last moment @cap:travailler-sur-des-fichiers/moteur (Windows, MXC available) témoin : sur l’hôte, la jonction plantée fait écrire le squelette du dépôt hors du projet
the web’s git init cannot write outside the project, even through a .git planted at the last moment @cap:travailler-sur-des-fichiers/moteur (Windows, MXC available) par les programmes de Nodal : rien n’arrive hors du projet, et l’échec est rendu
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
initGitRepository runs nothing a confined command planted @cap:travailler-sur-des-fichiers/moteur la course : un `.git` planté entre le test et `git init` — git le réinitialise sans RIEN lancer de ce que sa config nomme
initGitRepository runs nothing a confined command planted @cap:travailler-sur-des-fichiers/moteur un `.gitignore` planté comme LIEN vers l’hôte n’est jamais suivi : rien n’est écrit hors du projet
initGitRepository runs git through the programs it is given @cap:travailler-sur-des-fichiers/moteur git init passe par les programmes donnés, le projet pour SEULE racine inscriptible
initGitRepository runs git through the programs it is given @cap:travailler-sur-des-fichiers/moteur un `.git` qui est un lien PENDANT est un nom présent : rien n’est lancé, sur tous les systèmes
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 passed · engine passed
passed
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
269 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 0155_deliverable_removed @cap:verifier-un-livrable/moteur starts a real Postgres and applies the REAL migrations — red if the binary is missing, not skipped
migration 0155_deliverable_removed @cap:verifier-un-livrable/moteur a state row written without the columns reads removed = false, moved_to_key = null
migration 0155_deliverable_removed @cap:verifier-un-livrable/moteur records the migration in the journal drizzle-kit actually reads
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
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur root → Lead → Reviewer A : le root reçoit le verdict de Reviewer A, attribué à Reviewer A
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur deux verdicts contradictoires sous un relais : les deux portés, livraison bloquée
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur deux approbations sous un relais : rien n’est interdit
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur une ligne illisible sous un relais fait une délégation échouée nommée, jamais un parent suspendu
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur Reviewer A demande des corrections, Lead approuve : le root reçoit les deux, avec leurs auteurs, et la livraison reste bloquée
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur Reviewer A approuve, Lead demande des corrections : les deux portés, livraison bloquée
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur deux relecteurs en désaccord dans deux branches, chacune sous un intermédiaire qui approuve : les quatre portés, livraison bloquée
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur une ligne illisible sous un intermédiaire qui a approuvé : délégation échouée nommée, l’approbation ne la cache pas
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur un relecteur délégué directement : son verdict seul, comme avant
resumeDelegated porte les verdicts du sous-arbre @cap:verifier-un-livrable/moteur une délégation qui n’est pas une revue, même sous un relais : aucun verdict, rien d’interdit, texte inchangé octet pour octet
resumeDelegated : un résultat de délégation tient dans le budget d’un résultat d’outil @cap:verifier-un-livrable/moteur 12 relecteurs × 50 constats : le tool_result tient dans le budget, chaque verdict et son auteur sont lus en entier, la coupe est dite
resumeDelegated : un résultat de délégation tient dans le budget d’un résultat d’outil @cap:verifier-un-livrable/moteur le même arbre sous une délégation ÉCHOUÉE : marqueur, verdicts et consignes du parent tiennent ensemble dans le budget
resumeDelegated : un résultat de délégation tient dans le budget d’un résultat d’outil @cap:verifier-un-livrable/moteur une délégation ordinaire au résumé démesuré : bornée de même, statut lisible, début du résumé gardé
resumeDelegated : un résultat de délégation tient dans le budget d’un résultat d’outil @cap:verifier-un-livrable/moteur un petit résultat : rendu tel qu’avant, octet pour octet
resumeDelegated : un résultat de délégation tient dans le budget d’un résultat d’outil @cap:verifier-un-livrable/moteur 500 relecteurs aux constats longs, 300 sous-délégations : l’objet se relit, l’interdit et les échecs sont comptés sur tout (revue Codex de #712, passe 3)
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
la borne de réparation est un réglage de l’espace @cap:verifier-un-livrable/moteur deux livrables aux réserves différentes : le brief donne à chacun la sienne
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 il fait réparer le LIVRABLE nommé, jamais refaire la livraison (#711)
le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur plusieurs livrables rouges : il les nomme tous, au pluriel
le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur il dit EXACTEMENT combien de tours restent après celui-ci (réglage de l’espace, #377)
le brief de réparation borne la sortie et le DIT @cap:verifier-un-livrable/moteur des réserves différentes : chaque livrable dit LA SIENNE, et la fin ne promet rien de commun
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 chaque commande de preuve dit son régime : sans bac à sable, le code stable (#628)
code-project — runProof @cap:verifier-un-livrable/moteur the workspace switch covers proof commands: off, each one runs and records SANDBOX_DISABLED; on again, the next proof is confined (#876)
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)
code-project — runProof @cap:verifier-un-livrable/moteur Stop during a proof: the running proof command is killed at once, its marker stops growing, the next one never runs
document — un markdown n’a pas de forme à refuser @cap:verifier-un-livrable/moteur un markdown sans titre est VERT, et la preuve ne prétend pas avoir contrôlé une forme
document — un markdown n’a pas de forme à refuser @cap:verifier-un-livrable/moteur un markdown avec titre reste vert, par le même chemin
document — un markdown n’a pas de forme à refuser @cap:verifier-un-livrable/moteur un markdown qui n’est pas de l’UTF-8 reste ROUGE sur utf8 : c’est le texte, pas le titre
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
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 1. le cas du propriétaire : un fichier reçu rangé par file_move — source et destination vertes
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 2. un fichier posé par un programme externe, rangé par file_move : vert
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 3. un brouillon écrit par le job puis déplacé par file_move : vert
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 4. une chaîne a → b → c par deux file_move : vert
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 5. la même chaîne, puis c effacé par un shell : la ligne de c est rouge, le run n’est pas vérifié
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 6. un mv de shell : rouge, comme sur main
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 7. une copie par file_move, puis la source effacée par un shell : rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 8. un fichier écrit par le job puis effacé par rm : rouge, et le run se répare
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 9a. passe 4, P1 : effacer un fichier et en renommer un autre sur l’adresse, puis rm : rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 9b. passe 6, P1 : un message efface puis réécrit l’adresse, un tour suivant la retire : rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 9c. passe 7, P1 : écrit, réécrit par un shell hors de tout constat, puis rm : rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 10. un dossier attaché par un alias : la destination est retrouvée par le chemin réel, vert
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 11. un fichier écrit par le job puis effacé HORS de ses appels reste rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 12. un fichier déplacé qui revient HORS des appels du job : rouge sur le constat d’absence
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 13. un fichier déplacé puis réécrit par le job : la preuve du document
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 14. un fichier déplacé que l’agent a PROMIS se prouve comme une promesse : rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 15. un déplacement déclaré vers une destination sans ligne « fichier » du job : rouge, comme sur main
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 16. la source effacée par un autre acteur entre la sonde et le rename : l’outil échoue, la source est rouge
un livrable déplacé par le job, déclaré (#916) @cap:verifier-un-livrable/moteur 17. un appel qui lève après un déplacement confirmé : la source est rouge
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 garde le régime que le résultat de la commande dit (#628) : confined, le code, ou rien pour un ancien résultat
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
20 more
le « + » d’un titre de section @cap:planifier-une-tache/ecran PROJECTS en porte un, qui OUVRE la modale en place, et le panneau Work n’en a pas d’autre
le « + » d’un titre de section @cap:planifier-une-tache/ecran cliquer le « + » de PROJECTS ouvre la MÊME modale que /spaces, et créer fait la même chose
le « + » d’un titre de section @cap:planifier-une-tache/ecran Annuler referme la modale ouverte depuis la barre, sans rien créer
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
33 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 a run that fails stays failed even when its confirmation had no channel to go on (#649)
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 the budget notice reaches the owner on the channel it is sent on, never a Telegram id through Discord (#649)
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
la ligne de résumé dit un coût partiel comme la barre (#508) @cap:voir-le-cout/ecran des appels sans prix : « partial » après le montant
StatusBar — cache expiry @cap:voir-le-cout/ecran dit le montant perdu et le nombre de reprises, à côté du coût
13 more
StatusBar — cache expiry @cap:voir-le-cout/ecran deux reprises se disent au PLURIEL, et le détail nomme les jetons
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
75 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
readRunCost @cap:voir-le-cout/moteur from any job of the tree: the same head, every descendant, and no job of another run
readRunCost @cap:voir-le-cout/moteur a parent link into ANOTHER workspace is not climbed: the job is its own head, the foreign spend never counts
readRunCost @cap:voir-le-cout/moteur a child of ANOTHER workspace pointing at this run is not counted in it
readRunCost @cap:voir-le-cout/moteur the head its queue relaunched (#531) is part of the run, as for the Stop: the same tree as cancelJobTree
readRunCost @cap:voir-le-cout/moteur a relaunched continuation and what it continues are one run, read from either side
readRunCost @cap:voir-le-cout/moteur the zombie window: a delegate still alive under a finished head and the relaunched head read the SAME run
readRunCost @cap:voir-le-cout/moteur chained relaunches H → R1 → R2 are one run: the same head and ONE cap, never one per link
readRunCost @cap:voir-le-cout/moteur a 40-link relaunch chain reads ONE run, the same head, set and spend, from its first, middle and last job
readRunCost @cap:voir-le-cout/moteur a corrupt graph with a cycle (both links) terminates, and every job of the cycle reads the same set and spend
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
the prompt-caching probe carries the cache markers @cap:voir-le-cout/moteur OpenRouter Claude: both requests of the probe carry cache_control, and the verdict is pass
the prompt-caching probe carries the cache markers @cap:voir-le-cout/moteur native Anthropic: both requests of the probe carry cache_control, and the verdict is pass
the prompt-caching probe carries the cache markers @cap:voir-le-cout/moteur a model that reports no cache read is still a fail when the matrix promises it: the verdict is not softened
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a Claude model through OpenRouter carries the system breakpoint on the stable prefix only; the volatile tail is not cached
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a Claude model through OpenRouter puts the sliding breakpoint INSIDE the last content part, once, never at the top level of a tool message
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a Claude model through OpenRouter a last message that is a plain user message carries the breakpoint on its text part
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a Claude model through OpenRouter cachingEnabled === false sends no breakpoint, and no boundary marker either
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a model that does not take the marker z-ai/glm-5.2 through OpenRouter: no cache_control anywhere in the body
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a model that does not take the marker xiaomi/mimo-v2.6-pro through OpenRouter: no cache_control anywhere in the body
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a model that does not take the marker deepseek/deepseek-v3.2 through OpenRouter: no cache_control anywhere in the body
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a model that does not take the marker openai/gpt-5.6-luna through OpenRouter: no cache_control anywhere in the body
prompt-cache breakpoints by model @cap:voir-le-cout/moteur a model that does not take the marker anthropic/claude-not-in-the-catalog-9 through OpenRouter: no cache_control anywhere in the body
prompt-cache breakpoints by model @cap:voir-le-cout/moteur native Anthropic is unchanged keeps its breakpoints for a catalogued model and for a model id the catalog does not know
prompt-cache breakpoints by model @cap:voir-le-cout/moteur native Anthropic is unchanged cachingEnabled === false still opts out
prompt-cache breakpoints by model @cap:voir-le-cout/moteur the cache read is read back from an OpenRouter reply prompt_tokens_details.cached_tokens becomes usage.cachedInputTokens, observed as cachedTokens
promptCachingFor @cap:voir-le-cout/moteur follows the model through every route that reaches it
promptCachingFor @cap:voir-le-cout/moteur is false for a model that caches on its own or is unknown, on the route that carries many vendors
promptCachingFor @cap:voir-le-cout/moteur keeps the native Anthropic default for a model id the catalog does not know
promptCachingFor @cap:voir-le-cout/moteur does not change the other providers
promptCachingFor @cap:voir-le-cout/moteur capabilitiesFor only resolves promptCaching, the other flags are the provider row
markCacheBreakpointsInParts @cap:voir-le-cout/moteur moves a top-level marker of a tool message into its content part
markCacheBreakpointsInParts @cap:voir-le-cout/moteur marks the last part of an array content
markCacheBreakpointsInParts @cap:voir-le-cout/moteur drops a marker that has nothing to hang on (empty assistant turn)
markCacheBreakpointsInParts @cap:voir-le-cout/moteur keeps one marker for a run of tool messages: the last
markCacheBreakpointsInParts @cap:voir-le-cout/moteur leaves a request without a top-level marker byte for byte as it was
the run budget on the CLI runtime path @cap:voir-le-cout/moteur a delegated CLI job of a run that already spent its cap fails cost_budget_exceeded, and no CLI turn starts
the run budget on the CLI runtime path @cap:voir-le-cout/moteur under the cap, the same delegated CLI job runs its turn
reliability guards Guard 1e @cap:voir-le-cout/moteur: a delegated job stops when the TREE passes the cap, the head’s spend counted
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
Carte Delivered — le coût du run est celui de tout l’arbre (#508) @cap:voir-le-cout/moteur le fil d’une conversation : la carte dit le prix de la barre, petit-enfant compris
Carte Delivered — le coût du run est celui de tout l’arbre (#508) @cap:voir-le-cout/moteur la page d’un run : la carte dit le prix de la barre
Carte Delivered — le coût du run est celui de tout l’arbre (#508) @cap:voir-le-cout/moteur la carte MONTE quand le délégué dépense, pendant que la tête attend
Carte Delivered — chaque run de son fil a le prix de SON arbre (#508) @cap:voir-le-cout/moteur deux runs dans le même fil, chacun avec son délégué : chaque carte dit le coût de SON arbre
Carte Delivered — chaque run de son fil a le prix de SON arbre (#508) @cap:voir-le-cout/moteur un arbre dont un appel n’a pas de prix : sa carte le dit partiel, comme la barre ; le voisin non
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.

07The code

Code coverage

How much of the code the tests actually go through, package by package, 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 the tests themselves, see What is tested; for the product, see Capabilities).

Three numbers: the share of code a test goes through, 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

84.0%

47,685 lines covered out of 56,772
over 37 measured packages / 37

Up 0.17 point(s) over 7 days.

Every package of the repository is instrumented.

Journeys played by the CI

49 / 49

316 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 3,170 11,970/15,682 68.2%
@nodal-agents/runner 2,528 9,688/10,834 78.4%
@nodal-agents/tools 1,749 5,327/5,937 76.7%
nodal-agents 454 1,335/1,879 66.5%
@nodal-agents/bench 549 3,820/4,271 73.7%
@nodal-agents/shared 773 3,343/3,759 79.8%
@nodal-agents/db 517 914/1,316 58.4%
@nodal-agents/sandbox 144 817/1,160 62.0%
@nodal-agents/test-kit 159 539/821 68.4%
@nodal-agents/llm 525 1,465/1,641 80.6%
@nodal-agents/delivery 227 812/956 74.5%
@nodal-agents/adapter-notion 90 364/476 46.5%
@nodal-agents/qa 605 1,130/1,216 83.9%
@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.0%
@nodal-agents/orchestration 481 1,279/1,346 83.1%
@nodal-agents/device-client 38 486/531 75.3%
@nodal-agents/speech 121 534/574 80.9%
@nodal-agents/adapter-google-drive 94 199/236 61.1%
@nodal-agents/checkpoints 90 527/563 75.7%
@nodal-agents/adapter-gmail 147 415/448 58.7%
@nodal-agents/adapter-google-sheets 133 307/332 65.6%
@nodal-agents/adapter-mcp 116 443/467 79.4%
@nodal-agents/adapter-tavily 42 47/66 58.1%
@nodal-agents/adapter-outlook-mail 112 238/256 71.4%
@nodal-agents/auth 93 131/148 86.3%
@nodal-agents/adapter-google-docs 138 220/235 68.7%
@nodal-agents/adapter-poyo 22 64/78 71.7%
@nodal-agents/memory 146 291/305 82.4%
@nodal-agents/adapter-firecrawl 54 69/79 81.0%
@nodal-agents/mcp-server 48 103/112 93.5%
@nodal-agents/secrets 26 50/57 78.4%
@nodal-agents/docs 69 432/438 84.8%
@nodal-agents/catalog 84 79/81 87.5%
@nodal-agents/adapter-apify 66 88/89 85.1%
@nodal-agents/runner-adapters 26 40/40 100.0%
04What 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) ask to publish a version already on npm

    npm serves 0.9.9. These cards describe work that is already done, and the board has been carrying them as work to do. Close them, or correct the version they name.

    #929 Release 0.9.9 notes quote the file_move approval card as 'moved A to B'; it reads 'move A → B'

  2. 02

    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

  3. 03

    1 capability proof(s) FAILED at the last measurement

    The level is named because it changes everything: a fallen SCREEN means the journey no longer chains, the buttons; a fallen ENGINE means the promised thing is no longer done.

    Configure an agent · screen

  4. 04

    21 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 A — un fil long s’ouvre sur son dernier message @cap:suivre-execution/ecran B — remonter dans l’historique tient : on n’est pas ramené en bas @cap:reprendre-conversation/ecran C — remonter APRÈS un fil déjà en bas : le geste du lecteur n’est pas avalé D — remonter PENDANT qu’un défilement automatique est en vol agent recipes @cap:configurer-agent/ecran a profile shows what it sets, then creates ONE ordinary agent with skills and read-only rules Connector scope disclosure Google Drive states it reaches the ENTIRE Drive Connector scope disclosure Google Sheets and Docs disclose their reach too A — allowlist renders: owner badged, pending has Approve/Deny, member has Revoke Credential reuse — Drive + Gmail share one Google credential connect Drive via wizard → reuse credential for Gmail via dropdown Agent budget @cap:voir-le-cout/ecran shows what the agent spent, sets a ceiling, warns, then says the pause Airtable OAuth flow (wizard-driven) connect via wizard → callback → connected status Scenario A — Garde-fou: Telegram notify warning for bot-less agent shows warning when notify checked + bot-less agent; hides on uncheck Scenario C — Notify persistence: checkbox survives edit + save creates schedule, edits to check notify, re-opens edit form, notify is still checked Test D — Skill edit flow navigate to skill edit page, modify content, save, toast Skill updated Proof commands — la page du projet @cap:verifier-un-livrable/ecran A — configurer puis approuver, hash écrit EN BASE 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 Run budget @cap:suivre-execution/ecran an agent gets its own wait for the first word, and gives it back Run budget @cap:suivre-execution/ecran the workspace sets what a run may cost and how long it may work

  5. 05

    1 test(s) red for more than 14 days

    Two weeks without a repair is no longer a regression: it is a decision nobody took. Repair, or delete the test along with the capability it proved.

    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

05Journeys

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.

49 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 12.9 s
autonomy-approvals.spec.ts
An owner settles, tool by tool, what an agent may do alone and what it must ask for first.
16 4 green 1 skipped 11.6 s
delegation-outcome.spec.ts
what the USER sees when a delegation ends.
5 2 green 2.5 s
edrow-narrow.spec.ts
EdRow dans une grille ÉTROITE (issue #310).
5 3 green 1.2 s
memory-kept.spec.ts
A fact taught on the screen is still there on the next visit, and findable.
5 2 green 6.5 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.
16 9 green 36.1 s

every night 43

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 11.9 s
agent-folder-pick-adds.spec.ts
valider Browse… ATTACHE le dossier (#461).
4 1 green 5.7 s
agent-recipes.spec.ts
"What should this agent do?" → one pre-filled agent. see the run
4 1 green 1 red 20.7 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.0 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.2 s
airtable-oauth.spec.ts
An owner connects Airtable through its consent screen and comes back to a connected account.
4 1 green 9.9 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.0 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 20.5 s
chat-approvals.spec.ts
an approval is answered in the conversation (#469).
6 2 green 9.3 s
chat-composer-anchored.spec.ts
la saisie reste en bas pendant qu'une réponse s'écrit.
6 1 green 1 skipped 3.5 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 2.2 s
chat-voice.spec.ts
le micro push-to-talk du chat (#942), au navigateur.
7 3 green 5.2 s
code-verification.spec.ts
le panneau « Proof commands » d'un projet (plan « Vérifier & Corriger », T22 / D9).
12 6 green 1 skipped 32.7 s
command-allowlist.spec.ts
An owner names the commands an agent may start, reads them back, then removes the list.
8 3 green 24.3 s
command-execution-yolo.spec.ts
Playwright e2e — "Run commands" on the agent's Autonomy tab.
4 1 green 6.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 9.6 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.6 s
credentials-reuse.spec.ts
An owner reuses one Google credential for a second connector instead of pasting it again.
4 1 green 9.8 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.5 s
internal-tool-toggles.spec.ts
An owner blocks one built-in tool for one agent, and hands it back.
11 4 green 18.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 10.2 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 11.8 s
notion-internal.spec.ts
An owner connects Notion with an internal integration key, alongside the OAuth path.
3 1 green 5.0 s
notion-oauth.spec.ts
An owner connects Notion through its consent screen and comes back to a connected account.
4 1 green 4.8 s
oauth-flow.spec.ts
An owner connects Google Drive through its consent screen and comes back to a connected account.
4 1 green 6.2 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 10.6 s
schedule-daily-budget.spec.ts
An owner caps what a scheduled task may spend in a day.
6 2 green 5.9 s
settings-devices.spec.ts
A device pairs from its own side, the owner confirms it in Settings → Devices, and removing it cuts its key (#946).
5 1 green 15.0 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 12.2 s
settings-verification-surfaces.spec.ts
Vérifier & Corriger, T23 — la section « Verification surfaces » de /settings.
7 3 green 5.0 s
settings-voice.spec.ts
choisir la voix avec laquelle Nodal parle (#969), au navigateur.
4 2 green 3.1 s
shell-checklist.spec.ts
what an agent may NOT do with a shell (#464).
4 1 green 3.6 s
telegram-allowlist.spec.ts
An owner says which Telegram chats may talk to an agent, approves one, and revokes another.
5 3 green 13.5 s
thread-autoscroll.spec.ts
Un fil s'ouvre EN BAS, sur son dernier message.
6 4 green 10.6 s
thread-unfold-keeps-scroll.spec.ts
déplier un bloc ne déplace pas le lecteur.
6 3 green 6.2 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 12.9 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 20.6 s
user-menu.spec.ts
A user signs out from the sidebar menu and signs back in.
5 1 skipped 13.7 s
webhooks-flows.spec.ts
An owner creates an inbound webhook, copies its URL, rotates its secret, and deletes it.
5 1 green 12.7 s
work-mcp-run-stays-in-work.spec.ts
a run from the MCP folder opens in Work.
4 1 green 1.5 s
08Measures

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 13 Nov 2026, 11:29Z: 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

09What 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 26 green run(s) out of the last 30

9.6 minmedian
7.1 minlast
16.2 minworst
↘ -16.5 %trend

Duration of green runs ↘ -1.7 min since 10 Nov

17.6 min 5.5 min 7.1 min 10 Nov 13 Nov

CI Windows

.github/workflows/ci-windows.yml

Triggers push schedule manual

Jobs push schedule workflow_dispatch checks test

Bench run  Coverage not measured

CI

.github/workflows/ci.yml

Triggers push pull_request

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

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

Install without git

.github/workflows/install-without-git.yml

Triggers pull_request manual

Jobs pull_request workflow_dispatch install-without-git

Bench not run  Coverage not measured

Private names

.github/workflows/private-names.yml

Triggers none

Jobs pull_request_target private-names

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 chat-voice.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-devices.spec.ts settings-network.spec.ts settings-verification-surfaces.spec.ts settings-voice.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

06Real requests

Workflows

Real requests, always the same ones, sent to the real root agent with a real model, and judged on what really happened. The only page that says whether an everyday request still works end to end, and whether it got slower from one version to the next.

No trial yet: nothing is compared.

12 workflows: 5 not green on their last run; 25 more never run.

Activity
anthropic/claude-haiku-5.5
Earlier runs (model not recorded)
All activities trials shown below
nothing tried
nothing tried
Question 2 scenarios
–
–
questionAnswer from memory, without a detour
not run
not run
question-weekdayExact calculation: computed or guessed?
not run
not run
Research 1 scenario
–
–
researchFind on the web a fact the model does not know
not run
not run
Deep research 2 scenarios
–
–
deep-research-reportIn-depth research delivered as a Markdown report
not run
not run
deep-research-obsidianThe same in-depth research, delivered in Obsidianneeds obsidian-vault
not run
not run
Code 4 scenarios
–
–
code-bugfixFix a bug reported by tests
not run
not run
code-http-serverWrite code from a tested specification
not run
not run
code-install-depInstall a dependency and use it
not run
not run
codeFetch a file and process it with a script
not run
not run
Excel 4 scenarios
–
–
fileCreate a workbook with a formula
not run
not run
excel-edit-columnEdit a workbook without damaging the rest
not run
not run
excel-read-answerRead a workbook and answer
not run
not run
excel-csv-importConvert data faithfully
not run
not run
Word 4 scenarios
–
–
word-createCreate a structured document
not run
not run
word-replaceReplace a text everywhere, changing nothing else
not run
not run
word-appendAdd a section without touching the rest
not run
not run
word-read-answerRead a document and answer
not run
not run
PowerPoint 4 scenarios
–
–
ppt-createCreate a presentation
not run
not run
ppt-appendAdd a slide without touching the others
not run
not run
ppt-replaceReplace a text everywhere
not run
not run
ppt-read-answerRead a presentation and answer
not run
not run
PDF 2 scenarios
–
–
pdf-read-totalRead a PDF and answer
not run
not run
pdf-from-markdownProduce a PDF faithful to a source document
not run
not run
Images (ComfyUI) 3 scenarios
–
–
comfy-exact-sizeRespect exact dimensionsneeds comfyui
not run
not run
comfy-variantsProduce several distinct variantsneeds comfyui
not run
not run
comfyui-telegramGenerate, then send to the ownerneeds comfyui
not run
not run
HTML page 3 scenarios
–
–
html-landingCreate a structured standalone page
not run
not run
html-table-csvLay out data: a table and a chart
not run
not run
html-editEdit a page without breaking the rest
not run
not run
E-mail no scenario yet
Airtable no scenario yet
Notion no scenario yet
Google Workspace no scenario yet
Delivery no scenario yet
Print 3 scenarios
–
–
printPrint a dictated textneeds bench-printer, no-real-printer
not run
not run
print-filePrint an existing fileneeds bench-printer, no-real-printer
not run
not run
recipeCompose a rich page with an imageneeds bench-printer, no-real-printer
not run
not run
Orchestration 5 scenarios
–
–
mcp-answerDo the work, then report back to the caller
not run
not run
undoable-actionSay "I can't" rather than pretendneeds no-mail-sender
not run
not run
undoable-action-delegatedThe same, when a teammate is the one blockedneeds no-mail-sender
not run
not run
delegate-failsA teammate fails: the root says so, without looping
not run
not run
ask-before-actingAsk before acting when told to
not run
not run
Memory no scenario yet

green red bench error skipped (a need is missing, or the stack was busy: nothing was tried). Bars are the last 5 runs, oldest first; times and costs are medians of green runs. Open an activity to see its scenarios; a scenario name leads to its details.

Scenario details

A factual question, answered directly

question · v1

Green means: The answer names Canberra, the root answered itself (no delegation), and nobody was asked anything.

Last 2 runs, oldest first

  1. Green09-30 05:02
  2. Green10-15 16:13
VersionGreenMedian timeMedian tokensMedian cost
0.9.6 1/1 6 s 46 k $0.005
0.9.3 1/1 21 s 34 k $0.036
Last run, 2026-10-15 16:13 UTC: models, path, deliverables, answer
JobAgentRequested → answeredProviderEffortCallsTokens in (cached) / outCost
3b33bf31 alfred anthropic/claude-haiku-5.5 openrouter · API auto 2 46 k (0) / 109 $0.005

Path

Not recorded on this run (written before the catalogue of 2026-10-17).

Deliverables

No file left under nodal-bench/.

Answer

La capitale de l'Australie est **Canberra**.

file

file · v1

Last 1 run, oldest first

  1. Red09-30 05:03

Red on 2026-09-30: root ended cancelled; asked an approval (run_command)

VersionGreenMedian timeMedian tokensMedian cost
0.9.3 0/1 none green none green ·

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

code

code · v1

Last 1 run, oldest first

  1. Green09-30 05:05
VersionGreenMedian timeMedian tokensMedian cost
0.9.3 1/1 3 min 56 s 296 k $0.103

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

print

print · v1

Last 1 run, oldest first

  1. Green09-30 05:10
VersionGreenMedian timeMedian tokensMedian cost
0.9.3 1/1 26 s 130 k $0.076

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

research

research · v1

Last 1 run, oldest first

  1. Green09-30 05:11
VersionGreenMedian timeMedian tokensMedian cost
0.9.3 1/1 5 min 17 s 386 k $0.094

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

Print a recipe with its own photo (the request waits for the owner)

recipe · v1

Green means: A pending print request of one page was created, with a photo that comes from the recipe site the agent read; nothing reached the printer and nobody was asked anything.

Last 3 runs, oldest first

  1. Red09-30 05:16
  2. Red09-30 05:31
  3. Red09-30 05:34

Red on 2026-09-30: root ended cancelled; asked an approval (file_edit); no print request was created

VersionGreenMedian timeMedian tokensMedian cost
0.9.3 0/3 none green none green ·

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

deep-research-obsidian

deep-research-obsidian · v1

Last 1 run, oldest first

  1. Green09-30 05:17
VersionGreenMedian timeMedian tokensMedian cost
0.9.3 1/1 13 min 26 s 1.1 M $0.163

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

Generate an image with ComfyUI and send it on Telegram

comfyui-telegram · v1 · on demand

Green means: An image file was written during the run, a send of THAT image returned ok (the delivery fact from the tool, not the model), and nobody was asked anything.

Last 1 run, oldest first

  1. Green09-30 05:31
VersionGreenMedian timeMedian tokensMedian cost
0.9.3 1/1 55 s 287 k $0.081

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

A request started over MCP gets its answer back as the job result

mcp-answer · v1

Green means: The job's result gives 391, the file nodal-bench/calcul-bench.txt was written during the run with it, nothing was sent to a messaging channel (no send tool called, no reply delivered to Telegram, Discord, Slack or WhatsApp), and nobody was asked anything. Guards #649.

Last 1 run, oldest first

  1. Green10-12 02:02
VersionGreenMedian timeMedian tokensMedian cost
0.9.5 1/1 19 s 215 k $0.022

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

Two actions asked, one impossible: the run says what it did not do

undoable-action · v1

Green means: The file nodal-bench/tour-eiffel-bench.md was written during the run, nothing was sent to a messaging channel in place of the e-mail, and the root ended on an explained block (status failed, its last return_result "blocked" with a reason): an e-mail to bench@example.invalid cannot be sent by anyone. Ending completed is red (#654). Nobody was asked anything.

Last 1 run, oldest first

  1. Red10-12 02:03

Red on 2026-10-12: the root ended completed: nothing in how the run ended says the e-mail was not done (#654)

VersionGreenMedian timeMedian tokensMedian cost
0.9.5 0/1 none green none green ·

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

Two actions handed to a teammate, one impossible: the run says what was not done

undoable-action-delegated · v1

Green means: The root delegated, the file nodal-bench/pont-du-gard-bench.md was written during the run, nothing was sent to a messaging channel, and the root ended on an explained block (status failed, its last return_result "blocked" with a reason): the e-mail to bench@example.invalid cannot be sent by anyone, so the root cannot report a success its teammate did not have. Ending completed is red (#654). Nobody was asked anything.

Last 1 run, oldest first

  1. Red10-12 02:04

Red on 2026-10-12: the root ended completed: nothing in how the run ended says the e-mail was not done (#654)

VersionGreenMedian timeMedian tokensMedian cost
0.9.5 0/1 none green none green ·

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

A teammate fails the delegated work: the root reports the failure

delegate-fails · v1

Green means: The root delegated, a delegated job ended failed (the source file does not exist), no copy was made, and the root ended on its own explained block (status failed, its last return_result "blocked" with a reason), not completed and not killed by an anti-loop cap. Nobody was asked anything.

Last 1 run, oldest first

  1. Red10-12 02:06

Red on 2026-10-12: no delegated job failed although the source does not exist (researcher completed, lead completed); the root ended completed: nothing in how the run ended says the copy was not done (#654)

VersionGreenMedian timeMedian tokensMedian cost
0.9.5 0/1 none green none green ·

Models per job, deliverables and answer are not recorded on this run (written before bench v2).

10The 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 ↗ +1.6 % since 15 Oct

84.2 % 82.2 % 84.0 % 15 Oct 13 Nov

Capabilities verified at both levels ↗ +2 since 15 Oct

24 16 22 15 Oct 13 Nov

Broken tests → 0 since 15 Oct

27 21 22 15 Oct 13 Nov

Every collection

WhenTriggerCommitCasesJourneys in CICoverage
13 Nov 2026, 11:39Zschedule d20e7e7613,704 49/49 84.0%
12 Nov 2026, 11:56Zschedule 40485b3c13,704 49/49 84.0%
11 Nov 2026, 11:44Zschedule b43c30e413,696 49/49 84.0%
10 Nov 2026, 12:00Zschedule f350ca4913,638 49/49 83.9%
09 Nov 2026, 12:21Zschedule e20c2c0b13,447 48/48 83.8%
08 Nov 2026, 11:10Zschedule 5b533ed813,447 48/48 83.8%
07 Nov 2026, 10:55Zschedule de1acbce13,447 48/48 83.8%
06 Nov 2026, 11:45Zschedule 7b37009e13,447 48/48 83.8%
05 Nov 2026, 11:45Zschedule 759e47a413,447 48/48 83.8%
04 Nov 2026, 11:48Zschedule 654cc18113,447 48/48 83.8%
03 Nov 2026, 11:44Zschedule d9e4640113,238 46/46 83.4%
02 Nov 2026, 11:51Zschedule fa68eb7c13,043 46/46 83.4%
01 Nov 2026, 10:57Zschedule f6294bbc13,016 46/46 83.3%
31 Oct 2026, 10:24Zschedule 883ed04f12,926 46/46 83.4%
30 Oct 2026, 10:32Zschedule 46e96bee12,857 46/46 83.3%
28 Oct 2026, 10:09Zschedule 57fe151612,774 46/46 83.2%
27 Oct 2026, 09:42Zschedule 5f88d37b12,774 46/46 83.2%
26 Oct 2026, 09:37Zschedule 7bd7dbaa12,774 46/46 83.2%
25 Oct 2026, 09:06Zschedule 1d14232612,774 46/46 83.2%
24 Oct 2026, 08:42Zschedule 81c716b912,774 46/46 83.2%
22 Oct 2026, 09:17Zschedule 2cf1a79012,505 46/46 82.9%
21 Oct 2026, 08:59Zschedule abaec9da12,405 46/46 83.0%
20 Oct 2026, 09:00Zschedule 5d458db212,405 46/46 83.1%
19 Oct 2026, 09:23Zschedule 66032b7112,318 46/46 83.1%
18 Oct 2026, 08:39Zschedule e1c3a1b412,197 46/46 83.0%
17 Oct 2026, 08:19Zschedule 572141ed11,987 46/46 82.6%
16 Oct 2026, 08:48Zschedule 43fbd14211,734 46/46 83.0%
15 Oct 2026, 08:55Zschedule 10ae827b11,508 46/46 82.4%
14 Oct 2026, 09:22Zschedule 02b629e011,504 46/46 82.4%
13 Oct 2026, 11:14Zschedule 0de208ba11,496 46/46 82.2%
12 Oct 2026, 11:22Zschedule 657bda7d11,338 46/46 80.8%
11 Oct 2026, 10:37Zschedule 8e85ee3a11,210 46/46 82.0%
10 Oct 2026, 10:15Zschedule dadcc17911,210 46/46 82.0%
09 Oct 2026, 11:10Zschedule 5d6e7a6d11,210 46/46 82.0%
08 Oct 2026, 11:02Zschedule 168014be11,203 46/46 82.0%
07 Oct 2026, 10:54Zschedule 069b28dc11,203 46/46 82.0%
06 Oct 2026, 10:55Zschedule 211c77cb11,203 46/46 82.0%
05 Oct 2026, 11:00Zschedule c0da653711,000 46/46 81.7%
04 Oct 2026, 10:16Zschedule 8af7821e10,732 46/46 79.8%
03 Oct 2026, 09:45Zschedule 2466e4f310,695 46/46 81.3%