Commit Graph
251 Commits
Author SHA1 Message Date
Kevin Veen-Birkenbach 5cac9a061f Merge fix/kvb-org-organize-council-git-marker into unify/skills-20261111 2026-11-11 22:35:59 +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-Birkenbach 4ab13b6e65 Merge fix/kvb-org-queue-footprint-noise into master
🧪 Test / 🧪 Lock + lint (push) Waiting to run
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-Birkenbach a52e62cd57 Merge fix/queue-version-guard into master 2026-11-11 20:34:08 +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 e805b07c27 Merge fix/kvb-org-queue/hotfix-holds-back-on-load into 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-11 16:34:41 +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 87669ad138 Merge fix/skills/no-diff-in-chat into master
🎯 Fix: 92 %
💥 Break: 2 %
💸 Cost: 99 %
⏱️ 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 16:13:00 +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 3ad111be0a fix(skills): show the diff stat, never the diff, in commit and essence skills
kvb-git-commit-no-verify, kvb-git-commit-next and kvb-skill-essence printed the full staged diff into the chat before every commit or batch write. The operator ordered on 2026-11-11 that the chat shows only the diff stat and the score table, to save tokens.

🎯 Fix: 92 %
💥 Break: 2 %
💸 Cost: 99 %
⏱️ 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 15:40:15 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 e52db1dca0 Merge fix/kvb-org-queue/footprint-per-command into master
🎯 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:23 +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-Birkenbach b87fb4cc37 Merge fix/kvb-org-unify/listing-budget into master 2026-11-11 09:51:45 +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-BirkenbachandClaude Opus 5.5 d59a234a8c fix(kvb-org-unify): fit the skill listing budget and drop the German trigger
The 33-word description pushed the listing to 1518 of 1500 words and its trigger phrase was German, so test_lock and test_english failed on master after the swarm/unify merge. The description now has 14 words; the listing holds 1499.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 09:50:32 +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 275745ba1d Merge feature/kvb-org-swarm-unify into master 2026-11-11 08:45:47 +00:00
Kevin Veen-Birkenbach 976d531975 Merge fix/kvb-org-operator/drop-trip-wire-comments into master 2026-11-11 08:45:41 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 68d3bc337a feat(skills): rename kvb-org-split to kvb-org-swarm, add kvb-org-unify
kvb-org-swarm keeps agent work in its own worktree until it meets 90/5; kvb-org-unify brings the swarm's branches back together. Every skill that named kvb-org-split now names kvb-org-swarm. Cost 111 % accepted by the operator on 2026-11-11.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 111 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 80
🚦 Gate: ⚠️ cost 111 % > 100: ask the operator before the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 08:44:58 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 29d6afae72 style(kvb-org-operator): drop two trip-wire comments
🎯 Fix: 98 %
💥 Break: 1 %
💸 Cost: 100 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 97
🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 %

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 08:41:26 +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
Kevin Veen-BirkenbachandClaude Opus 5.5 c803f4ee28 fix(install): empty the skills directories instead of replacing them
install.sh removed ~/.claude/skills and ~/.agents/skills and created them anew. The Agent Orchestrator bind-mounts ~/.claude/skills, and a new inode left that mount showing the deleted directory, so the hub's radio send failed with radio.py not found after every make install. The installer now keeps each directory and deletes its contents before copying.

🎯 Fix: 93 %
💥 Break: 3 %
💸 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-11 08:20:16 +00:00
Kevin Veen-Birkenbach c3ab6b7e18 Merge feature/orchestrator/s52-night-per-agent into master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	docs/requirements/001-agent-orchestrator.md
#	orchestrator/kvb_orchestrator/view.py
#	orchestrator/templates/page-board.js
#	tests/test_hub_state.py
2026-11-11 07:53:40 +00:00
Kevin Veen-Birkenbach afebf24703 Merge feature/orchestrator/s53-agent-presence into master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	docs/requirements/001-agent-orchestrator.md
#	orchestrator/templates/page-board.js
#	tests/e2e/test_orchestrator_e2e.py
2026-11-11 07:48:48 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 995c7cb214 feat(orchestrator): S5.2 drain, suspend and resume chosen agents
The Day/Night menu lists every claimed agent with a checkbox and an All box; Drain, Suspend and Resume act on the ticked agents only, are disabled when none is ticked, and the agent popup carries the same three buttons for that one agent. Each action is passkey-signed with its agent list, night.py takes --target per session and keeps a per-agent part, and each chosen agent gets a call naming the action and its skill. The night skills say how to read a per-agent night.

🎯 Fix: 90 %
💥 Break: 5 %
💸 Cost: 106 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 81
🚦 Gate: ⚠️ cost 106 % > 100: operator approved the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 07:45:49 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 fdf8722fc1 feat(orchestrator): S5.3 agent states, Status menu and 3D faces
Every Agents view marks each agent as working, alive, sleeping, suspending, unreachable or dead with an animated symbol; a Status menu hides states and switches the 3D faces, kept through a reload. The hub's container sees neither ~/.claude/sessions nor host processes, so the host timer kvb-orchestrator-sessions.timer runs client/sessions.py every 15 seconds while the page polls: it reads the session records without following symlinks, only regular files up to 64 KiB, keeps name, status and statusUpdatedAt within type and length bounds, checks the pid's process start, and writes agent-sessions.json atomically. The hub ignores a snapshot that is missing, malformed, older than five minutes or dated in the future. make orchestrator-install enables the timer and orchestrator-check reports it.

