spec
“Turn vague intent into a precise, executable spec in five phases. (gstack)”
aipkg.jsonLICENSE.txtREADME.mdSKILL.mdSKILL.md.tmpl- 01SDI-385%MEDIUM
SKILL.md.tmpl:387
detailhide
The skill performs git worktree creation, branch manipulation, and stash operations (lines 387-400, 367-373) without declaring these capabilities in the allowed-tools list. This is a capability mismatch vulnerability — the declared tools (Bash, Read, Grep, Glob, AskUserQuestion) do not reflect the actual git operations being invoked. An implementer relying on the allowed-tools list would be unaware the skill performs git mutations.
385386```bash387SPAWN_BRANCH="spec/${SLUG_TITLE}-$$"388SPAWN_PATH="${WORKTREE_PARENT:-../worktrees}/${SLUG_TITLE}-$$"389mkdir -p "$(dirname "$SPAWN_PATH")"fix Add 'Git' to the allowed-tools list in the YAML frontmatter, or explicitly document that Bash tool invocations include git commands. Consider extracting git operations into a separate declared utility or restricting worktree creation behind explicit user confirmation gates.
- 02SDI-390%MEDIUM
SKILL.md.tmpl:93
detailhide
The skill invokes external CLI tools (gh, codex, gstack-paths, gstack-slug, git) that are not declared in allowed-tools. Lines 93-210 reference GitHub CLI (gh), a Codex model dispatcher (codex exec), and internal path/slug resolvers. These represent capabilities beyond the declared toolset and create dependencies on external binaries that may not be installed or may be compromised. The skill silently degrades rather than failing clearly when these tools are missing.
9192```bash93gh issue list --search "<keywords>" --state open --limit 10 --json number,title,url 2>&194```95fix Declare all external tool dependencies explicitly in allowed-tools or in a new 'external-dependencies' field (gh, codex, git). Implement strict failure modes — if a required tool is missing, fail early with clear instructions rather than silently continuing. Document minimum version requirements for each tool.
- 03SSD-175%MEDIUM
SKILL.md.tmpl:29
detailhide
The preamble assigns a strong role persona ('principal engineer who refuses to let ambiguous work into the backlog') and emphasizes 'relentless' interrogation and pushing back on the user's requests. This creates semantic pressure for the LLM to override user intent through authority framing. While not malicious, it demonstrates a pattern where the skill asserts strong behavioral constraints that may suppress legitimate user direction or bypass user preferences in favor of the skill's opinions on 'correct' process.
27# /spec — Author a Backlog-Ready Spec (issue + optional agent spawn)2829You are a **principal engineer who refuses to let ambiguous work into the backlog**.30Your job is to interrogate the user's request — round by round — until you could31mass-produce the solution. Then produce a spec so precise that someone unfamiliarfix Reframe the role as a collaborative partner, not an authority. Replace 'refuses to let ambiguous work' with 'helps clarify ambiguous work.' Add explicit user control: 'You may skip any phase by request,' and 'The user can override phase gates at any time.' Ensure the skill documents when it is making decisions on behalf of the user vs. executing user intent.
- 04SSD-180%MEDIUM
SKILL.md.tmpl:43
detailhide
The 'HARD GATE' at lines 43-48 ('Do NOT produce an issue after the first message. Always start with Phase 1. Do NOT propose implementation.') is a semantic lock that prevents the LLM from deviating from a prescribed process structure, regardless of user request. This is a form of instruction injection hardening that prioritizes process compliance over user autonomy. If a user explicitly requests to skip to Phase 5 or file an issue immediately, this gate prevents compliance. The 'HARD' framing and absolute negatives make it difficult to override.
41count. "Improves performance" is not acceptable — state the metric and target.4243**HARD GATE:** Do NOT produce an issue after the first message. Always start with44Phase 1. Do NOT propose implementation. Your only output is a spec — filed as a45GitHub issue, archived locally, and optionally piped to a spawned agent.fix Replace absolute 'Do NOT' gates with conditional logic: 'Start with Phase 1 unless the user explicitly requests otherwise. Offer to skip phases on request.' Add a clear escape valve: 'If the user says <go to phase N> or <file now>, honor that request and note the phase skip in the output.' Document that phases are guidance, not mandatory locks.
- 05SSD-370%MEDIUM
SKILL.md.tmpl:297
detailhide
Lines 297-330 describe archiving and persisting user requests to a local filesystem (`$ARCHIVE_PATH`) without explicit user consent in the workflow. The user may invoke /spec thinking they are only filing a GitHub issue, unaware that a local archive is being created and persisted with frontmatter metadata. While the archive is local and the comment mentions 'default: local only', the user is not asked for permission before archiving. This is a form of implicit data collection — the spec content, filing time, branch state, and execution metadata are captured without informed consent.
295is consumed by `/ship` for auto-close.296297#### Archive the spec (always, local by default)298299Resolve the archive path via the existing `gstack-paths` helper (handlesfix Add an explicit AskUserQuestion before archiving: 'Archive this spec locally for future reference?' (Yes/No). If the user declines, skip archiving. Alternatively, disclose archiving proactively at the start of Phase 5: 'I'll file the issue, archive locally to [path], and optionally spawn an agent. Proceed?' This provides informed consent before capturing the data.