feat(skills): add grantable schedule skill + deploy runbook #84
No reviewers
Labels
No labels
epic
in-review
ready-for-agent
ready-for-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
weiwen/evie!84
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fm/evie-schedule-skill-impl"
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?
What
Adds a safe, grantable
scheduleskill so a vouched user's sandboxed agent can manage its own schedules (evie schedule/list/cancel) over$EVIE_SOCKET, plus a precise operator deploy runbook for the remaining morning-agenda-fix steps that live outside this repo.Docs/skill-only — no Rust change. The
skills_dirgrant mechanism is already complete; this PR only supplies the versioned skill source + the runbook.just checkpasses clean (485 tests, fmt + clippy).The bundled-vs-grantable boundary (why a new dir)
bundled_skill_dirs()insrc/pi.rsreads exactly$CARGO_MANIFEST_DIR/skills, and those bundled skills are injected only on the/sudopath (pi_argv(..., include_bundled_skills = sudo)) and deliberately withheld from sandboxes. Dropping the schedule skill underskills/would make it sudo-only and it would never reach a sandbox — defeating the purpose.So the grantable source lives in a new, non-bundled location:
grantable-skills/schedule/SKILL.md. It is not referenced by any evie code; the deployment seeds it into[pi] skills_dir(/var/lib/evie/skills), and it binds into a sandbox only when the user holds theskills/schedulecapability (capability_dirsinsrc/session.rs).grantable-skills/README.mddocuments the distinction, andAGENTS.mdgains a one-line pointer so no future agent re-introduces the landmine.Safe-subset boundary
The
SKILL.mddocuments only the self-scoped, safe surface:evie schedule --in|--at|--cron [--name] [--update] -- <verb> ...evie list [--json],evie cancel --name <name>send/prompt/run <script>— a scheduledrunis safe (it fires re-sandboxed as the user).It deliberately does not document the dangerous immediate surface (immediate
run/prompt/query,sendto other chats). The immediateRunverb is rejected byscoped_allowsregardless (src/control_plane.rs). Everything is scoped to the caller: chat/topic are id-locked and identity is frozen, so the skill tells the agent it never needs--chat/--topic. Every flag and duration/verb form was verified against the currentmain.rsclap parser and the scoped control-plane handlers.Operator runbook (
docs/schedule-skill-deploy-runbook.md)Covers the out-of-repo steps firstmate cannot perform (operator's NixOS config + sandbox actions over Telegram), with exact commands/paths:
grantable-skills/schedule/intoskills_dir,/grant 113665509 skills/schedule, then/clearto rebind.morning-briefing.py/evening-review.pyoff the0700 /home/weiwenpath (unreadable by the sandbox drop uid — the bwrap bind source is opened post-drop) to a sandbox-readable path, e.g./var/lib/evie/homes/113665509/prompts/.morning-briefing/evening-reviewfrom the operator's sandbox assudo=falseschedules pointing at the relocated scripts, so they fire in-sandbox wheregogis provisioned.gogcredentialread_pathsmay have the same0700problem.Precondition stated in the runbook: steps 3-4 depend on the
piopencode-parser repetition fix (separate PR) being merged and redeployed first, so conversational turns are reliable.Scope
Skill source + runbook only. Does not relocate scripts, edit the operator's nix config, re-create schedules, or touch
src/pi.rs's parser (the repetition-fix PR).Pull request closed