This policy covers this template repository and any repository
generated from it — the scripts, the justfile, and the conventions
are shared, so the security model is the same downstream.
This is local-first developer tooling. There is no server, no network calls, no deserialization, and no secret handling beyond keeping secrets out of git. The realistic risks are:
- Untrusted arguments. Commands like
just new-spec "<title>"take free-form strings and substitute them into files. User input is escaped before substitution (seesed_escape_replacementinscripts/_lib.sh); cycle values are allowlisted; titles are slugified for filenames so they can't traverse paths. - Untrusted repo content + agents. This template is designed to be
driven by coding agents (Claude Code, and in the
claude-plus-agentsvariant a separate implementer). Agents read specs, decisions, briefs, and handoffs, and they runjustcommands. Treat any of that content as untrusted if it originates outside your team — a pasted issue, an external brief, a dependency's README. Malicious text can attempt prompt injection (steering the agent) or can be passed verbatim into a command. Review what an agent proposes to run. - Secrets in git. The shipped
.gitignoreexcludes.env*,*.pem, and*.key, and theno-secrets-in-codeconstraint inguidance/constraints.yamlmakes "no committed credentials" a blocking rule. Keep secrets in environment variables referenced via.env.example.
- Substitution injection (v5.8).
new-spec/new-stageroute user-supplied titles and the repo id throughsed_escape_replacementbeforesedsubstitution, so a title containing|,&, or\cannot corrupt the command or reach GNU sed'ss///eexecute flag. - Input validation.
advance-cycleallowlists cycle values;archive-specresolves IDs against existing files and usesawk(data, nevereval). - No CI attack surface. There are no GitHub Actions workflows, so
there is no
pull_request_target/ script-injection class to manage. If you add workflows, scopepermissionsminimally and never interpolate${{ github.event.* }}into arun:block.
- Report rendering.
just report-daily/report-weeklyembed spec titles and content into fenced markdown. A title containing a code fence can break out of the block in the generated report. This is cosmetic and local; reports are not executed.
If you find a security issue in the template's scripts or conventions, please report it privately: open a GitHub Security Advisory (repository → Security → Report a vulnerability) rather than a public issue. If advisories aren't available, open an issue that describes the impact without a working exploit and we'll coordinate a fix. There is no bounty; thank-yous are sincere.