docs(skills): permission-denial safety rail (#882 partial) #925
No reviewers
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!925
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/882-skills-safety-rail"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Append a "Permission denials" paragraph to every dispatched skill body so an in-container agent that hits a permission-denied or schema error doesn't reach for harness-config skills (
Skill,update-config,fewer-permission-prompts, …) as an escape hatch. Those skills mutate host-side~/.claude/settings.json— the agent's policy comes fromallowedToolsfixed at SDK boot, so host edits are no-ops mid-session and the agent loops trying to "fix" its perms, burning the dispatch.Two surfaces:
skills/*.md— every dispatch entry-point gets the paragraph appended. Catches the filesystem-fallback path and any future re-seed ofagent_skill.0006_skill_safety_rail.sql— idempotent migration that appends the same paragraph to existing rows inagent_skillwhose body doesn't already carry the heading. Runtime reads DB first (resolveSkillBody), so without this the rail wouldn't reach an already-seeded fleet.Skills covered:
implement/implement-delta,review/review-delta,rebase,fix-ci,breakdown,address-review/address-review-delta, plus the fourdesign-*siblings. Appendix-style files (artifact-style.md,caveman.md) deliberately untouched.Test plan
just qa— typecheck + Biome + 3263 server tests passAND body NOT LIKE '%## Permission denials%') — re-running is a no-op0006_skill_safety_rail.sqland updates the 22 seeded rows in one passOut of scope (#882 stays open)
security-guidance/typescript-lsp/claude-md-managementintoplugin-fixtures/. Currently no plugins / marketplaces registered in the DB, so the original symptom (full upstream catalog visible inskill_listing) is dormant — rail is cheap defensive coverage either way.Closes #882 (partial — the safety-rail companion change; vendoring left for a follow-up).
Safety-rail paragraph correct and consistent between
.mdfiles and SQL migration. Idempotency guard (AND body NOT LIKE '%## Permission denials%') is sound.*-deltavariants included as extras — strictly better than the AC minimum.