🎯 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-11 07:44:02 +00:00
Kevin Veen-Birkenbach 9123e05cd1 Merge feature/orchestrator-radio-numbers into master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	docs/requirements/001-agent-orchestrator.md
2026-11-10 22:12:34 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 5dbf8d5f51 feat(orchestrator): speak radio numbers, times and paths the ICAO way
pronounced() rewrites a radio text for speech in four passes: paths become file or folder with name and parent (/tmp as temp, ~/ as home), dates with or without a clock become a date-time group converted to Zulu, times become four ICAO digits with Zulu for UTC, and hex runs, version numbers and the remaining digits are spelled in NATO and ICAO words with Decimal between digits. Invalid dates and times stay as written; the displayed text is unchanged.

🎯 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-10 22:11:02 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 85a70e2c72 Merge feature/kvb-org-operator/run-color into master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:16:36 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 ad80c8a4af Merge feature/kvb-release-skills into master
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:16:31 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 cd543d20cf feat(kvb-org-operator): failed and cancelled rows leave the queue and reach the adding agent
A command that exits non-zero or cannot start sets its row stopped with the exit under failed and posts it to every agent holding A, asking for the corrected command; its last stderr lines go along only when the operator answers y, since stderr can hold a credential. Exit 130 or a signal keeps the row open. A cancel needs a reason and posts it the same way. add refuses commands with control characters and run never offers such a row, so a newline can no longer run a hidden second command. A leftover background process holding stderr no longer blocks run. run.md describes what run shows and asks.

🎯 Fix: 90 %
💥 Break: 4 %
💸 Cost: 140 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 62
🚦 Gate: ⚠️ cost 140 % > 100: operator approved the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:15:59 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 99323abc35 feat(kvb-org-operator): color the command in run on a terminal
The operator found the command hard to spot in the run output. run now prints each step's command bold cyan when stdout is a terminal and NO_COLOR is unset or empty (no-color.org); piped or captured output stays byte-identical. Only the command line is colored. The new test runs run on a pseudo-terminal with and without NO_COLOR and piped. Operator order relayed by the Maintainer session on 2026-11-06; the change was written by a subagent and reviewed here.

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

```
/home/kevinveenbirkenbach/Repositories/github.com/kevinveenbirkenbach/skills/.worktrees/feature/kvb-org-operator-run-color
```

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:15:59 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 85462df5ab fix(kvb-org-operator): run no repo-configured command before the operator's yes
Agents name the directories of operator rows and can write the repos behind them. Before the operator answered, list and run started git there unsandboxed, and git ran commands the repo config names: core.fsmonitor, the post-index-change hook on an index refresh, filter clean drivers, the pager, external diff and textconv drivers, gpg through log.showSignature, and a lazy fetch of a missing object that runs remote uploadpack through sh. Preview output and task names also reached the terminal raw, so escape sequences could overwrite the displayed command. Every git call before the yes now runs as git -c core.fsmonitor=false -c core.hooksPath=/dev/null -c log.showSignature=false --no-pager --no-optional-locks with GIT_NO_LAZY_FETCH=1, diffs add --no-ext-diff --no-textconv --ignore-submodules=all, a repo whose config names filter commands gets no working-tree preview, and preview output, task, check, table cells and listed commands go through visible(). The approved command itself still runs through $SHELL -ic unchanged. Found by a skeptic while scanning the color change; each hole was reproduced red before the fix.

Accepted MEDUSA false positives after kvb-think-criticize (rows in security-accepted.jsonl): MEDUSA-MM-SCAN-058 x3, MEDUSA-GENAI-SCAN-1270 x4, MEDUSA-WM-SCAN-354, MEDUSA-CGS-SCAN-040.

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

```
/home/kevinveenbirkenbach/Repositories/github.com/kevinveenbirkenbach/skills/.worktrees/feature/kvb-org-operator-run-color
```

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:15:59 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 df3cb4e4d6 feat(kvb-release): release brief method with article and post channels
kvb-release listens once, writes one brief since the previous tag and hands each channel its slice; kvb-release-article writes the long form and kvb-release-post the short posts, each listening before it brainstorms. A project's own release skill sets file names, title and post structure, and an empty channel list means every channel the project covers. kvb-release-changelog moves its lint steps into lint.md.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 279 %
⏱️ Time: 100 %
🛡️ Security: 100 %
🏆 Score: 32
🚦 Gate: ⚠️ cost 279 % > 100: operator approved the commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 21:13:00 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 78f3d953e7 feat(orchestrator): radio icon in the header opens the radio spot on every tab
The header radio button opens the radio spot above the main area of the current tab. The Send button, the toolbar radio button and the Radio tab are gone, the mayday clears inside the spot without a Cancel mayday label, and the radio station probe waits for a visible row.

