Skip to content

v0.7.2: extension packaging hygiene + handoff documentation#14

Merged
leocamello merged 7 commits into
mainfrom
chore/v0.7.2-prompt-deduplication
May 21, 2026
Merged

v0.7.2: extension packaging hygiene + handoff documentation#14
leocamello merged 7 commits into
mainfrom
chore/v0.7.2-prompt-deduplication

Conversation

@leocamello
Copy link
Copy Markdown
Owner

Summary

v0.7.2 addresses two drift hazards surfaced during the v0.7.1 release and the dogfood-refresh investigation, plus lands two Epic 3 stabilization tasks from the refactoring roadmap. No new commands, no new features, no new functionality — surgical hygiene and documentation.

Full release narrative: CHANGELOG.md [0.7.2] entry.

What's in

  • README install URL drift fixed. The Quick Start install snippet was pointing at v0.7.0.zip after v0.7.1 shipped; now bumped through to v0.7.2.zip. Future release ceremonies include this bump alongside the three metadata files.
  • New .extensionignore. Tells specify extension add to skip development sources (tests/, specs/, docs/, site/, .specify/, .github/, etc.). Without it, the install vendored ~700 files including the recursive-vendor hazard .specify/extensions/v-model/.specify/.... With it, the install footprint is ~165 files.
  • Epic 3 Task 7 — template overlay mismatch resolved. commands/requirements.md and commands/acceptance.md instructed the LLM to read domain-specific template overlays (templates/overlays/{domain}/*-template.md) that have never existed. Per the audit's DoD ("either implement OR remove the instructions"), the instructions are removed. The empty domain directories are kept as placeholders for future intent. The commands/overlays/{domain}/<command>.md mechanism (which IS populated) is unchanged.
  • Epic 3 Task 5 — handoff graph documented. New AGENTS.md §11 inventories every handoff declared in commands/*.md frontmatter (forward V-Model lifecycle, cross-cutting handoffs, bridge handoffs, backward refinement handoffs), documents the three intentional cycles with their termination conditions, the one historically-removed handoff (planimplement direct), and the invariants the graph enforces.
  • Test infrastructure — extension-isolation guard allow-list extended to permit .extensionignore.

What's NOT in

  • Epic 3 Tasks 2, 3, 4 (extract shared prompt policies; reduce each command to single responsibility; refactor bridge prompts). The audit's Definition of Done for these tasks presupposes either a build-time generator or an install-time include mechanism — tooling we don't have. Lightweight versions (standardize-and-CI-test) were considered but the bigger architectural decision (build the tooling, redesign the prompts, or adapt the DoDs) is deferred. Documented in CHANGELOG [0.7.2] under "Deferred."

Verification

  • pytest tests/evals/ tests/structural/ -m structural122 passed, 0 failed
  • ./tests/bats/lib/bats-core/bin/bats tests/bats/457 passed, 0 failed
  • pytest tests/evals/ -m llm_judge (full pre-tag sweep) → 9 passed / 1 LLM-variance flake; flake passes on targeted re-run → 10/10 effectively passing

Post-merge

  1. git tag v0.7.2 on the merged main
  2. gh release create v0.7.2 --notes-file <CHANGELOG [0.7.2] section>
  3. Update the still-open upstream catalog PR (github/spec-kit#2613) from v0.7.1 → v0.7.2 (or open a fresh PR if #2613 has already merged).

The Quick Start install snippet hardcoded the v0.7.0 release zip URL,
so end users following the README after the v0.7.1 release would still
install v0.7.0. This is documentation drift introduced by v0.7.1 that
we missed during the release ceremony.

  specify extension add v-model --from <...>/tags/v0.7.0.zip
  → specify extension add v-model --from <...>/tags/v0.7.1.zip

Surfaced while preparing the Epic 3 / dogfood-refresh work on this
branch — the README install path is what every end user goes through,
so this is a higher-priority fix than the dogfood-state refresh.

Going forward, the release ceremony should include "bump the README
install URL" alongside the version bumps in pyproject.toml /
extension.yml / catalog-entry.json (the MF-8 atomic-release-bump
pattern from the master plan).
… surface

When `specify extension add v-model --from <zip-url>` runs on the v0.7.1
release archive, upstream spec-kit-core's `_load_extensionignore` reads
this file and excludes the listed paths from the vendor copy in
`.specify/extensions/v-model/`. Without this file the entire repo zip
gets vendored verbatim (~700 files at v0.7.1, including tests, specs,
the MkDocs site output, recursive .specify/, recursive .github/, etc.),
which makes the dogfood-in-source pattern unworkable: each refresh
produces hundreds of file changes and the recursive vendor compounds.

The exclusions fall into four groups:

  - Recursive-vendor hazards: .specify/ and .github/ — this repo
    dogfoods the extension on itself, so including these would copy
    the extension into itself.
  - Development sources: tests/, specs/, docs/, site/, examples/,
    media/, presentations/, refactoring_plan/. Not runtime
    dependencies of the installed extension.
  - Build / tooling / IDE / OS cruft: __pycache__, .pytest_cache,
    *.swp, .DS_Store, etc.
  - Project-internal files: AGENTS.md, conftest.py, testResults.xml,
    requirements-dev.txt — relevant to contributors evolving the
    extension, not to end users running it.

What survives: commands/ (the prompts), scripts/ (deterministic
verification logic), templates/ (output templates), commands/overlays/
+ templates/overlays/ (domain overlays), extension.yml,
catalog-entry.json, config-template.yml.example, README, CHANGELOG,
LICENSE, and a few small metadata files. Roughly 165 files instead of
~700.

This file is itself excluded (line at bottom) so it doesn't get
vendored either.

Will take effect once consumers install via a release that contains
this file — v0.7.2 onward. Local installs require `specify-cli`
recent enough to honour the .extensionignore mechanism (upstream
extensions.py line 344 with `ignore=ignore_fn`).

Surfaced during Epic 3 / dogfood-refresh investigation: the install
attempt at v0.7.1 brought in 737 files because no .extensionignore
existed.
…t (Epic 3 Task 7)

`commands/requirements.md` and `commands/acceptance.md` each documented
a §Domain Overlay step instructing the LLM to read a domain-specific
template overlay file:

  templates/overlays/{domain}/requirements-template.md
  templates/overlays/{domain}/acceptance-plan-template.md

These files were claimed to exist (with conditional "If it exists / If
it does not exist: use base only" handling), but in fact the
`templates/overlays/iso_26262/`, `do_178c/`, and `iec_62304/`
directories have only contained `.gitkeep` placeholders since they
were created in April 2026. No domain template overlay file has ever
existed in any release.

The audit (refactoring_plan/stabilization-audit-roadmap.md Epic 3
Task 7 — "Resolve template overlay mismatch") calls this out and
specifies the DoD: either implement OR remove the instructions.
Implementing would require writing 6 domain-specific template
overlay files (3 domains × 2 commands) — substantial domain-expertise
work that does not fit the "no new functionality" stabilization
scope. So we remove the instructions instead.

The empty `templates/overlays/{domain}/` directories are LEFT IN
PLACE as placeholders signalling future intent. If domain templates
land later, the directory structure is ready; the prompt instructions
can be re-added alongside the actual template files.

The `commands/overlays/{domain}/<command>.md` mechanism is unchanged
— those files are populated and the prompts still load them. Only
the template-overlay step is removed.

  - commands/requirements.md: remove step 2, renumber step 3 → 2
  - commands/acceptance.md:   remove step 2, renumber step 3 → 2

No other commands reference template overlays (verified by grep).

Verification:
  pytest tests/evals/ tests/structural/ -m structural → 122 passed
Inventory and document every handoff declared in commands/*.md
frontmatter so contributors can reason about workflow ergonomics
without re-reading 17 frontmatter blocks.

The new §11 satisfies the Epic 3 Task 5 DoD ("Every handoff has one
source, one target, one reason, and allowed re-entry points; circular
handoffs are intentional and documented") by:

  - Listing the forward V-Model lifecycle (L1–L4 design→test→trace).
  - Listing the cross-cutting/reporting handoffs (hazard-analysis,
    impact-analysis, peer-review, test-results, audit-report).
  - Listing the bridge-command handoffs (plan→tasks→implement) and
    noting the OPTIONAL/CORE classification.
  - Enumerating the 9 backward "Back to X" user buttons.
  - Documenting the three intentional cycles (peer-review self-loop;
    trace↔acceptance gap-fix loop; plan↔tasks↔implement bridge
    refinement) with their termination conditions.
  - Documenting one historically-removed handoff (plan → implement
    direct, removed in v0.7.0 per MF-10) so it doesn't get
    re-introduced by accident.
  - Stating three invariants the graph enforces: every auto-dispatch
    converges on trace; every backward handoff is a user button (never
    send: true); every handoff has all four fields.

Renumbering: previous §11/§12/§13 (Cleanup / Common pitfalls / When in
doubt) shift to §12/§13/§14.

Verification:
  pytest tests/evals/ tests/structural/ -m structural → 122 passed
Release narrative for v0.7.2: extension packaging hygiene + handoff
documentation. Covers the four substantive commits accumulated on
chore/v0.7.2-prompt-deduplication since v0.7.1:

  - README install URL bump (drift from v0.7.0 to v0.7.1)
  - .extensionignore (eliminates the ~700-file dogfood-refresh hazard)
  - Template overlay mismatch removed (Epic 3 Task 7)
  - Handoff graph documented in AGENTS.md §11 (Epic 3 Task 5)

Plus the structural-test allow-list update for .extensionignore.

Epic 3 Tasks 2, 3, 4 are explicitly deferred — their Definition of Done
presupposes tooling (build-time generator or install-time include
mechanism) that doesn't fit the v0.7.x stabilization scope. Documented
in the "Deferred" section so the deferral is visible.

No new commands. No new features. No new functionality.
Part of the v0.7.2 release ceremony — keep the README's Quick Start
install snippet pointing at the current release.

  specify extension add v-model --from <...>/tags/v0.7.1.zip
  → specify extension add v-model --from <...>/tags/v0.7.2.zip

Going forward this bump is part of the standing release ceremony,
alongside the atomic version bump in pyproject.toml / extension.yml /
catalog-entry.json. (Surfaced as documentation drift during the v0.7.2
preparation; previous v0.7.0 → v0.7.1 drift was caught after the fact.)
… + catalog)

Per master plan MF-8 / Step D.3, version metadata bumped atomically
across all three artefacts that carry it.

  - pyproject.toml          version = "0.7.1" → "0.7.2"
  - extension.yml           version: "0.7.1" → "0.7.2"
  - catalog-entry.json      version "0.7.1" → "0.7.2"
                            download_url ...v0.7.1.zip → ...v0.7.2.zip

`updated_at` fields stay at 2026-05-17 (both v0.7.1 and v0.7.2 land
on the same calendar day).

The release narrative is in CHANGELOG.md [0.7.2] (commit a58bdae).
Tag `v0.7.2` and the GitHub release will be published after this branch
merges to main.
@leocamello leocamello merged commit e050c7b into main May 21, 2026
3 checks passed
@leocamello leocamello deleted the chore/v0.7.2-prompt-deduplication branch May 21, 2026 20:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant