From 44c88b4bf741e3c9f708f66d3e093b444bc3a317 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Sat, 31 Oct 2026 17:19:05 +0100 Subject: [PATCH] docs(skills): never cut a running job or agent short, not as chair and not at its time cap Co-Authored-By: Claude Opus 5.5 (1M context) --- skills/cleanup/SKILL.md | 14 ++++++++++---- skills/democracy/SKILL.md | 15 +++++++++++---- skills/funnel/SKILL.md | 10 ++++++---- skills/triage/SKILL.md | 3 ++- skills/tune/SKILL.md | 6 +++--- 5 files changed, 32 insertions(+), 16 deletions(-) diff --git a/skills/cleanup/SKILL.md b/skills/cleanup/SKILL.md index 14d17b7..5207158 100644 --- a/skills/cleanup/SKILL.md +++ b/skills/cleanup/SKILL.md @@ -80,10 +80,12 @@ worktree or compose project name, a container label, an open handle, or `unknown`. Then apply, first match wins: 1. Claimed by a peer: `keep`. -2. Attributable to a peer that has not answered: `keep (no answer from +2. A job running on it (deploy, gate, test, swarm run, build): `keep + (running)`. +3. Attributable to a peer that has not answered: `keep (no answer from )`. Silence is not consent. -3. Archive duty: `archive first`. -4. Everything else is a candidate with a risk class: +4. Archive duty: `archive first`. +5. Everything else is a candidate with a risk class: | Risk | Meaning | Typical items | | ---- | ------- | ------------- | @@ -145,7 +147,11 @@ ticked items. Revise repeats call 1; nothing is deleted before `Execute`. rest, then put the refused item to the operator again as its own option: an explicit renewed selection may pass; if it is refused again, hand over the exact command with its list file for the operator to run. -- Running stacks go down through the project's teardown target, never by +- Never stop, take down or kill a running job, and never ask its owner to, to + free space: not for a priority slot, not at a disk stop. Free idle items, + ask the operator for an exception, or wait; an owner's own disk guard only + alerts the chair, and only the operator can order a running job down. +- Idle running stacks go down through the project's teardown target, never by removing their containers or volumes underneath them. - Archive-first items: copy out, verify the copy, then delete. - A delete failing on permissions (files owned by a container UID): use the diff --git a/skills/democracy/SKILL.md b/skills/democracy/SKILL.md index c2aa7ca..b1db8be 100644 --- a/skills/democracy/SKILL.md +++ b/skills/democracy/SKILL.md @@ -77,8 +77,14 @@ records the result. for the grant, and reports the release. The chair keeps one queue, answers every request with its position, enforces the limits the operator set, checks every grant with `watch.py admit --need-gb ` (or `--kind `; - test kinds also need CPU and RAM below the configured limits), - and never cancels a running grant to free capacity. + test kinds also need CPU and RAM below the configured limits). +- A running job (deploy, gate, test, swarm run, build) is never cut short to + free capacity. The chair neither asks nor orders its owner to stop, take + down or kill it, not for an operator-prioritised slot and not for a + projected disk stop. It grants nothing new, frees idle items through the + `cleanup` flow, asks the operator for an exception, or waits. An owner's + own disk guard only alerts the chair and takes nothing down; only the + operator can order a running job down. - Handover is explicit: the outgoing chair sends every peer the new holder, the queue and the running grants, and keeps allocating until the incoming chair confirms. Two allocators never run at once. @@ -97,8 +103,9 @@ stays silent below the thresholds. - **Stop**: new heavy jobs are blocked in every session (teardown commands never), and the hook runs the configured low-risk cleanup by itself; it skips every worktree where a gate or deploy process still runs. -- **Critical**: additionally a desktop alarm to the operator. A running stack - is torn down only with the operator's OK. +- **Critical**: additionally a desktop alarm to the operator. Running jobs + and their stacks still keep running; only the operator can make an + exception. - A measured fall that would reach the critical threshold within the projection window raises the stage by one at once. - Caches together stay under their budget; the least recently used go first. diff --git a/skills/funnel/SKILL.md b/skills/funnel/SKILL.md index 81fab79..f38891a 100644 --- a/skills/funnel/SKILL.md +++ b/skills/funnel/SKILL.md @@ -21,8 +21,9 @@ in a sidetree until it does, or leaves as a proposal. ## The stages 1. **Brief.** One concern per agent. Name the goal, the exact base commit, the - scope that may change, the evidence expected back, a hard time cap (default - 60 minutes) and what the agent must not do: no pushes, no gates or deploys + scope that may change, the evidence expected back, a time cap (default + 60 minutes) at which it reports its interim state, and what the agent must + not do: no pushes, no gates or deploys unless the resource chair of the `democracy` skill granted them, read-only probes on shared live systems. 2. **Sidetree.** The agent works in its own worktree on its own branch, @@ -93,8 +94,9 @@ below the bar never enters the main line on its own. ## Rules -- Stop an agent at its time cap and ask for its findings; an uncapped brief can - run for hours and deliver nothing. +- At its time cap, ask an agent for its interim findings and let it run on; + never stop a running agent. A brief without a cap can run for hours without + a word. - Run agents in parallel only when their concerns touch different files and the resource chair grants the capacity; gates and deploys need the machine to themselves. diff --git a/skills/triage/SKILL.md b/skills/triage/SKILL.md index 78e6e3f..5f803d2 100644 --- a/skills/triage/SKILL.md +++ b/skills/triage/SKILL.md @@ -55,7 +55,8 @@ jobs' logs, and a first clustering. The judgement in those steps stays yours. 5. **One funnel per cluster.** Hand every cluster you claimed in step 3 to the `funnel` skill: one agent per cluster, working in its own worktree on its own branch created from the exact current HEAD, with that cluster as its only - concern, the artifact paths of step 4 in its brief and a hard time cap. + concern, the artifact paths of step 4 in its brief and a time cap for its + interim report. Steps 6 to 8 run inside that sidetree, so no cluster's edits land under another cluster's work or under a running gate or deploy. Run clusters in parallel only when their fixes touch different files and the machine has diff --git a/skills/tune/SKILL.md b/skills/tune/SKILL.md index 48e3a2f..d8e49ab 100644 --- a/skills/tune/SKILL.md +++ b/skills/tune/SKILL.md @@ -158,11 +158,11 @@ Python hot path with Rust: ## Delegating an optimization Hand every optimization to an agent through the `funnel` skill: one sidetree -per candidate, branched from an exact commit, with a hard time cap and "measure +per candidate, branched from an exact commit, with a time cap and "measure first, report the time split before implementing". The agent probes live systems read-only and never starts gates or deploys. A broad brief without a -cap can run for hours and deliver nothing; stop an agent at its cap and collect -its findings. +cap can run for hours without a word; at its cap, collect the agent's interim +findings and let it run on. Before merging, run independent skeptics through the `dialectic` skill. The antithesis must try to show that the candidate removes coverage, hides a