🎯 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-10 21:10:20 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 57ab29eb0d feat(orchestrator): S5.1 radio spot, compact menus, trend, ETA and Tasks 3D
🧪 Test / 🧪 Lock + lint (push) Canceled after 0s
Requirement 001 decisions 52 to 58 (operator 2026-11-09):

- Radio spot: the Agents toolbar radio button expands inline with the one
  composer (every channel, post and call recipients, Record, Send), a gear
  with the radio settings (tones, squelch, read aloud, moved out of the
  general settings) and Cancel mayday, which leaves the toolbar; the Radio
  tab keeps speakers, stations and the log plus a jump to the spot.
- Day/Night menu: the badge and Drain, Suspend and Resume only; each
  explanation is the button's tooltip.
- Tasks toolbar: views, filter, estimation, sort and business value in one
  wrapping row with a Request choices dropdown; the status chips stay the
  second row.
- Burndown and burnup: a trend selector (off, linear regression, velocity
  over N days) stored in the hub settings, the trend lines and the forecast
  date on the chart, and a tooltip per point with the work packages that
  started, ended or joined there.
- ETA: every list row shows its ETA (end when done, else start or now plus
  the forecast length behind its predecessors), sharing one predecessor
  walk with the Gantt.
- Tasks 3D: a sixth view on the 3D engine with the dependency edges in the
  Gantt colours, layouts Force and Time.
- Steady 3D camera: the view fits once per graph build, refreshes keep the
  operator's camera.
- e2e: Firefox runs with its profile as cwd, so its crashreporter no longer
  drops core dumps into the repository.
- A forecast beyond the last second a Date can hold is no forecast, so a
  nearly flat regression no longer aborts the Tasks render.

Evidence: make test Ran 717 OK, ruff clean, markdownlint 0 errors; e2e 30 of
30 OK in Chromium and Firefox at 1920, 1366 and 390 px; MEDUSA 0 findings
after one skeptic-accepted lexical EXA006.

🎯 Fix: 93 %
💥 Break: 4 %
💸 Cost: 100 %
⏱️ Time: –
🛡️ 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-10 08:10:51 +00:00
Kevin Veen-Birkenbach e94f2800d5 Merge master into fix/rename-release-changelog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	README.md
2026-11-09 09:27:53 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 9d4efe3bb4 feat(kvb-release-changelog): Version jumps, Contributors with URLs, net counting
Operator order 2026-11-08 (via Main), modelled on core CHANGELOG.md 16.2.3:

- Section order: Breaking, Added, Changed, Fixed, Version jumps, Upgrade
  notes, Contributors.
- Version jumps (net since X.Y.Z): in a repository that pins a version
  per role, one "*role*: old to new" line per role whose
  roles/*/meta/services.yml version differs between tag and HEAD; a
  bump twice shows once, a change and change back not at all; a change
  that is no version bump needs judgement, never a jump line. The same
  comparison covers ref and *_version keys, meta/addons/*.yml pins,
  renamed or split roles paired old to new (a rename without alias is
  also Breaking plus an Upgrade note), requirements.galaxy.yml and
  pyproject.toml pins (classes found by Main on core v16.2.3..main).
- Contributors: always, one "[Name](URL): areas" line per human author
  and Co-authored-by trailer, names through .mailmap, bots and AI
  co-authors left out, the URL from earlier CHANGELOG.md or
  packaging/debian/changelog entries, asked for when missing.
- Net counting: after a long-lived branch merge the commit list repeats
  released work under other SHAs, so every line is judged against
  git diff tag..HEAD and the earlier entries.

The details live in sections.md, read on demand, so SKILL.md stays within
its 600-word cap.

Evidence: make test 652 OK, markdownlint 0 errors
(/tmp/rename-changelog-make-test-4.log), markdownlint of sections.md
after its last edit 0 errors.

🎯 Fix: 92 %
💥 Break: 3 %
💸 Cost: 100 %
⏱️ Time: –
🛡️ 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-09 09:11:18 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 9e2452454e refactor(skills)!: rename kvb-git-changelog to kvb-release-changelog
A new release category groups what announces a release (changelog,
article, posts); the changelog skill is its first member. The naming
test lists the category and the README organigram places the skill
under it.

BREAKING CHANGE: /kvb-git-changelog is now /kvb-release-changelog;
make install replaces the installed copy, kvb-skill-cleanup removes the
legacy directory.

Evidence: make test green, ruff and markdownlint clean
(/tmp/rename-changelog-make-test-2.log); no reference to the old name
left in the tree; MEDUSA 5 files, 0 findings.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 09:09:58 +00:00
Kevin Veen-BirkenbachandClaude Opus 5.5 2a77e4905f chore(lock): refresh the cavecrew and caveman-compress hashes
make install pulled the current JuliusBrussee/caveman skills; their
computed hashes in skills-lock.json follow.

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

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