Repository navigation
Open
Labels
triage-can-waitVerdict: valid and in-scope but deprioritized; held behind the evidence gateVerdict: valid and in-scope but deprioritized; held behind the evidence gate
Description
What happens (v1.2.6)
A team installs a preset that adds a section to the plan template. Later, a developer copies the plan template into .specify/templates/overrides/ to tweak one line. From then on, the preset's section is gone from every plan, and nothing says so:
specify preset resolve plan-templateshows only the override.specify preset liststill shows the preset as enabled.- Only
specify artifact info plan-template --kind template --jsonreveals it, ashidden: true.
This matches the rule that project overrides always win, so it isn't a bug. It's just invisible.
Reproduction script
#!/usr/bin/env bash
# u5: a project override on a template silently drops every preset layer on it, and the CLI says nothing.
# A team preset that appends a section (the documented "append" strategy), plus a developer's own
# override of the same template (the documented .specify/templates/overrides/ folder). Stock CLI only.
set -uo pipefail
REF="${REF:-v1.2.6}"
WORK="$(mktemp -d)"
cd "$WORK"
SPECIFY=(uvx -q --from "git+https://github.com/github/spec-kit.git@$REF" specify)
"${SPECIFY[@]}" init --here --force --non-interactive --integration claude --script sh --ignore-agent-tools >/dev/null 2>&1 || { echo "init failed"; exit 2; }
echo "spec-kit $REF in $WORK"
mkdir -p preset-src/templates
cat > preset-src/preset.yml <<'YML'
schema_version: "1.0"
preset:
id: "team-governance"
name: "Team Governance"
version: "0.1.0"
description: "Appends a compliance appendix to every plan"
author: "repro"
requires:
speckit_version: ">=1.2.0"
provides:
templates:
- type: "template"
name: "plan-template"
file: "templates/plan-template.md"
strategy: "append"
description: "Compliance appendix appended to the plan"
tags: ["governance"]
YML
printf '\n## Compliance Appendix\n\nList every regulated data field the change touches.\n' > preset-src/templates/plan-template.md
echo "1. team installs the preset"
"${SPECIFY[@]}" preset add --dev ./preset-src </dev/null 2>&1 | tail -1
echo " preset resolve plan-template:"
"${SPECIFY[@]}" preset resolve plan-template 2>&1 | sed 's/^/ /'
echo "2. a developer overrides the plan template for this project (copies it and edits a line)"
mkdir -p .specify/templates/overrides
sed 's/^# Implementation Plan/# Implementation Plan (our team)/' .specify/templates/plan-template.md > .specify/templates/overrides/plan-template.md
echo " preset resolve plan-template:"
"${SPECIFY[@]}" preset resolve plan-template 2>&1 | sed 's/^/ /'
echo " artifact info plan-template --kind template:"
"${SPECIFY[@]}" artifact info plan-template --kind template --json 2>&1 | python3 -c "import json,sys;d=json.load(sys.stdin);print(json.dumps(d,indent=1)[:1500])" 2>&1 | sed 's/^/ /'
echo " preset list:"
"${SPECIFY[@]}" preset list 2>&1 | sed 's/^/ /' | head -8
o=.specify/templates/overrides/plan-template.md
if [ -f "$o" ] && [ "$(awk '/Compliance Appendix/{n++} END{print n+0}' "$o")" = "0" ]; then
echo "RESULT: plan-template now resolves to $o, which has no Compliance Appendix. Read the output above for any warning that the preset is hidden."
fiSuggested fix (small)
- One sentence in the presets docs: a project override replaces the template and hides every preset change to it.
- One line from
preset resolvewhen that happens, for example "team-governance (append) is hidden by a project override". The information is already computed forartifact info, so this is a few lines. Happy to open a PR for it if that direction works for you.
AI disclosure: drafted with Claude Code (Claude Opus 5.5, default settings) from runs in a throwaway sandbox; I checked it before filing.
Metadata
Metadata
Assignees
Labels
triage-can-waitVerdict: valid and in-scope but deprioritized; held behind the evidence gateVerdict: valid and in-scope but deprioritized; held behind the evidence gate
Activity