routine-initlisted
Install: claude install-skill hazarsozer/ren-os
# routine-init
The declaration side of spec §3.5's routine model: **a routine's declaration must bound what it may touch, not just when it runs.** This skill's `lib` doesn't scaffold a repo (see "Scope" below) — it validates the v3 routine-spec schema and provides the runtime allowlist check every routine calls before proposing a write.
## The v3 schema (REQUIRED fields)
```yaml
schema_version: 3
allowlist:
paths: ["projects/myproj/**"] # wiki-relative globs the routine may propose writes to
capabilities: ["recall", "queue-propose"] # named capabilities it may invoke
failure_handler: "notify-journal" # the ONLY valid value in 0.2
exit_criterion: "<non-empty string>" # human-readable, required
```
- **`allowlist.paths` must be non-empty for a NEW spec.** A routine that may touch anything is invalid BY SCHEMA — there is no "allow everything" escape hatch. (A migrated v2→v3 spec is the one exception: it may start with empty `paths` until a human fills it in — see `migrations/routine-spec-2-to-3/README.md`.)
- **`allowlist.paths` must never include `global/` or `global/**`.** Routines can never write to the global tier — enforced here at declaration time, and independently again at apply time by `lib.governance.tiers.tier_of` (Task 6.1): a routine `memory_write` to a `global/` page is always `diff_approved`, never `auto`.
- **`failure_handler` has exactly one valid value: `"notify-journal"`.** Spec §3.5: "failure = notify + journal." There is no free