Commit Graph
173 Commits
Author SHA1 Message Date
Kevin Veen-BirkenbachandClaude Opus 5.5 eb4a335984 Merge feature/workbench-w1-operator-tasks into unify/skills-20261112
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:23:36 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 9a18853f65 Merge fix/orchestrator-e2e-unify-regressions into unify/skills-20261112
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:23:31 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 51fa40a30c Merge fix/orchestrator-refresh-held-by-selection into unify/skills-20261112
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:23:30 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 09762154c3 Merge fix/orchestrator-hub-cpu-cap into unify/skills-20261112
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:23:29 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 f7c585d56e Merge feature/workbench-w5-gates-receipts into unify/skills-20261112
Conflict in queue.py cmd_hold: kept the light-footprint aliases and per-kind stats, added W5's gated() call; W5's qualified() signature is gone and was unused below.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:23:19 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 59d9e29bcb fix(kvb-org-queue): book light jobs by their own footprint
Light single-file runs booked about 17 % RAM and 5 GB learned from heavy runs under a polluted signature. Each entry now stores its aliases, freezes its footprint at grant and learns per signature and kind; heavy kinds book at least the old pooled share, and a job keeps its own learned disk need when the old pool is empty. Hooks take the payload cwd and fall back to the old rule when it is unknown or malformed. Six skill docs now agree on what self-admits. test_queue 70, test_watch 46 and test_operator 30 green with negative controls; two independent reviews.

🎯 Fix: 90 %
💥 Break: 5 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 86
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:17:38 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 8a44d504b5 feat(kvb-check-gate): W5 gate receipts, hooks and queue after-wait
gates.py installs hooks that check the merge level before a push without writing git config, writes receipts from green queue gates, and the queue gains the after-wait and rank. Requirement 003 strikes the hook-enforcement criterion: agents keep --no-verify, hooks bind humans and CI. Committed below the bar on the operator's word 2026-11-12 (one gate after the merge): test_gates 15, test_queue 63 and test_watch 46 green, security 100 %, break risk 6 % for the live queue and hook change.

🎯 Fix: 90 %
💥 Break: 6 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 85
🚦 Gate: ⛔ break 6 % > 5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:16:22 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 d09ed61161 feat(orchestrator): W1 operator tasks, diff previews and bound commit asks
Operator tasks move from the Inbox into Tasks with the Waits on Operator filter. Review and commit asks carry the staged diff; a file whose old or new blob holds an armour line or a detection-pattern match, or every file when no pattern loads, ships only its path, status, mode and counts. The approval binds to the staged tree id from git write-tree, the encoded request body respects the hub limit, and the hub image ships every client module signed.py loads. Committed below the bar on the operator's word 2026-11-12 (no further per-bundle tests, one gate after the merge): the full hub suite and the W1 e2e never ran, two high MEDUSA rows (sandbox_paths.py FLOOR, permission_hook.py ask POST) wait for their acceptance.

🎯 Fix: 85 %
💥 Break: 12 %
💸 Cost: 30 %
⏱️ Time: 30 %
🛡️ Security: 50 %
🏆 Score: 100
🚦 Gate: ⛔ fix 85 % < 90, break 12 % > 5; security 50 % < 100: ask the operator before the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 16:13:58 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 6059930b0a fix(orchestrator): cap the hub at four CPUs
Piper TTS in the hub took every core of a host already at 94 to 100 % CPU. compose.yml now limits the hub to cpus: 4 next to its 2 GB memory limit, and TTS_TIMEOUT rises from 60 to 120 s so a line still renders under the cap. test_hub_speech pins both values.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 14:38:41 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 cd1a48b615 fix(orchestrator): keep 3D places and prove bubble reading in e2e
page-graph3d.js keeps node places across refreshes; the e2e helpers wait for the shown screen. page-bubbles.js marks each fading bubble with data-read, the word count its reading reached, and the W6 e2e test records bubble changes with a MutationObserver instead of sampling frames: counts never go down, data-read is 13, the bubble fades and leaves, and the reading lasts 4.233 to 6.333 s. A mutation run that stopped or rewound the reading failed both widths.

