fix(kanban): sync allowlisted forced skills before blocking - #33640
fix(kanban): sync allowlisted forced skills before blocking#33640hehehe0803 wants to merge 4 commits into
Conversation
|
Follow-up context for reviewers: This branch builds on the forced-skill crash-loop mitigation in #30025. What changed here:
Related Kanban hardening context:
Local verification:
|
|
Pushed one follow-up commit after initial CI: |
|
Related-work / non-duplication scan before this PR is treated as the active forced-skill path: I checked the nearby Kanban/skills PRs and issues so we do not create yet another overlapping branch by accident. Closest PRs:
Closest issues / RFCs:
Conclusion: #33640 is not redundant if scoped narrowly to "allowlisted sync-before-block for forced Kanban task skills" and kept separate from #33245's broader read-only overlay/catalog design. If #33747 is preferred as the base for preflight, this PR's unique part should be reconciled as the sync-before-block extension rather than maintained as a parallel duplicate. |
…h loops The dispatcher already gates the built-in --skills kanban-worker injection on resolvability under the worker's HERMES_HOME — a missing skill is fatal at CLI startup (ValueError: Unknown skill(s): <name>), aborting the worker before the agent loop runs. Per-task skills from task.skills were passed through unconditionally, so a task whose skill name only exists in the global skills root — not the profile-scoped one the worker actually loads — crash-loops the worker until the watchdog auto-blocks it. Observed in the wild: a task with skills=['mlflow-eval-datasets-for-llm-pipelines'] on a profile-scoped HERMES_HOME respawned 1032 times before being blocked manually, because the skill lives in ~/.hermes/skills/mlops/ but not in ~/.hermes/profiles/work/skills/mlops/. Changes: - Generalize _kanban_worker_skill_available() into _skill_available_for_home(skill_name, hermes_home); the legacy name is kept as a back-compat shim that delegates. - Apply the same gate to task.skills entries in _default_spawn. Skipped skills emit a stderr warning naming the task id so operators see why the worker did not pick up the requested skill; the task still proceeds rather than crash-looping. - Existing tests stub the new helper to keep synthetic skill names resolvable; a new regression test exercises the mixed-resolvability path and asserts the warning surfaces the task id. 56/56 spawn+skill tests in test_kanban_core_functionality.py and test_kanban_db.py pass.
7e26a54 to
c9be84b
Compare
|
Thanks for tracing the forced-skill worker failure; the underlying current-main issue is real: Problems
Suggested changes
Automated hermes-sweeper review. |
Summary
MissingForcedSkillsErrorbeforePopenrather than lettinghermes -p ... --skills missingfail at CLI startup.name, plugin-qualified skills, env overlay roots, and profileskills.external_dirs.Why
Kanban tasks can force-load skills through
task.skills. If a profile-scoped worker lacks one of those skills, the worker dies before the agent loop can explain/block the task. PR #30025 fixed the first half by gating forced skills on resolvability. This branch adds the operational follow-up: if a local install has an explicit allowlisted profile-skill sync policy, attempt sync once before blocking.This prevents repeated “missing forced skill” document/task crashes when the fix is safe and mechanical, while still avoiding broad implicit mutation of profile skill directories.
Related
fix(kanban): gate task.skills on resolvability to prevent worker crash loopsTest plan
python -m py_compile hermes_cli/kanban_db.py tests/hermes_cli/test_kanban_db.pyscripts/run_tests.sh tests/hermes_cli/test_kanban_db.py