Spec-driven development on OpenSpec, with mechanical spec-as-source enforcement: a custom 'spec-as-source' OpenSpec schema adds file-ownership (targets) and test-verification ([@test]) metadata to every capability spec, three scripts (link check, ownership check, manifest build) keep code and specs from drifting apart, plus requirement-gathering, spec-writer, work-review, and a session-handoff skill with a proactive context-warning hook.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
This document is the loop's state. Everything the loop knows lives here — current round, scores, open questions, locked decisions — not in conversation memory. Instantiate it at the start of a prompt-loop session and update it every round; it is an artifact of the conversation, not a repo deliverable.
Original prompt (verbatim, never edited):
<the user's incoming prompt, quoted exactly as received>
Repeat this whole section once per round, in order. Do not rewrite or delete earlier rounds — they are the audit trail.
The full text of this round's prompt revision. Round 1 restates the
original prompt unchanged. Every revision MUST carry all entries of the
## Locked register forward unchanged. Any information the revision needs
but the user never gave is marked n/a or listed as an open question
below — never invented.
Score against SCORING_RUBRIC.md. Every score above 0 requires a verbatim
quote from this round's prompt revision as evidence — no quote, no points.
| Dimension | Score (0–2) | Evidence (verbatim quote) |
|---|---|---|
| Objective clarity | ||
| Scope boundaries | ||
| Verifiability of outcomes | ||
| Completeness of constraints and edge cases | ||
| Absence of invented or assumed facts |
Total: <0–10> — Decision-tree band: <9–10 proceed / 6–8 targeted questions / 0–5 broad re-elicitation>
Questions for the interview phase, derived from the dimensions that scored
below 2 this round. Ask them ONE at a time; record each answer as a new
entry under ## Locked before asking the next.
The gate over the eight blocks prompt-engineer needs and cannot ask about.
A block is covered only by a lock id under ## Locked holding the user's
answer, or the user's explicit statement that the block does not apply —
never by the agent's judgement. Leave the cell empty until then. The loop
stops only when every row has a lock id and the score is 9 or more;
the rubric score never covers a row.
| Block | Covered by |
|---|---|
| Objective | L |
| Context and source priority | L |
| Scope | L |
| Tools policy | L |
| Action boundaries | L |
| Verification | L |
| Output | L |
| Stop condition | L |
User-confirmed decisions, recorded verbatim — the exact answer or approved summary line, not a paraphrase. Every rewrite MUST carry these forward unchanged, and later questions MUST NOT reopen or contradict them.
A lock changes only when the user spontaneously overrides it: record the
new decision as a new entry marked as superseding, and keep the old entry
struck-through (~~old text~~ — superseded by L<n> in round <N>) for
audit. Never delete a lock.
.tessl-plugin
rules
skills
handoff
handoff-skill
openspec-apply-change
openspec-archive-change
openspec-explore
openspec-propose
openspec-sync-specs
plan-judge
plan-mode
prompt-engineer
prompt-loop
requirement-gathering
spec-as-source-setup
templates
openspec-schema
spec-as-source
templates
spec-ci-sync
spec-loop
spec-rebuild
spec-verify
spec-writer
work-review