🎯 Fix: 90 %
💥 Break: 5 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 86
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 14:10:04 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 7c0872ea68 fix(kvb-org-queue): reread the config on every poll of a waiting hold
A waiting hold kept the config.json it started with, so a raised RAM or slot limit only reached it after cancel and re-hold. wait() now calls fresh() each poll; a missing, unreadable or incomplete file keeps the last complete config, so a half-saved edit never ends a wait. The History and learning details move to learning.md, bringing SKILL.md from 605 to 540 of 600 words and clearing master's red test_lock.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:25:24 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 07d28a62c6 fix(orchestrator): keep polling while text stays selected
The hub page skipped every 10 s state poll while any text was selected, so operator rows that operator.py run had closed stayed on screen until the selection ended (2026-11-12: no /api/state from 09:29 to 09:54 while the CLI closed 19 rows). A selection now holds the poll back for at most 20 s, and returning to the window reloads at once.

🎯 Fix: 90 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 87
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 10:20:31 +00:00
Kevin Veen-Birkenbach fd8fc08603 Merge fix/kvb-check-security-accept-key-collision into unify/skills-20261111
🧪 Test / 🧪 Lock + lint (push) Canceled after 0s
2026-11-12 09:19:56 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 32591405ab fix(kvb-check-security): one acceptance never hides an identical line elsewhere
An acceptance was keyed by rule, path and the sha1 of the stripped line, so two identical flagged lines in one file shared it: Experiment accepted a false positive at utils/docker/registry.py:105 and the real B310 at :78, same text, vanished from the score (2026-11-12). A row without context now accepts a finding only while no other finding of the scan shares its rule, path and text; accept --line binds a row to the sha1 of the five surrounding lines and is required when the line's text occurs more than once in the file, and refuses a --sha1 that is not that line's. Existing rows keep working on unique lines; the new test fails on master (100 percent, 2 accepted) and passes here (50, then 75 percent).

🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 09:19:45 +00:00
Kevin Veen-Birkenbach 37265fdb4e Merge fix/kvb-org-queue-light-kinds-skip-reservations into unify/skills-20261111 2026-11-12 08:48:17 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 151031ab4a fix(kvb-org-queue): light kinds meet only running and granted jobs, never a reservation
Every entry blocked by budget or disk added its share to the tally of all entries behind it, and a head the host load keeps out counted as granted while a job ran, so test-nostack jobs needing 0 GB and 11 % CPU waited behind 'CPU 170-242 % in use or reserved' (live queue 2026-11-12). Operator pick on the chair's ask: a light_kinds entry is now checked only against running and granted entries; reservations, a load-held head included, hold back heavy kinds alone. resources() returns what a job takes or reserves, so evaluate() keeps both tallies. Heavy-only queues give master's verdicts (skeptic probe: 0 of 40000 random cases differ); a stream of light jobs can delay a heavy head, as the docstring and SKILL.md now state. Tests kill the reviewer's three mutants and fail on master.

🎯 Fix: 92 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 88
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 08:47:26 +00:00
Kevin Veen-Birkenbach 64bd13cecb Merge fix/kvb-org-organize-council-git-marker into fix/kvb-org-queue-load-held-reserves-nothing
🧪 Test / 🧪 Lock + lint (push) Canceled after 0s
2026-11-12 08:40:39 +00:00
Kevin Veen-Birkenbach 4df1c2e48c Merge master into unify/skills-20261111 2026-11-12 08:23:22 +00:00
Kevin Veen-Birkenbach 21a044b428 Merge fix/kvb-org-organize-council-git-marker into fix/kvb-org-queue-load-held-reserves-nothing 2026-11-12 08:15:40 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 256fe2c327 fix(kvb-org-queue): an idle queue no longer waits on a head the host load alone keeps out
evaluate() counted a non-hotfix entry that passed every queue check but was held back by the live host load as granted for every entry after it: its slot, the exclusive-kind drain and its CPU/RAM share. With RAM held outside the queue the head never started and nothing behind it did either (2026-11-12 03:50 UTC: 27 entries, no job active, host idle). While no queue job is active, such an entry now reserves nothing and holds nothing back; with jobs active it keeps its reservation, and a load-held hotfix still holds back every entry after it. Replayed on the live queue, the fix grants test-nostack-1035 at once.

🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 08:08:40 +00:00
Kevin Veen-Birkenbach 5c96a9fa01 Merge feature/workbench-w6-speech-bubbles into unify/skills-20261111 2026-11-12 07:54:05 +00:00
Kevin Veen-Birkenbach 381aeb3ba0 Merge fix/orchestrator-skipped-view-transition into unify/skills-20261111 2026-11-12 07:54:05 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 a86c0f41b6 test(orchestrator): match the W6 e2e to the radio names and both browsers
The radio drops the session suffix, so the second sender is Skills, not Skills session; the 1366 stream view has no Skills face, so that bubble belongs in the bar; Firefox reports the font family unquoted; Firefox's own favicon request trips the CSP guard like in the other e2e tests. Replayed on the saved browser results of the unify gate, every W6 assertion passes in Chromium and Firefox.

🎯 Fix: 93 %
💥 Break: 1 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 92
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 07:53:59 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 82edf43417 fix(orchestrator): a view transition skipped by the next switch stays quiet
apply() starts a view transition on every hash change; a quick second switch skips the running one, whose ready promise then rejected with an unhandled AbortError, which the presence e2e counted as a page error in Chromium and Firefox. The skip is expected, so its AbortError is caught; every other ready failure is rethrown and still surfaces.

🎯 Fix: 92 %
💥 Break: 2 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 90
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 07:53:29 +00:00
Kevin Veen-Birkenbach 08fd189c30 Merge feature/workbench-w6-speech-bubbles into unify/skills-20261111 2026-11-11 23:39:23 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 770667ced9 feat(orchestrator): 003 W6 speech bubbles at the agents in every view
A toolbar toggle, a hub setting off by default, shows a speech bubble per agent anchored at its face in every view and at its projected node in 3D; an agent without an anchor speaks from a caption bar. The speaking agent's bubble is the largest and reveals its line word by word over the audio duration, or at 180 words a minute without TTS, a failed TTS request included; queued agents wait as smaller ellipsis bubbles sized by order, and a finished bubble fades out while the next one grows. Comic Neue 400 latin is vendored under SIL OFL 1.1 and loaded through the FontFace API, so the CSP stays unchanged.

Residuals: the caption says speaking while bubbles run silently; the word reveal follows the wall clock, not the audio clock; the e2e suite runs once in the unify gate (operator order 2026-11-11 21:15), score gate exit 1 accepted under that order.

🎯 Fix: 82 %
💥 Break: 5 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 78
🚦 Gate: ⛔ fix 82 % < 90

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 23:39:17 +00:00
Kevin Veen-Birkenbach 6b75be39d5 Merge feature/operator-workbench into unify/skills-20261111 2026-11-11 22:51:51 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 64c63efc26 feat(orchestrator): mount the host's agents-council state read-only as /kept
The W4 resources view reads gates.db and the resources/ files of the host sampler. The installer creates ~/.local/state/agents-council/resources and writes KVB_ORCHESTRATOR_KEPT into .env; compose binds it read-only at /kept without creating the host path, and the server passes --kept to the hub.

🎯 Fix: 90 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 87
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 22:50:49 +00:00
Kevin Veen-Birkenbach 45db829e45 Merge fix/kvb-check-gate-excluded-targets into unify/skills-20261111 2026-11-11 22:36:00 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 9f598a56ab fix(kvb-org-organize): count only real git markers in the council gate
An empty /tmp/.git (2026-11-11 19:47, owner unknown) made council.py gate treat all of /tmp as a git worktree: every unclaimed Edit or Write under /tmp was blocked and test_council turned every skills gate red. A parent now counts only when its .git is a directory holding HEAD or a regular file starting with gitdir:, as git itself requires, so normal repos, linked worktrees and submodules still block unclaimed edits. A FIFO named .git is never opened, so it cannot hang the hook. Root fix proposed by the chair Main.

🎯 Fix: 94 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 91
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 22:35:39 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 bcbcd9f9a2 fix(kvb-check-gate): exclude operator-listed targets from every gate
gate_excluded_targets in .claude/agents-council/config.json of the passwd home (never $HOME or the environment, so no caller swaps in its own list) names targets no gate requires or runs. status shows them excluded and keeps the gate green without them, naming the exclusion and the config in the green line; excluding every target keeps the gate open and skips the hotfix check. run refuses an excluded target with exit 2. Operator order 2026-11-11: no oracle tests in any gate.

🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 22:34:47 +00:00
Kevin Veen-Birkenbach 4ab13b6e65 Merge fix/kvb-org-queue-footprint-noise into master
🧪 Test / 🧪 Lock + lint (push) Canceled after 0s
2026-11-11 21:31:48 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 c1a88c6556 fix(kvb-org-queue): learn CPU by median, path-free signatures, exclusive gate kinds
The CPU share learned the p90 of the host-wide peak minus before, which carries every neighbour's spike: 30 days of history give test-nostack a p90 of 73.8 against a median of 9.7, and rows that no other job overlaps learn the same p90, so concurrency is not the cause. signature() also kept the --repo value of a script as its operand, so every worktree's scan learned apart and fell back to the kind (130 of 301 test-nostack rows). The CPU share now learns the median while RAM keeps the p90, and an operand holding a path separator leaves the signature. New optional config keys exclusive_kinds and light_kinds: a job of an exclusive kind runs only beside light kinds, and an exclusive entry that only running jobs of other kinds keep out holds back every later non-light entry, so no lower-ranked job overtakes a waiting gate.

🎯 Fix: 91 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 87
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:39:19 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 ca54420f4d fix(kvb-org-queue): restart holders on stale queue code; link host skills into projects
Every holder judges the shared queue.json with its own loaded code, so the project copies from 2026-11-07 (no RAM/CPU budget) granted heavy jobs on the slot limit alone and overloaded the host at 18:24. Each entry now stamps a hash of queue.py and the sibling scripts it loads; a poll that finds other code installed in ~/.agents/skills leaves the queue ungranted and re-execs the same hold with the installed queue.py, on the realpath interpreter, with signals reset and a caught signal ending the hold instead. queue.py list prefixes entries on other or unstamped code. A project install now symlinks every skill the global install holds instead of copying it, so the project hooks and ../ references stay valid and one host runs one version.

🎯 Fix: 92 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 88
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 20:33:54 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 1bcc8c135f feat(workbench): requirement 003 with the gates and register contracts
Requirement 003 Operator Workbench (operator-confirmed 2026-11-11) and the contracts its work packages build on: gates.py keeps gate rules, branch parents and gate receipts in ~/.local/state/agents-council/gates.db (resolve takes the branch's own level, else the strictest of all parents; derive records the nearest ancestor tips; tree hashes everything a worktree holds through a temporary index). rasci.py gains --unpin, stamps every changed row with updated, and ranks a task after its after-dependencies.

🎯 Fix: 95 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 92
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 18:13:24 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 134b1d30f1 fix(kvb-org-queue): a hotfix held back by host load holds back the entries after it
The grant order ignored live load: a prio-1 hotfix that fit the budget but waited on RAM or CPU counted as granted for the entries after it, so CPU-light jobs behind it could start, keep the load up and starve it. Such a hotfix now holds back every entry after it until it starts (operator pick 2026-11-11 on Main's report). Each holder stores the reason of its last poll, and list shows it, so a job the load holds back no longer reads as granted, without list sampling the CPU.

🎯 Fix: 92 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 88
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:34:37 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 5053c6a9be Merge fix/kvb-org-operator/executable-commands into master
🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:13:06 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 928d50f600 Merge fix/kvb-check-security/file-level-fingerprint into master
🎯 Fix: 95 %
💥 Break: 2 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 93
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:13:03 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 47ec0213e1 fix(kvb-org-operator): refuse operator commands no shell can run
operator.py add accepted prose, slash commands, aliases and <slot> commands as runnable rows, so the operator got bash blocks that do nothing or fail. A command must now start, after VAR=value words, with a program on PATH, a path to one or a shell builtin, and hold no <slot>; anything else is refused unless the row is a decision. Older rows of that kind stay in the table but get no bash block and are skipped by run. Ordered by the operator on 2026-11-11.

🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 16:12:43 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 87426c0046 fix(kvb-check-security): accept a finding without a line by the sha1 of its file
A MEDUSA finding without a line number (a Dockerfile-level rule, for example) had no fingerprint, so security.py accept could never waive it and the score stayed below 100 after review. Such a finding is now keyed by the sha1 of the whole file; any edit of the file brings it back.

🎯 Fix: 95 %
💥 Break: 2 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 93
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 15:48:11 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 7043cdfd98 fix(kvb-org-queue): book a job at its own command's footprint
A command with 5+ runs is booked at its own p90 RAM and CPU share, an unlearned one at its kind's p90. The old rule took the larger of kind and command, and for an unlearned command the largest command of its kind: test-nostack-788 (docker build) sat 90 min at position 1, booked at 42.6 % RAM from a legacy gate.py hold row while test-nostack measures 5.6 %; skills make test (3.3 %) was booked at the test kind's 35 %.

🎯 Fix: 93 %
💥 Break: 5 %
💸 Cost: 99 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 12:07:13 +00:00
Kevin Veen-Birkenbach 45063dc71f Merge fix/kvb-org-queue/unclaimed-grant into master 2026-11-11 09:51:46 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 4df3945066 fix(kvb-org-queue): an unclaimed grant drops its reservation
evaluate counted every unblocked waiting entry as granted for the entries behind it, but only that entry's own wait() poll turns it active; a living holder that stopped polling kept its slot and share forever and wedged the queue. Every poll now stamps polled; a waiting entry silent for CLAIM_SECONDS (3 polls) reserves nothing and is listed last, and once it polls again it takes a fresh seq and enqueue time, so it rejoins at the back of its rank.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 89
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:51:29 +00:00
Kevin Veen-Birkenbach 083fcb37e0 Merge fix/kvb-org-organize/cache-missing-root into master 2026-11-11 09:47:15 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 8f942ff071 fix(kvb-org-organize): skip a missing cache root in the cache trim
cache_files walked every cache_dirs entry with os.fwalk, which raises FileNotFoundError for a folder that does not exist (~/.cache/ms-playwright on this host), so cleanup --caches crashed and trim_caches never ran at disk stage warn. A root that cannot be walked is now skipped and the other roots are still trimmed.

🎯 Fix: 95 %
💥 Break: 2 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 93
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:44:40 +00:00
Kevin Veen-Birkenbach 252f191c4c Merge feature/orchestrator/inbox-bulk-deny into master
# Conflicts:
#	tests/e2e/test_orchestrator_e2e.py
2026-11-11 08:39:04 +00:00
Kevin Veen-Birkenbach 23f10bce68 Merge fix/orchestrator/passkey-single-flight into master 2026-11-11 08:35:53 +00:00
Kevin Veen-Birkenbach 3f04ea06ae Merge fix/install-keep-skills-dir into master 2026-11-11 08:35:46 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 23f7a0556a feat(orchestrator): deny the selected inbox items in one step
The inbox selects several items by checkbox and denies them together through one passkey proof; the cursor stays on the clicked row after the redraw. Keyboard d denies the selection when one exists.

🎯 Fix: 90 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 86
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 08:32:36 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 5556ed8a0d fix(orchestrator): one passkey request at a time
With two passkey requests open at once, the hub received one request's payload with the other request's assertion and refused it with the challenge is not the one of the payload. signedProof now refuses a second signing while one runs and tells the operator to finish the first.

🎯 Fix: 89 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 85
🚦 Gate: ⛔ fix 89 % < 90: operator approved the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 08:21:53 +00:00