From e3bfca24103abaddaae070a246f4cd1470148b47 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 15:34:20 +0200
Subject: [PATCH 1/9] feat(artifacts)!: replace prompts with skills and migrate
managed installs
Retire the prompt artifact family, reuse eleven existing skill workflows, and convert six unique workflows to explicit-only skills.
Install replacement skills before retiring unchanged, tracked legacy prompts. Preserve custom or modified files, unsafe paths, and unresolved conflicts for manual review and retries.
Validation: 698 tests pass with 100% coverage; Ruff, mypy, template validation, and installed manifest verification pass.
BREAKING CHANGE: Remove prompt artifact selectors, vstack.prompts, PromptGenerator, and PROMPT_SCHEMA. Use the documented replacement skills and run vstack init to migrate managed prompts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
.github/agents/architect.agent.md | 2 +-
.github/agents/designer.agent.md | 2 +-
.github/agents/engineer.agent.md | 2 +-
.github/agents/planner.agent.md | 2 +-
.github/agents/product.agent.md | 2 +-
.github/agents/release.agent.md | 2 +-
.github/agents/tester.agent.md | 2 +-
.github/copilot-instructions.md | 22 +-
.github/instructions/git.instructions.md | 2 +-
.github/instructions/helm.instructions.md | 2 +-
.github/instructions/java.instructions.md | 2 +-
.github/instructions/k8s.instructions.md | 2 +-
.github/instructions/markdown.instructions.md | 2 +-
.github/instructions/python.instructions.md | 2 +-
.github/instructions/rancher.instructions.md | 2 +-
.github/instructions/security.instructions.md | 2 +-
.../instructions/terraform.instructions.md | 2 +-
.../instructions/terragrunt.instructions.md | 2 +-
.github/instructions/testing.instructions.md | 2 +-
.../instructions/typescript.instructions.md | 2 +-
.github/prompts/api-design-review.prompt.md | 57 ---
.github/prompts/architecture-risk.prompt.md | 54 ---
.github/prompts/ci-triage.prompt.md | 45 ---
.github/prompts/dependency-audit.prompt.md | 62 ----
.github/prompts/incident-timeline.prompt.md | 59 ----
.github/prompts/migration-plan.prompt.md | 45 ---
.github/prompts/migration-safety.prompt.md | 54 ---
.github/prompts/ops-readiness.prompt.md | 44 ---
.github/prompts/quick-review.prompt.md | 53 ---
.github/prompts/release-check.prompt.md | 48 ---
.github/prompts/repo-assessment.prompt.md | 56 ---
.github/prompts/template-impact.prompt.md | 45 ---
.github/prompts/test-gaps.prompt.md | 42 ---
.github/prompts/upgrade-plan.prompt.md | 45 ---
.github/prompts/workflow-check.prompt.md | 48 ---
.github/skills/adr/SKILL.md | 2 +-
.github/skills/advise/SKILL.md | 4 +-
.github/skills/analyse/SKILL.md | 2 +-
.github/skills/architecture/SKILL.md | 2 +-
.../artifact-integrity/SKILL.md} | 36 +-
.github/skills/ask/SKILL.md | 2 +-
.github/skills/aws-cli/SKILL.md | 2 +-
.github/skills/changedoc/SKILL.md | 2 +-
.github/skills/cicd/SKILL.md | 2 +-
.github/skills/cloudformation/SKILL.md | 2 +-
.github/skills/code-review/SKILL.md | 2 +-
.github/skills/codeql/SKILL.md | 2 +-
.github/skills/concise/SKILL.md | 2 +-
.github/skills/consult/SKILL.md | 2 +-
.github/skills/container/SKILL.md | 2 +-
.github/skills/conventional-commit/SKILL.md | 2 +-
.github/skills/copilot-ops/SKILL.md | 2 +-
.github/skills/debug/SKILL.md | 2 +-
.github/skills/dependabot/SKILL.md | 2 +-
.github/skills/dependency/SKILL.md | 2 +-
.github/skills/design/SKILL.md | 2 +-
.github/skills/docs/SKILL.md | 2 +-
.github/skills/explore/SKILL.md | 2 +-
.github/skills/gdpr/SKILL.md | 2 +-
.github/skills/gh-issues/SKILL.md | 2 +-
.github/skills/gh-release/SKILL.md | 2 +-
.github/skills/guardrails/SKILL.md | 2 +-
.github/skills/helm/SKILL.md | 2 +-
.github/skills/incident/SKILL.md | 2 +-
.github/skills/inspect/SKILL.md | 2 +-
.github/skills/k8s/SKILL.md | 2 +-
.github/skills/lazy/SKILL.md | 2 +-
.github/skills/migrate/SKILL.md | 2 +-
.github/skills/migration-plan/SKILL.md | 69 ++++
.github/skills/onboard/SKILL.md | 2 +-
.github/skills/openapi/SKILL.md | 2 +-
.github/skills/performance/SKILL.md | 2 +-
.github/skills/postmortem/SKILL.md | 2 +-
.github/skills/pr/SKILL.md | 2 +-
.github/skills/rancher/SKILL.md | 2 +-
.github/skills/rca/SKILL.md | 2 +-
.../reasoning/SKILL.md} | 34 +-
.github/skills/refactor/SKILL.md | 2 +-
.github/skills/release-check/SKILL.md | 72 ++++
.github/skills/release-notes/SKILL.md | 2 +-
.github/skills/requirements/SKILL.md | 2 +-
.github/skills/secret-scan/SKILL.md | 2 +-
.github/skills/security/SKILL.md | 2 +-
.github/skills/simplify/SKILL.md | 2 +-
.github/skills/space-setup/SKILL.md | 2 +-
.github/skills/terraform/SKILL.md | 2 +-
.github/skills/terragrunt/SKILL.md | 2 +-
.github/skills/threat-model/SKILL.md | 2 +-
.github/skills/upgrade-plan/SKILL.md | 69 ++++
.github/skills/verify/SKILL.md | 2 +-
.github/skills/vision/SKILL.md | 2 +-
.github/skills/workflow-check/SKILL.md | 72 ++++
.pre-commit-config.yaml | 2 +-
.vstack/vstack.json | 323 +++++++----------
CONTRIBUTING.md | 18 +-
README-pypi.md | 2 +-
README.md | 4 +-
.../adr/032-skills-replace-prompts.md | 57 +++
docs/architecture/overview.md | 16 +-
...retire-prompts_skill_migration_20261017.md | 79 +++++
docs/design/overview.md | 28 +-
docs/design/skills.md | 11 +
docs/design/workflow.md | 5 +
docs/product/requirements.md | 10 +-
docs/product/roadmap.md | 116 +++---
docs/user/README.md | 4 +-
docs/user/how-to/README.md | 2 +-
...-or-prompt.md => choose-agent-or-skill.md} | 15 +-
docs/user/how-to/global-install.md | 2 +-
docs/user/how-to/partial-upgrade.md | 4 +-
docs/user/how-to/reinitialize.md | 6 +-
docs/user/how-to/upgrade.md | 6 +
docs/user/reference/README.md | 2 +-
docs/user/reference/cli-commands.md | 6 +
docs/user/reference/configuration.md | 3 +-
docs/user/reference/instructions-overview.md | 2 +-
docs/user/reference/prompt-migration.md | 98 ++++++
docs/user/reference/prompts-overview.md | 38 --
docs/user/reference/skills-overview.md | 8 +-
docs/user/reference/work-items.md | 2 +-
docs/user/start-here.md | 2 +-
docs/user/tutorials/first-planner-run.md | 2 +-
.../_templates/project/.vstack/config.yaml | 1 -
.../prompts/api-design-review/config.yaml | 8 -
.../prompts/api-design-review/template.md | 45 ---
.../prompts/architecture-risk/config.yaml | 8 -
.../prompts/architecture-risk/template.md | 42 ---
.../_templates/prompts/ci-triage/config.yaml | 8 -
.../_templates/prompts/ci-triage/template.md | 33 --
.../prompts/dependency-audit/config.yaml | 8 -
.../prompts/dependency-audit/template.md | 50 ---
.../prompts/incident-timeline/config.yaml | 8 -
.../prompts/incident-timeline/template.md | 47 ---
.../prompts/migration-safety/config.yaml | 9 -
.../prompts/migration-safety/template.md | 41 ---
.../prompts/ops-readiness/config.yaml | 8 -
.../prompts/ops-readiness/template.md | 32 --
.../prompts/quick-review/config.yaml | 9 -
.../prompts/quick-review/template.md | 40 ---
.../prompts/repo-assessment/config.yaml | 8 -
.../prompts/repo-assessment/template.md | 44 ---
.../prompts/template-impact/config.yaml | 8 -
.../prompts/template-impact/template.md | 33 --
.../_templates/prompts/test-gaps/config.yaml | 8 -
.../_templates/prompts/test-gaps/template.md | 30 --
.../_templates/skills/advise/config.yaml | 2 +-
.../_templates/skills/advise/template.md | 2 +-
.../artifact-integrity/config.yaml | 9 +-
.../artifact-integrity/template.md | 5 +
.../migration-plan/config.yaml | 9 +-
.../migration-plan/template.md | 5 +
.../{prompts => skills}/reasoning/config.yaml | 13 +-
.../{prompts => skills}/reasoning/template.md | 4 +-
.../release-check/config.yaml | 9 +-
.../release-check/template.md | 5 +
.../upgrade-plan/config.yaml | 9 +-
.../upgrade-plan/template.md | 5 +
.../workflow-check/config.yaml | 9 +-
.../workflow-check/template.md | 5 +
src/vstack/artifacts/__init__.py | 3 +-
src/vstack/artifacts/config.py | 18 +-
src/vstack/artifacts/models.py | 10 +-
src/vstack/cli/catalog.py | 4 +-
src/vstack/cli/constants.py | 50 +--
src/vstack/cli/init.py | 119 ++++++-
src/vstack/cli/interface.py | 7 +-
src/vstack/cli/parser.py | 16 +-
src/vstack/prompts/__init__.py | 5 -
src/vstack/prompts/config.py | 21 --
src/vstack/prompts/constants.py | 9 -
src/vstack/prompts/generator.py | 13 -
.../prompts/api-design-review.prompt.md | 57 ---
.../golden/prompts/quick-review.prompt.md | 53 ---
tests/vstack/artifacts/conftest.py | 10 -
tests/vstack/artifacts/test_config.py | 6 +-
tests/vstack/artifacts/test_generator.py | 57 ++-
tests/vstack/cli/test_constants.py | 6 +
tests/vstack/cli/test_interface.py | 6 +-
tests/vstack/cli/test_parser.py | 34 +-
tests/vstack/cli/test_prompt_migration.py | 329 ++++++++++++++++++
tests/vstack/cli/test_service.py | 2 +-
tests/vstack/cli/test_status.py | 2 +-
tests/vstack/prompts/test___init__.py | 19 -
tests/vstack/prompts/test_config.py | 29 --
tests/vstack/prompts/test_constants.py | 25 --
tests/vstack/prompts/test_generator.py | 14 -
186 files changed, 1569 insertions(+), 2120 deletions(-)
delete mode 100644 .github/prompts/api-design-review.prompt.md
delete mode 100644 .github/prompts/architecture-risk.prompt.md
delete mode 100644 .github/prompts/ci-triage.prompt.md
delete mode 100644 .github/prompts/dependency-audit.prompt.md
delete mode 100644 .github/prompts/incident-timeline.prompt.md
delete mode 100644 .github/prompts/migration-plan.prompt.md
delete mode 100644 .github/prompts/migration-safety.prompt.md
delete mode 100644 .github/prompts/ops-readiness.prompt.md
delete mode 100644 .github/prompts/quick-review.prompt.md
delete mode 100644 .github/prompts/release-check.prompt.md
delete mode 100644 .github/prompts/repo-assessment.prompt.md
delete mode 100644 .github/prompts/template-impact.prompt.md
delete mode 100644 .github/prompts/test-gaps.prompt.md
delete mode 100644 .github/prompts/upgrade-plan.prompt.md
delete mode 100644 .github/prompts/workflow-check.prompt.md
rename .github/{prompts/artifact-integrity.prompt.md => skills/artifact-integrity/SKILL.md} (61%)
create mode 100644 .github/skills/migration-plan/SKILL.md
rename .github/{prompts/reasoning.prompt.md => skills/reasoning/SKILL.md} (68%)
create mode 100644 .github/skills/release-check/SKILL.md
create mode 100644 .github/skills/upgrade-plan/SKILL.md
create mode 100644 .github/skills/workflow-check/SKILL.md
create mode 100644 docs/architecture/adr/032-skills-replace-prompts.md
create mode 100644 docs/changes/retire-prompts_skill_migration_20261017.md
rename docs/user/how-to/{choose-agent-skill-or-prompt.md => choose-agent-or-skill.md} (83%)
create mode 100644 docs/user/reference/prompt-migration.md
delete mode 100644 docs/user/reference/prompts-overview.md
delete mode 100644 src/vstack/_templates/prompts/api-design-review/config.yaml
delete mode 100644 src/vstack/_templates/prompts/api-design-review/template.md
delete mode 100644 src/vstack/_templates/prompts/architecture-risk/config.yaml
delete mode 100644 src/vstack/_templates/prompts/architecture-risk/template.md
delete mode 100644 src/vstack/_templates/prompts/ci-triage/config.yaml
delete mode 100644 src/vstack/_templates/prompts/ci-triage/template.md
delete mode 100644 src/vstack/_templates/prompts/dependency-audit/config.yaml
delete mode 100644 src/vstack/_templates/prompts/dependency-audit/template.md
delete mode 100644 src/vstack/_templates/prompts/incident-timeline/config.yaml
delete mode 100644 src/vstack/_templates/prompts/incident-timeline/template.md
delete mode 100644 src/vstack/_templates/prompts/migration-safety/config.yaml
delete mode 100644 src/vstack/_templates/prompts/migration-safety/template.md
delete mode 100644 src/vstack/_templates/prompts/ops-readiness/config.yaml
delete mode 100644 src/vstack/_templates/prompts/ops-readiness/template.md
delete mode 100644 src/vstack/_templates/prompts/quick-review/config.yaml
delete mode 100644 src/vstack/_templates/prompts/quick-review/template.md
delete mode 100644 src/vstack/_templates/prompts/repo-assessment/config.yaml
delete mode 100644 src/vstack/_templates/prompts/repo-assessment/template.md
delete mode 100644 src/vstack/_templates/prompts/template-impact/config.yaml
delete mode 100644 src/vstack/_templates/prompts/template-impact/template.md
delete mode 100644 src/vstack/_templates/prompts/test-gaps/config.yaml
delete mode 100644 src/vstack/_templates/prompts/test-gaps/template.md
rename src/vstack/_templates/{prompts => skills}/artifact-integrity/config.yaml (64%)
rename src/vstack/_templates/{prompts => skills}/artifact-integrity/template.md (92%)
rename src/vstack/_templates/{prompts => skills}/migration-plan/config.yaml (64%)
rename src/vstack/_templates/{prompts => skills}/migration-plan/template.md (80%)
rename src/vstack/_templates/{prompts => skills}/reasoning/config.yaml (54%)
rename src/vstack/_templates/{prompts => skills}/reasoning/template.md (95%)
rename src/vstack/_templates/{prompts => skills}/release-check/config.yaml (62%)
rename src/vstack/_templates/{prompts => skills}/release-check/template.md (81%)
rename src/vstack/_templates/{prompts => skills}/upgrade-plan/config.yaml (63%)
rename src/vstack/_templates/{prompts => skills}/upgrade-plan/template.md (79%)
rename src/vstack/_templates/{prompts => skills}/workflow-check/config.yaml (62%)
rename src/vstack/_templates/{prompts => skills}/workflow-check/template.md (83%)
delete mode 100644 src/vstack/prompts/__init__.py
delete mode 100644 src/vstack/prompts/config.py
delete mode 100644 src/vstack/prompts/constants.py
delete mode 100644 src/vstack/prompts/generator.py
delete mode 100644 tests/_fixtures/golden/prompts/api-design-review.prompt.md
delete mode 100644 tests/_fixtures/golden/prompts/quick-review.prompt.md
create mode 100644 tests/vstack/cli/test_prompt_migration.py
delete mode 100644 tests/vstack/prompts/test___init__.py
delete mode 100644 tests/vstack/prompts/test_config.py
delete mode 100644 tests/vstack/prompts/test_constants.py
delete mode 100644 tests/vstack/prompts/test_generator.py
diff --git a/.github/agents/architect.agent.md b/.github/agents/architect.agent.md
index 5148f163..e7d0912a 100644
--- a/.github/agents/architect.agent.md
+++ b/.github/agents/architect.agent.md
@@ -227,4 +227,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#threat-model` — design-time threat modeling (STRIDE-first, with DREAD/PASTA as needed)
-
+
diff --git a/.github/agents/designer.agent.md b/.github/agents/designer.agent.md
index 40e5cfd8..a04d6274 100644
--- a/.github/agents/designer.agent.md
+++ b/.github/agents/designer.agent.md
@@ -241,4 +241,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#simplify` — simplify proposals and designs while preserving required outcomes
-
+
diff --git a/.github/agents/engineer.agent.md b/.github/agents/engineer.agent.md
index 0bf301b1..3f0722c0 100644
--- a/.github/agents/engineer.agent.md
+++ b/.github/agents/engineer.agent.md
@@ -228,4 +228,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#verify` — run tests, fix issues, re-verify loop
-
+
diff --git a/.github/agents/planner.agent.md b/.github/agents/planner.agent.md
index b47ccfc0..bf928d78 100644
--- a/.github/agents/planner.agent.md
+++ b/.github/agents/planner.agent.md
@@ -291,4 +291,4 @@ that requires changes to upstream items, flag it and trigger a reverse handoff.
- `@#simplify` - simplify stage plans and handoffs while preserving gate requirements
-
+
diff --git a/.github/agents/product.agent.md b/.github/agents/product.agent.md
index 3b135237..f8bd8422 100644
--- a/.github/agents/product.agent.md
+++ b/.github/agents/product.agent.md
@@ -213,4 +213,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#vision` — vision document writing and review
-
+
diff --git a/.github/agents/release.agent.md b/.github/agents/release.agent.md
index 9d803278..07ba8226 100644
--- a/.github/agents/release.agent.md
+++ b/.github/agents/release.agent.md
@@ -203,4 +203,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#simplify` — simplify release scope and release steps while preserving controls
-
+
diff --git a/.github/agents/tester.agent.md b/.github/agents/tester.agent.md
index fa6dfc53..56d9df33 100644
--- a/.github/agents/tester.agent.md
+++ b/.github/agents/tester.agent.md
@@ -220,4 +220,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#threat-model` — structured threat analysis and mitigation prioritization
-
+
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 4785cd29..3271e526 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -17,23 +17,22 @@ vstack provides structured skills for backend/microservice development, executab
- Agents are for roles and handoffs.
- Skills are for reusable procedures.
- Instructions are for always-on policies.
-- Prompts are for one-shot task framing.
- Hooks are for repository-level automation.
When proposals span multiple artifact types, split them into small independent changes.
## Reasoning & Critical Thinking
-Evidence-based reasoning is available as an explicit opt-in framework via `prompt/reasoning`.
+Evidence-based reasoning is available as an explicit opt-in framework via `skill/reasoning`.
-When `prompt/reasoning` is invoked, apply these principles:
+When `skill/reasoning` is invoked, apply these principles:
- **Truth > agreement** — evaluate correctness, not user preference
- **Evidence > opinion** — support claims with facts, logic, or explicit assumptions
- **Critical thinking > people-pleasing** — challenge premises before accepting them
-For structured adversarial review workflows, agents invoke `skill/advise`, which can reference `prompt/reasoning` when deeper critical analysis is needed.
+For structured adversarial review workflows, agents invoke `skill/advise`, which can reference `skill/reasoning` when deeper critical analysis is needed.
-**For downstream users:** Add `prompt/reasoning` to your vstack installation (in your `.vstack/vstack.json` manifest or via your preferred vstack distribution mechanism), then run `vstack install` to generate `.github/prompts/reasoning.prompt.md` in your repository. Agents and skills can invoke it by reference.
+**For downstream users:** Run `vstack install` to generate `.github/skills/reasoning/SKILL.md`, then invoke `/reasoning` explicitly when needed. The install manifest is generated state, not a hand-edited selection file.
## System Structure
@@ -47,18 +46,14 @@ src/vstack/_templates/
├── agents//
│ ├── template.md ← agent instructions body
│ └── config.yaml ← agent frontmatter fields
-├── instructions//
-│ ├── template.md ← instruction file body
-│ └── config.yaml
-└── prompts//
- ├── template.md ← prompt file body
+└── instructions//
+ ├── template.md ← instruction file body
└── config.yaml
docs/ ← overview.md, design.md, skills.md, workflow.md, roadmap.md, adr/
.github/ ← generated output (never edit directly*)
├── skills//SKILL.md
├── agents/.agent.md
-├── instructions/.instructions.md
-└── prompts/.prompt.md
+└── instructions/.instructions.md
.vstack/ ← project-scope vstack state and config
└── vstack.json ← install manifest (generated)
```
@@ -83,7 +78,6 @@ When vstack is installed inside its own repo (`.github/agents/` and `.github/ski
| `src/vstack/_templates/agents//config.yaml` or `template.md` | `python3 -m vstack install` |
| `src/vstack/_templates/skills//template.md` or `_partials/*.md` | `python3 -m vstack install` |
| `src/vstack/_templates/instructions//template.md` | `python3 -m vstack install` |
-| `src/vstack/_templates/prompts//template.md` | `python3 -m vstack install` |
A single command handles all artifact types:
@@ -91,7 +85,7 @@ A single command handles all artifact types:
python3 -m vstack install
```
-Never edit `.github/agents/`, `.github/skills/`, `.github/instructions/`, or `.github/prompts/` directly — changes will be overwritten.
+Never edit `.github/agents/`, `.github/skills/`, or `.github/instructions/` directly — changes will be overwritten. Legacy managed prompts are retired by install/init only when safe.
## Execution Model
diff --git a/.github/instructions/git.instructions.md b/.github/instructions/git.instructions.md
index 18590e6c..00c16620 100644
--- a/.github/instructions/git.instructions.md
+++ b/.github/instructions/git.instructions.md
@@ -41,4 +41,4 @@ Use these Git and release hygiene conventions.
1. Prefer local verification before pushing release-impacting changes.
-
+
diff --git a/.github/instructions/helm.instructions.md b/.github/instructions/helm.instructions.md
index 021ea13d..a8afec2d 100644
--- a/.github/instructions/helm.instructions.md
+++ b/.github/instructions/helm.instructions.md
@@ -45,4 +45,4 @@ Use these Helm conventions.
- [Helm chart best practices](https://helm.sh/docs/chart_best_practices/)
-
+
diff --git a/.github/instructions/java.instructions.md b/.github/instructions/java.instructions.md
index f78e6dad..141ae7ba 100644
--- a/.github/instructions/java.instructions.md
+++ b/.github/instructions/java.instructions.md
@@ -56,4 +56,4 @@ Use these Java conventions.
1. Do not suppress static analysis warnings without a documented, task-specific reason.
-
+
diff --git a/.github/instructions/k8s.instructions.md b/.github/instructions/k8s.instructions.md
index 169122b8..0aa66910 100644
--- a/.github/instructions/k8s.instructions.md
+++ b/.github/instructions/k8s.instructions.md
@@ -51,4 +51,4 @@ Use these Kubernetes conventions.
- [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/)
-
+
diff --git a/.github/instructions/markdown.instructions.md b/.github/instructions/markdown.instructions.md
index 9ab85f0c..3e3ea596 100644
--- a/.github/instructions/markdown.instructions.md
+++ b/.github/instructions/markdown.instructions.md
@@ -51,4 +51,4 @@ Use these Markdown conventions.
1. Keep examples accurate and runnable.
-
+
diff --git a/.github/instructions/python.instructions.md b/.github/instructions/python.instructions.md
index efa1a430..1fbbc30a 100644
--- a/.github/instructions/python.instructions.md
+++ b/.github/instructions/python.instructions.md
@@ -42,4 +42,4 @@ Use these Python conventions.
1. Do not silence lint/type errors unless there is a documented, task-specific reason.
-
+
diff --git a/.github/instructions/rancher.instructions.md b/.github/instructions/rancher.instructions.md
index 78b94e64..3f5487f0 100644
--- a/.github/instructions/rancher.instructions.md
+++ b/.github/instructions/rancher.instructions.md
@@ -44,4 +44,4 @@ Use these Rancher conventions.
- [Fleet docs](https://fleet.rancher.io/)
-
+
diff --git a/.github/instructions/security.instructions.md b/.github/instructions/security.instructions.md
index 6d313413..f581e783 100644
--- a/.github/instructions/security.instructions.md
+++ b/.github/instructions/security.instructions.md
@@ -42,4 +42,4 @@ Use these security policies.
1. Keep privileged logic minimal, auditable, and separate from business logic.
-
+
diff --git a/.github/instructions/terraform.instructions.md b/.github/instructions/terraform.instructions.md
index c8d9d7d5..2b1bc692 100644
--- a/.github/instructions/terraform.instructions.md
+++ b/.github/instructions/terraform.instructions.md
@@ -60,4 +60,4 @@ Use these Terraform conventions.
- [tfsec](https://aquasecurity.github.io/tfsec/) · [checkov](https://www.checkov.io/)
-
+
diff --git a/.github/instructions/terragrunt.instructions.md b/.github/instructions/terragrunt.instructions.md
index d84c5ee2..3a7ce45f 100644
--- a/.github/instructions/terragrunt.instructions.md
+++ b/.github/instructions/terragrunt.instructions.md
@@ -57,4 +57,4 @@ Use these Terragrunt conventions.
- [Terragrunt CLI reference](https://terragrunt.gruntwork.io/docs/reference/cli-options/)
-
+
diff --git a/.github/instructions/testing.instructions.md b/.github/instructions/testing.instructions.md
index 40052f20..a92bd41e 100644
--- a/.github/instructions/testing.instructions.md
+++ b/.github/instructions/testing.instructions.md
@@ -43,4 +43,4 @@ Use these testing conventions.
1. Treat flaky tests as bugs.
-
+
diff --git a/.github/instructions/typescript.instructions.md b/.github/instructions/typescript.instructions.md
index d45110d9..6735d131 100644
--- a/.github/instructions/typescript.instructions.md
+++ b/.github/instructions/typescript.instructions.md
@@ -49,4 +49,4 @@ Use these TypeScript conventions.
1. Do not suppress lint or type errors with inline disable comments unless there is a documented, task-specific reason.
-
+
diff --git a/.github/prompts/api-design-review.prompt.md b/.github/prompts/api-design-review.prompt.md
deleted file mode 100644
index 3e506c0b..00000000
--- a/.github/prompts/api-design-review.prompt.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-description: 'Review an API design or OpenAPI spec for correctness, completeness, and consistency.'
-name: api-design-review
-argument-hint: '[OpenAPI spec file, design doc, or endpoint scope]'
-agent: designer
-tools:
- - read
- - search
----
-Review the provided API design or OpenAPI specification for correctness, completeness, and consistency.
-
-Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions.
-Ignore implementation details and tooling preferences.
-
-Output exactly in this format:
-
-## Contract Issues
-
-List problems that would break or confuse consumers.
-
-For each item:
-
-- endpoint or field reference
-- what the problem is in one sentence
-- concrete fix
-
-## Naming and Consistency
-
-List naming violations, inconsistencies across endpoints, and deviations from REST conventions.
-
-## Missing Error Cases
-
-List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500).
-
-## Schema Completeness
-
-List fields or objects that are missing required constraints, descriptions, or examples.
-
-## Versioning and Compatibility
-
-- versioning strategy present: yes | no | partial
-- breaking changes relative to previous version: yes | no | unknown
-- backward compatibility risk: low | medium | high
-
-## Security Scheme Check
-
-- authentication documented: yes | no
-- authorization scopes documented where relevant: yes | no | partial
-- sensitive fields handled appropriately: yes | no | partial
-
-## Verdict
-
-- approve | approve-with-conditions | reject
-- top priority fix in one sentence
-
-
-
diff --git a/.github/prompts/architecture-risk.prompt.md b/.github/prompts/architecture-risk.prompt.md
deleted file mode 100644
index ff918d2d..00000000
--- a/.github/prompts/architecture-risk.prompt.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-description: 'Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design.'
-name: architecture-risk
-argument-hint: '[design doc, ADR, or architecture scope]'
-agent: architect
-tools:
- - read
- - search
----
-Evaluate the provided architecture for delivery and runtime risk.
-
-Prioritize issues that could cause outages, data loss, severe operability pain, or major rework.
-Ignore stylistic preferences.
-
-Output exactly in this format:
-
-## High-Severity Risks
-
-List risks that can materially fail production or block safe delivery.
-
-For each risk:
-
-- impacted boundary (service, data, contract, deployment, observability, security)
-- why it is risky in one sentence
-- mitigation with smallest viable change
-- owner role
-
-## Medium Risks
-
-List important but non-blocking risks.
-
-## Tradeoff Notes
-
-List major tradeoffs and what is being optimized.
-
-## Missing Decisions
-
-List decisions that should become ADRs before implementation.
-
-## Recommended Sequence
-
-Provide an ordered mitigation sequence (step 1..N).
-
-## Security Considerations
-
-List security-specific risks not covered above: auth boundaries, sensitive data exposure, trust model assumptions, supply chain concerns.
-
-## Go/No-Go
-
-- go | conditional-go | no-go
-- one-sentence rationale
-
-
-
diff --git a/.github/prompts/ci-triage.prompt.md b/.github/prompts/ci-triage.prompt.md
deleted file mode 100644
index 7f7dcfb7..00000000
--- a/.github/prompts/ci-triage.prompt.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-description: 'Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path.'
-name: ci-triage
-argument-hint: '[workflow run, failing job, or log scope]'
-agent: engineer
-tools:
- - read
- - search
----
-Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path.
-
-Use failing job logs, workflow config, and changed files.
-
-Output exactly in this format:
-
-## Failure Clusters
-
-For each cluster:
-
-- jobs affected
-- probable root cause
-- confidence: HIGH | MEDIUM | LOW
-
-## Priority Fix Order
-
-Ordered by unblock value.
-
-- fix action
-- expected unblocked jobs
-- owner role
-
-## Risk Notes
-
-- risky quick fixes to avoid
-- possible hidden regressions
-
-## Recovery Checklist
-
-- [ ] apply highest-priority fix
-- [ ] rerun targeted jobs
-- [ ] rerun full workflow
-- [ ] confirm no new failures
-
-
-
diff --git a/.github/prompts/dependency-audit.prompt.md b/.github/prompts/dependency-audit.prompt.md
deleted file mode 100644
index 12efd04b..00000000
--- a/.github/prompts/dependency-audit.prompt.md
+++ /dev/null
@@ -1,62 +0,0 @@
----
-description: 'Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene.'
-name: dependency-audit
-argument-hint: '[dependency manifest, lockfile, or package scope]'
-agent: tester
-tools:
- - read
- - search
----
-Audit the provided dependency manifest or lockfile for vulnerabilities, outdated packages, licence risks, and supply chain hygiene.
-
-Prefer evidence from the manifest itself; flag items that need external verification.
-
-Output exactly in this format:
-
-## Vulnerabilities
-
-List dependencies with known CVEs or security advisories.
-
-For each item:
-
-- package name and version
-- CVE or advisory reference if known
-- severity: critical | high | medium | low
-- recommended action (upgrade, replace, or accept with rationale)
-
-## Outdated Packages
-
-List dependencies significantly behind latest stable releases where risk is meaningful.
-Do not list low-impact minor version differences.
-
-For each item:
-
-- package name: current version → latest stable
-- risk of staying on current version in one sentence
-
-## Licence Risks
-
-List licences that may conflict with the project's distribution model.
-
-For each item:
-
-- package name
-- licence identifier
-- conflict or concern in one sentence
-
-## Pinning and Version Policy
-
-- all direct dependencies pinned: yes | no | partial
-- unpinned transitive dependencies with risk: list or none
-- version ranges that allow breaking upgrades: list or none
-
-## Supply Chain Hygiene
-
-List packages with unusual provenance concerns: abandoned maintainers, single-maintainer projects, recent ownership transfers, or typosquatting risk.
-
-## Recommended Actions
-
-Ordered action list by priority (critical first).
-
-
-
diff --git a/.github/prompts/incident-timeline.prompt.md b/.github/prompts/incident-timeline.prompt.md
deleted file mode 100644
index dd11f432..00000000
--- a/.github/prompts/incident-timeline.prompt.md
+++ /dev/null
@@ -1,59 +0,0 @@
----
-description: 'Build a structured, evidence-based incident timeline and action-oriented postmortem summary.'
-name: incident-timeline
-argument-hint: '[logs, alerts, timeline notes, or incident ID]'
-agent: tester
-tools:
- - read
- - search
----
-Construct a blameless incident timeline from the provided evidence.
-
-Anchor claims to available logs, alerts, traces, and change events.
-If evidence is missing, explicitly mark uncertainty.
-
-Output exactly in this format:
-
-## Incident Snapshot
-
-- incident title
-- impact window
-- affected systems/users
-- current status
-
-## Timeline (UTC)
-
-List timestamped events in order.
-
-For each event:
-
-- time
-- event description
-- evidence source
-- confidence: high | medium | low
-
-## Root Cause Analysis
-
-- primary cause
-- contributing factors
-- what made detection/recovery slower
-
-## What Worked / What Failed
-
-Two short lists.
-
-## Corrective Actions
-
-For each action:
-
-- action description
-- owner role
-- priority: P0 | P1 | P2
-- due expectation (short horizon)
-
-## Prevention Check
-
-List the minimum controls needed to reduce repeat probability.
-
-
-
diff --git a/.github/prompts/migration-plan.prompt.md b/.github/prompts/migration-plan.prompt.md
deleted file mode 100644
index c15b7d69..00000000
--- a/.github/prompts/migration-plan.prompt.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-description: 'Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.'
-name: migration-plan
-argument-hint: '[migration scope or affected components]'
-agent: engineer
-tools:
- - read
- - search
----
-Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.
-
-Use source changes, schema/contracts, and deployment constraints.
-
-Output exactly in this format:
-
-## Migration Overview
-
-- scope
-- dependencies
-- compatibility strategy
-
-## Execution Plan
-
-For each phase:
-
-- phase
-- changes applied
-- validation checkpoint
-
-## Rollback Plan
-
-For each phase:
-
-- rollback trigger
-- rollback steps
-- data integrity check
-
-## Post-Migration Validation
-
-- required tests
-- smoke checks
-- success criteria
-
-
-
diff --git a/.github/prompts/migration-safety.prompt.md b/.github/prompts/migration-safety.prompt.md
deleted file mode 100644
index 9c89dc22..00000000
--- a/.github/prompts/migration-safety.prompt.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-description: 'Review database migration safety, rollback strategy, and zero-downtime risk.'
-name: migration-safety
-argument-hint: '[migration files, schema, or rollout plan]'
-agent: engineer
-tools:
- - read
- - search
- - edit
----
-Review the selected migration plan and code for production safety.
-
-Focus on forward compatibility, rollback feasibility, data integrity, and operational risk.
-Assume a live system with concurrent reads and writes.
-
-Output exactly in this format:
-
-## Must Fix Before Apply
-
-List migration blockers.
-
-For each item:
-
-- file/section
-- failure mode in one sentence
-- concrete safe fix
-
-## Should Fix Soon
-
-List non-blocking risks with meaningful impact.
-
-## Rollback Plan Check
-
-- rollback feasible: yes | no | partial
-- missing rollback prerequisites
-- specific rollback procedure recommendation
-
-## Zero-Downtime Check
-
-- compatible with old and new app versions: yes | no | partial
-- lock/contention risk: low | medium | high
-- required phased rollout steps
-
-## Test Gaps
-
-List missing migration tests (forward, backward, data invariants, load-sensitive paths).
-
-## Final Recommendation
-
-- apply now | apply after fixes
-- biggest remaining risk in one sentence
-
-
-
diff --git a/.github/prompts/ops-readiness.prompt.md b/.github/prompts/ops-readiness.prompt.md
deleted file mode 100644
index e82add80..00000000
--- a/.github/prompts/ops-readiness.prompt.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-description: 'Assess operational readiness across observability, runbooks, failure handling, and supportability.'
-name: ops-readiness
-argument-hint: '[service, component, or release scope]'
-agent: tester
-tools:
- - read
- - search
----
-Assess operational readiness across observability, runbooks, failure handling, and supportability.
-
-Use evidence from code, tests, docs, and runbooks.
-
-Output exactly in this format:
-
-## Ops Readiness Scorecard
-
-- observability: READY | PARTIAL | MISSING
-- alerting: READY | PARTIAL | MISSING
-- runbooks: READY | PARTIAL | MISSING
-- failure handling: READY | PARTIAL | MISSING
-
-## Gaps
-
-For each gap:
-
-- area
-- finding
-- risk if unresolved
-- owner role
-
-## Must-Fix Before Release
-
-- blocker
-- required evidence
-
-## Follow-up Actions
-
-- action
-- owner role
-- target milestone
-
-
-
diff --git a/.github/prompts/quick-review.prompt.md b/.github/prompts/quick-review.prompt.md
deleted file mode 100644
index 6c7997c7..00000000
--- a/.github/prompts/quick-review.prompt.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-description: 'Review a change for bugs, regressions, and missing tests.'
-name: quick-review
-argument-hint: '[scope or files to review]'
-agent: engineer
-tools:
- - read
- - search
- - edit
----
-Review the selected code or diff for production risk.
-
-Focus only on issues with real impact:
-
-- correctness and edge cases
-- security and data exposure
-- performance and scalability
-- maintainability and ownership boundaries
-- missing tests for changed behavior
-- API contract changes: breaking changes, schema drift, missing versioning
-
-Ignore:
-
-- style-only preferences with no runtime impact
-- speculative risks without evidence in this change
-
-Output exactly in this format:
-
-## Must fix
-
-List blocking issues that should be resolved before merge.
-
-## Should consider
-
-List non-blocking improvements worth addressing now.
-
-## Looks good
-
-List intentional strengths in this change.
-
-For each item:
-
-- cite the relevant file/section
-- explain why it matters in one short sentence
-- give one concrete fix suggestion
-
-End with:
-
-- Merge recommendation: yes / no / yes-with-conditions
-- Biggest remaining risk: one sentence
-
-
-
diff --git a/.github/prompts/release-check.prompt.md b/.github/prompts/release-check.prompt.md
deleted file mode 100644
index 5fe0239d..00000000
--- a/.github/prompts/release-check.prompt.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-description: 'Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.'
-name: release-check
-argument-hint: '[release scope or target branch]'
-agent: release
-tools:
- - read
- - search
----
-Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.
-
-Use repository evidence only.
-
-Output exactly in this format:
-
-## Release Gate Status
-
-- overall status: READY | NOT-READY
-- scope reviewed
-- evidence sources checked
-
-## Missing or Stale Evidence
-
-For each item:
-
-- artifact
-- issue: MISSING | STALE | INCOMPLETE
-- impact
-- owner role
-
-## Sign-off Gaps
-
-For each required role:
-
-- role
-- verdict: OK | NOK | NOT-RECORDED
-- blocking reason
-
-## Release Actions
-
-Ordered actions to reach READY.
-
-- action
-- owner role
-- verification step
-
-
-
diff --git a/.github/prompts/repo-assessment.prompt.md b/.github/prompts/repo-assessment.prompt.md
deleted file mode 100644
index a7fab703..00000000
--- a/.github/prompts/repo-assessment.prompt.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-description: 'Assess a repository for production-readiness gaps and prioritized improvements.'
-name: repo-assessment
-argument-hint: '[repository scope or component path]'
-agent: engineer
-tools:
- - read
- - search
----
-Assess this repository for production-readiness gaps and prioritized improvements.
-
-Base findings on evidence in source files, tests, CI config, docs, and manifests.
-Prefer concrete findings over speculation.
-
-Output exactly in this format:
-
-## Critical Risks
-
-List only issues that block safe production operation right now.
-
-For each item:
-
-- location: file or component reference
-- risk: one sentence describing the production impact
-- remediation: concrete action with owner role
-
-## High-ROI Improvements
-
-List high-value improvements that reduce operational risk or developer friction, ranked by impact versus effort.
-
-For each item:
-
-- area: the domain (security | reliability | observability | dx | performance | maintainability)
-- finding: what is missing or suboptimal
-- suggested action: one clear improvement step
-
-## Testing and Verification Gaps
-
-List untested behavioral paths or areas where coverage may give false confidence.
-
-For each item:
-
-- uncovered behavior: what scenario is missing
-- risk if untested: what could go wrong in production
-- suggested test type: unit | integration | contract | e2e
-
-## Suggested Next Sprint Backlog
-
-Provide a short, actionable next-sprint task list ordered from highest to lowest priority.
-
-- task title
-- owner role (product | architect | designer | engineer | tester | release)
-- one-line rationale
-
-
-
diff --git a/.github/prompts/template-impact.prompt.md b/.github/prompts/template-impact.prompt.md
deleted file mode 100644
index fdd044b0..00000000
--- a/.github/prompts/template-impact.prompt.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-description: 'Assess impact of a template change on generated artifacts, tests, and release risk.'
-name: template-impact
-argument-hint: '[template path or change scope]'
-agent: engineer
-tools:
- - read
- - search
----
-Assess impact of a template change on generated artifacts, tests, and release risk.
-
-Use source-template and generated-artifact evidence.
-
-Output exactly in this format:
-
-## Change Surface
-
-- template scope
-- affected artifact types
-- likely generated paths
-
-## Impact Findings
-
-For each finding:
-
-- impacted path
-- impact type: BEHAVIOR | DOCS | TESTS | TOOLING
-- risk
-- required validation
-
-## Regression Risk
-
-List highest-risk regressions first.
-
-- scenario
-- likelihood: HIGH | MEDIUM | LOW
-- mitigation
-
-## Verification Plan
-
-- commands to run
-- expected pass criteria
-
-
-
diff --git a/.github/prompts/test-gaps.prompt.md b/.github/prompts/test-gaps.prompt.md
deleted file mode 100644
index 8b195180..00000000
--- a/.github/prompts/test-gaps.prompt.md
+++ /dev/null
@@ -1,42 +0,0 @@
----
-description: 'Identify missing behavioral coverage and prioritize test additions by production risk.'
-name: test-gaps
-argument-hint: '[component, feature, or repository scope]'
-agent: tester
-tools:
- - read
- - search
----
-Identify missing behavioral coverage and prioritize test additions by production risk.
-
-Focus on observable behavior and realistic failure paths.
-
-Output exactly in this format:
-
-## Coverage Gaps
-
-For each gap:
-
-- behavior
-- current coverage weakness
-- production risk
-- suggested test type: unit | integration | contract | e2e
-
-## False Confidence Risks
-
-List tests that pass but may not protect real behavior.
-
-- location
-- why confidence is false
-- correction
-
-## Priority Test Backlog
-
-Ordered from highest to lowest risk reduction.
-
-- test title
-- owner role
-- acceptance check
-
-
-
diff --git a/.github/prompts/upgrade-plan.prompt.md b/.github/prompts/upgrade-plan.prompt.md
deleted file mode 100644
index a0566d8c..00000000
--- a/.github/prompts/upgrade-plan.prompt.md
+++ /dev/null
@@ -1,45 +0,0 @@
----
-description: 'Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.'
-name: upgrade-plan
-argument-hint: '[target version, component, or full repo]'
-agent: tester
-tools:
- - read
- - search
----
-Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.
-
-Use repository docs, manifests, and test constraints.
-
-Output exactly in this format:
-
-## Upgrade Scope
-
-- target
-- baseline version
-- compatibility boundaries
-
-## Step Plan
-
-Ordered upgrade steps.
-
-- step
-- dependency/precondition
-- success check
-
-## Risk and Rollback
-
-For each major step:
-
-- risk
-- trigger to rollback
-- rollback action
-
-## Verification Matrix
-
-- check
-- command
-- pass criteria
-
-
-
diff --git a/.github/prompts/workflow-check.prompt.md b/.github/prompts/workflow-check.prompt.md
deleted file mode 100644
index f0c8fa22..00000000
--- a/.github/prompts/workflow-check.prompt.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-description: 'Review workflow stage flow, gate usage, and handoff integrity across role artifacts.'
-name: workflow-check
-argument-hint: '[workflow scope or stage list]'
-agent: planner
-tools:
- - read
- - search
----
-Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
-
-Focus on evidence in workflow config, role templates, and docs.
-
-Output exactly in this format:
-
-## Flow Summary
-
-- workflow scope
-- current stage order
-- gate model used
-
-## Gate and Handoff Findings
-
-For each finding:
-
-- location: file path and section
-- issue: one sentence
-- impact: what can fail in execution
-- fix: concrete correction
-
-## Blocking Risks
-
-List only issues that block reliable workflow execution.
-
-- blocker
-- owner role
-- required action
-
-## Recommended Next Steps
-
-Provide an ordered short list of actions.
-
-- action
-- owner role
-- expected result
-
-
-
diff --git a/.github/skills/adr/SKILL.md b/.github/skills/adr/SKILL.md
index ffcffa3b..194f4718 100644
--- a/.github/skills/adr/SKILL.md
+++ b/.github/skills/adr/SKILL.md
@@ -180,4 +180,4 @@ is a kebab-case title.
After writing, state the file path and summary so the architect or product role can review.
-
+
diff --git a/.github/skills/advise/SKILL.md b/.github/skills/advise/SKILL.md
index d76d9ad2..58045ced 100644
--- a/.github/skills/advise/SKILL.md
+++ b/.github/skills/advise/SKILL.md
@@ -83,7 +83,7 @@ Always consider:
---
-**Related:** See `prompt/reasoning` for the underlying reasoning framework.
+**Related:** See `skill/reasoning` for the underlying reasoning framework.
-
+
diff --git a/.github/skills/analyse/SKILL.md b/.github/skills/analyse/SKILL.md
index 76009629..323f1f77 100644
--- a/.github/skills/analyse/SKILL.md
+++ b/.github/skills/analyse/SKILL.md
@@ -214,4 +214,4 @@ State conclusions with confidence level:
```
-
+
diff --git a/.github/skills/architecture/SKILL.md b/.github/skills/architecture/SKILL.md
index 7ee7b520..54300fe7 100644
--- a/.github/skills/architecture/SKILL.md
+++ b/.github/skills/architecture/SKILL.md
@@ -278,4 +278,4 @@ For each significant structural decision made during this review (technology cho
- Update `docs/architecture/overview.md` to reflect the final decisions.
-
+
diff --git a/.github/prompts/artifact-integrity.prompt.md b/.github/skills/artifact-integrity/SKILL.md
similarity index 61%
rename from .github/prompts/artifact-integrity.prompt.md
rename to .github/skills/artifact-integrity/SKILL.md
index b8fe1e53..4456d206 100644
--- a/.github/prompts/artifact-integrity.prompt.md
+++ b/.github/skills/artifact-integrity/SKILL.md
@@ -1,13 +1,37 @@
---
-description: 'Check source templates against generated artifacts and identify drift or missing regeneration.'
name: artifact-integrity
+description: 'Check source templates against generated artifacts and identify drift or missing regeneration.'
+allowed-tools: 'read search'
argument-hint: '[artifact type, path, or full repo]'
-agent: tester
-tools:
- - read
- - search
+user-invocable: true
+disable-model-invocation: true
---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
+# artifact-integrity - Generated Artifact Audit
+
Check source templates against generated artifacts and identify drift.
+Report only; do not regenerate, edit, or delete files.
Compare `src/vstack/_templates/` sources with installed artifacts in `.github/`
and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps.
@@ -55,4 +79,4 @@ Provide a checklist to confirm the repository is clean after regeneration.
- [ ] All regenerated files match their source checksums in `.vstack/vstack.json`
-
+
diff --git a/.github/skills/ask/SKILL.md b/.github/skills/ask/SKILL.md
index 0be3d25b..0d1971dc 100644
--- a/.github/skills/ask/SKILL.md
+++ b/.github/skills/ask/SKILL.md
@@ -124,4 +124,4 @@ Use this format:
- If it requires risk/impact comparison, hand off to `analyse`.
-
+
diff --git a/.github/skills/aws-cli/SKILL.md b/.github/skills/aws-cli/SKILL.md
index bf76e9e7..42bcf222 100644
--- a/.github/skills/aws-cli/SKILL.md
+++ b/.github/skills/aws-cli/SKILL.md
@@ -374,4 +374,4 @@ aws ce get-cost-and-usage \
- [AWS CLI named profiles](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)
-
+
diff --git a/.github/skills/changedoc/SKILL.md b/.github/skills/changedoc/SKILL.md
index 9811c2ea..861ad169 100644
--- a/.github/skills/changedoc/SKILL.md
+++ b/.github/skills/changedoc/SKILL.md
@@ -142,4 +142,4 @@ Escalate before implementation when:
- required stakeholders have not approved transition to `BUILD`
-
+
diff --git a/.github/skills/cicd/SKILL.md b/.github/skills/cicd/SKILL.md
index fe6d466b..5f64356a 100644
--- a/.github/skills/cicd/SKILL.md
+++ b/.github/skills/cicd/SKILL.md
@@ -221,4 +221,4 @@ Configure these in GitHub → Settings → Branches.
- [GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners)
-
+
diff --git a/.github/skills/cloudformation/SKILL.md b/.github/skills/cloudformation/SKILL.md
index 3d1b026e..47efafa3 100644
--- a/.github/skills/cloudformation/SKILL.md
+++ b/.github/skills/cloudformation/SKILL.md
@@ -344,4 +344,4 @@ AppSecurityGroup:
- [AWS SAM documentation](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/)
-
+
diff --git a/.github/skills/code-review/SKILL.md b/.github/skills/code-review/SKILL.md
index 045e1154..e5235183 100644
--- a/.github/skills/code-review/SKILL.md
+++ b/.github/skills/code-review/SKILL.md
@@ -218,4 +218,4 @@ Confidence: [HIGH/MEDIUM/LOW — explain if not HIGH]
```
-
+
diff --git a/.github/skills/codeql/SKILL.md b/.github/skills/codeql/SKILL.md
index 7faacb14..883eb4d5 100644
--- a/.github/skills/codeql/SKILL.md
+++ b/.github/skills/codeql/SKILL.md
@@ -251,4 +251,4 @@ GITHUB_TOKEN= codeql github upload-results \
- [Supported languages and frameworks](https://docs.github.com/en/code-security/code-scanning/introduction-to-code-scanning/codeql-code-scanning-for-compiled-languages)
-
+
diff --git a/.github/skills/concise/SKILL.md b/.github/skills/concise/SKILL.md
index 6c439267..c7c3eb06 100644
--- a/.github/skills/concise/SKILL.md
+++ b/.github/skills/concise/SKILL.md
@@ -147,4 +147,4 @@ Current mode unchanged:
- [ ] User confirmation/status returned in deterministic format
-
+
diff --git a/.github/skills/consult/SKILL.md b/.github/skills/consult/SKILL.md
index f2c7a420..a00a8e09 100644
--- a/.github/skills/consult/SKILL.md
+++ b/.github/skills/consult/SKILL.md
@@ -218,4 +218,4 @@ reason: [one sentence]
```
-
+
diff --git a/.github/skills/container/SKILL.md b/.github/skills/container/SKILL.md
index 8585679b..84c2f035 100644
--- a/.github/skills/container/SKILL.md
+++ b/.github/skills/container/SKILL.md
@@ -153,4 +153,4 @@ For production-like local testing, write a separate `docker-compose.prod.yml` wi
- [Docker official images](https://hub.docker.com/search?image_filter=official)
-
+
diff --git a/.github/skills/conventional-commit/SKILL.md b/.github/skills/conventional-commit/SKILL.md
index 0c856e8f..00fed9f6 100644
--- a/.github/skills/conventional-commit/SKILL.md
+++ b/.github/skills/conventional-commit/SKILL.md
@@ -155,4 +155,4 @@ Remaining changes:
If commit is blocked, report exact reason and proposed fix.
-
+
diff --git a/.github/skills/copilot-ops/SKILL.md b/.github/skills/copilot-ops/SKILL.md
index 956b8512..1c5a881d 100644
--- a/.github/skills/copilot-ops/SKILL.md
+++ b/.github/skills/copilot-ops/SKILL.md
@@ -87,4 +87,4 @@ Provide this structure:
Escalate when permissions are insufficient, settings conflict across scopes, or policy intent is ambiguous.
-
+
diff --git a/.github/skills/debug/SKILL.md b/.github/skills/debug/SKILL.md
index 6b50ec4c..b71e773d 100644
--- a/.github/skills/debug/SKILL.md
+++ b/.github/skills/debug/SKILL.md
@@ -258,4 +258,4 @@ Prevention: [any follow-up items]
```
-
+
diff --git a/.github/skills/dependabot/SKILL.md b/.github/skills/dependabot/SKILL.md
index 9b8dfcfa..f235f21a 100644
--- a/.github/skills/dependabot/SKILL.md
+++ b/.github/skills/dependabot/SKILL.md
@@ -320,4 +320,4 @@ updates:
- [Dependabot security updates](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates)
-
+
diff --git a/.github/skills/dependency/SKILL.md b/.github/skills/dependency/SKILL.md
index 58606a84..5ffc887c 100644
--- a/.github/skills/dependency/SKILL.md
+++ b/.github/skills/dependency/SKILL.md
@@ -318,4 +318,4 @@ Action items (priority order):
- [PyPI / npm / crates.io / Maven Central](https://pypi.org) (replace with the relevant registry)
-
+
diff --git a/.github/skills/design/SKILL.md b/.github/skills/design/SKILL.md
index 5684aa47..6e172371 100644
--- a/.github/skills/design/SKILL.md
+++ b/.github/skills/design/SKILL.md
@@ -243,4 +243,4 @@ Output a complete design document to `docs/design/overview.md` or `openapi.yaml`
```
-
+
diff --git a/.github/skills/docs/SKILL.md b/.github/skills/docs/SKILL.md
index 855299a2..e04bd4bb 100644
--- a/.github/skills/docs/SKILL.md
+++ b/.github/skills/docs/SKILL.md
@@ -151,4 +151,4 @@ Skipped (n/a):
```
-
+
diff --git a/.github/skills/explore/SKILL.md b/.github/skills/explore/SKILL.md
index 5398f9b8..05c65005 100644
--- a/.github/skills/explore/SKILL.md
+++ b/.github/skills/explore/SKILL.md
@@ -149,4 +149,4 @@ For `thorough` mode, append:
- main risk hotspots (coupling, missing tests, unclear ownership)
-
+
diff --git a/.github/skills/gdpr/SKILL.md b/.github/skills/gdpr/SKILL.md
index 285adadf..55c306a8 100644
--- a/.github/skills/gdpr/SKILL.md
+++ b/.github/skills/gdpr/SKILL.md
@@ -246,4 +246,4 @@ Use `@example.com` for all test email addresses.
- [EDPB guidelines](https://www.edpb.europa.eu/our-work-tools/general-guidance/guidelines-recommendations-best-practices_en)
-
+
diff --git a/.github/skills/gh-issues/SKILL.md b/.github/skills/gh-issues/SKILL.md
index 7fa6d094..e6006afe 100644
--- a/.github/skills/gh-issues/SKILL.md
+++ b/.github/skills/gh-issues/SKILL.md
@@ -230,4 +230,4 @@ https://github.com///issues/
- [GitHub Issues documentation](https://docs.github.com/en/issues)
-
+
diff --git a/.github/skills/gh-release/SKILL.md b/.github/skills/gh-release/SKILL.md
index 2ef5510d..ec01fe60 100644
--- a/.github/skills/gh-release/SKILL.md
+++ b/.github/skills/gh-release/SKILL.md
@@ -214,4 +214,4 @@ If blocked, report exact blocker and required user action.
- [GitHub Releases documentation](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases)
-
+
diff --git a/.github/skills/guardrails/SKILL.md b/.github/skills/guardrails/SKILL.md
index 930eb036..9edbb88a 100644
--- a/.github/skills/guardrails/SKILL.md
+++ b/.github/skills/guardrails/SKILL.md
@@ -72,4 +72,4 @@ Activate careful mode for this session. Two behaviors are now enabled.
Explicitly ask to "disable guardrails".
-
+
diff --git a/.github/skills/helm/SKILL.md b/.github/skills/helm/SKILL.md
index d547c78d..ddf6404c 100644
--- a/.github/skills/helm/SKILL.md
+++ b/.github/skills/helm/SKILL.md
@@ -140,4 +140,4 @@ Practices:
- [Chart best practices](https://helm.sh/docs/chart_best_practices/)
-
+
diff --git a/.github/skills/incident/SKILL.md b/.github/skills/incident/SKILL.md
index 293543c2..a31b35dd 100644
--- a/.github/skills/incident/SKILL.md
+++ b/.github/skills/incident/SKILL.md
@@ -251,4 +251,4 @@ Next: invoke @#rca and @#postmortem to produce written artifacts.
```
-
+
diff --git a/.github/skills/inspect/SKILL.md b/.github/skills/inspect/SKILL.md
index 00142882..b4aa2412 100644
--- a/.github/skills/inspect/SKILL.md
+++ b/.github/skills/inspect/SKILL.md
@@ -155,4 +155,4 @@ Confirm for changed paths:
```
-
+
diff --git a/.github/skills/k8s/SKILL.md b/.github/skills/k8s/SKILL.md
index a6ef501e..eb87c042 100644
--- a/.github/skills/k8s/SKILL.md
+++ b/.github/skills/k8s/SKILL.md
@@ -144,4 +144,4 @@ Common failure classes:
- [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/)
-
+
diff --git a/.github/skills/lazy/SKILL.md b/.github/skills/lazy/SKILL.md
index 22770985..192fe65e 100644
--- a/.github/skills/lazy/SKILL.md
+++ b/.github/skills/lazy/SKILL.md
@@ -160,4 +160,4 @@ Stop and escalate when:
- The task is under-specified and any minimal patch would be guesswork.
-
+
diff --git a/.github/skills/migrate/SKILL.md b/.github/skills/migrate/SKILL.md
index dfe93eff..6fa831c7 100644
--- a/.github/skills/migrate/SKILL.md
+++ b/.github/skills/migrate/SKILL.md
@@ -320,4 +320,4 @@ Pre-deploy checklist:
```
-
+
diff --git a/.github/skills/migration-plan/SKILL.md b/.github/skills/migration-plan/SKILL.md
new file mode 100644
index 00000000..7f8762c3
--- /dev/null
+++ b/.github/skills/migration-plan/SKILL.md
@@ -0,0 +1,69 @@
+---
+name: migration-plan
+description: 'Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.'
+allowed-tools: 'read search'
+argument-hint: '[migration scope or affected components]'
+user-invocable: true
+disable-model-invocation: true
+---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
+# migration-plan - Cross-Component Migration Planning
+
+Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.
+Plan only; do not apply migrations or change files.
+
+Use source changes, schema/contracts, and deployment constraints.
+
+Output exactly in this format:
+
+## Migration Overview
+
+- scope
+- dependencies
+- compatibility strategy
+
+## Execution Plan
+
+For each phase:
+
+- phase
+- changes applied
+- validation checkpoint
+
+## Rollback Plan
+
+For each phase:
+
+- rollback trigger
+- rollback steps
+- data integrity check
+
+## Post-Migration Validation
+
+- required tests
+- smoke checks
+- success criteria
+
+
+
diff --git a/.github/skills/onboard/SKILL.md b/.github/skills/onboard/SKILL.md
index 5d34f4cf..e50bb7d8 100644
--- a/.github/skills/onboard/SKILL.md
+++ b/.github/skills/onboard/SKILL.md
@@ -302,4 +302,4 @@ Gaps remaining (if any):
```
-
+
diff --git a/.github/skills/openapi/SKILL.md b/.github/skills/openapi/SKILL.md
index ebfbd7a4..c3d6e119 100644
--- a/.github/skills/openapi/SKILL.md
+++ b/.github/skills/openapi/SKILL.md
@@ -403,4 +403,4 @@ Summary: [N critical, N warnings, N info]
- [Redocly CLI (linting)](https://redocly.com/docs/cli/)
-
+
diff --git a/.github/skills/performance/SKILL.md b/.github/skills/performance/SKILL.md
index ddcd1db0..3bb3d03d 100644
--- a/.github/skills/performance/SKILL.md
+++ b/.github/skills/performance/SKILL.md
@@ -242,4 +242,4 @@ For each bottleneck identified:
```
-
+
diff --git a/.github/skills/postmortem/SKILL.md b/.github/skills/postmortem/SKILL.md
index a8d018f3..15d38b50 100644
--- a/.github/skills/postmortem/SKILL.md
+++ b/.github/skills/postmortem/SKILL.md
@@ -184,4 +184,4 @@ Status: Draft — ready for team review
```
-
+
diff --git a/.github/skills/pr/SKILL.md b/.github/skills/pr/SKILL.md
index 4372fe98..cb594b51 100644
--- a/.github/skills/pr/SKILL.md
+++ b/.github/skills/pr/SKILL.md
@@ -151,4 +151,4 @@ Next steps depend on the repository CI/CD configuration:
```
-
+
diff --git a/.github/skills/rancher/SKILL.md b/.github/skills/rancher/SKILL.md
index e4c59340..7ecef1c5 100644
--- a/.github/skills/rancher/SKILL.md
+++ b/.github/skills/rancher/SKILL.md
@@ -113,4 +113,4 @@ Checks:
- [Fleet documentation](https://fleet.rancher.io/)
-
+
diff --git a/.github/skills/rca/SKILL.md b/.github/skills/rca/SKILL.md
index b01b4000..98f8ecd7 100644
--- a/.github/skills/rca/SKILL.md
+++ b/.github/skills/rca/SKILL.md
@@ -207,4 +207,4 @@ Status: Draft — ready for review
```
-
+
diff --git a/.github/prompts/reasoning.prompt.md b/.github/skills/reasoning/SKILL.md
similarity index 68%
rename from .github/prompts/reasoning.prompt.md
rename to .github/skills/reasoning/SKILL.md
index cfd42735..5e43075e 100644
--- a/.github/prompts/reasoning.prompt.md
+++ b/.github/skills/reasoning/SKILL.md
@@ -1,12 +1,36 @@
---
-description: 'Evidence-based reasoning framework for one-shot evaluation tasks.
-Use when you need to apply critical thinking to a specific decision, proposal, or evaluation.
-'
name: reasoning
+description: 'Evidence-based reasoning framework for one-shot evaluation tasks. Use when you need to apply critical thinking to a specific decision, proposal, or evaluation.'
+allowed-tools: 'read search'
+argument-hint: '[decision, proposal, or evaluation]'
+user-invocable: true
+disable-model-invocation: true
---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
# Evidence-Based Reasoning Framework
-Use this prompt when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation.
+Use this skill when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation.
## Core Mindset
@@ -91,4 +115,4 @@ Always ask internally:
**Related:** See `skill/advise` for structured adversarial review workflows.
-
+
diff --git a/.github/skills/refactor/SKILL.md b/.github/skills/refactor/SKILL.md
index e4fecc45..5be78f29 100644
--- a/.github/skills/refactor/SKILL.md
+++ b/.github/skills/refactor/SKILL.md
@@ -375,4 +375,4 @@ Behavior changed: No
```
-
+
diff --git a/.github/skills/release-check/SKILL.md b/.github/skills/release-check/SKILL.md
new file mode 100644
index 00000000..c96a6ab6
--- /dev/null
+++ b/.github/skills/release-check/SKILL.md
@@ -0,0 +1,72 @@
+---
+name: release-check
+description: 'Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.'
+allowed-tools: 'read search'
+argument-hint: '[release scope or target branch]'
+user-invocable: true
+disable-model-invocation: true
+---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
+# release-check - Release Evidence Audit
+
+Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.
+Report only; do not create a release, tag, pull request, or sign-off.
+
+Use repository evidence only.
+
+Output exactly in this format:
+
+## Release Gate Status
+
+- overall status: READY | NOT-READY
+- scope reviewed
+- evidence sources checked
+
+## Missing or Stale Evidence
+
+For each item:
+
+- artifact
+- issue: MISSING | STALE | INCOMPLETE
+- impact
+- owner role
+
+## Sign-off Gaps
+
+For each required role:
+
+- role
+- verdict: OK | NOK | NOT-RECORDED
+- blocking reason
+
+## Release Actions
+
+Ordered actions to reach READY.
+
+- action
+- owner role
+- verification step
+
+
+
diff --git a/.github/skills/release-notes/SKILL.md b/.github/skills/release-notes/SKILL.md
index dc3e5157..6853b2af 100644
--- a/.github/skills/release-notes/SKILL.md
+++ b/.github/skills/release-notes/SKILL.md
@@ -147,4 +147,4 @@ Prepend a new entry at the top of `CHANGELOG.md`:
Keep existing entries intact.
-
+
diff --git a/.github/skills/requirements/SKILL.md b/.github/skills/requirements/SKILL.md
index 83cee491..777a8fa8 100644
--- a/.github/skills/requirements/SKILL.md
+++ b/.github/skills/requirements/SKILL.md
@@ -199,4 +199,4 @@ Write all findings to `docs/product/requirements.md`:
After writing, summarize what was decided so the architect role can start.
-
+
diff --git a/.github/skills/secret-scan/SKILL.md b/.github/skills/secret-scan/SKILL.md
index 0b5bc6af..997e519b 100644
--- a/.github/skills/secret-scan/SKILL.md
+++ b/.github/skills/secret-scan/SKILL.md
@@ -240,4 +240,4 @@ credential formats.
- [Supported secret patterns](https://docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns)
-
+
diff --git a/.github/skills/security/SKILL.md b/.github/skills/security/SKILL.md
index dd9e1c0d..a2d5c120 100644
--- a/.github/skills/security/SKILL.md
+++ b/.github/skills/security/SKILL.md
@@ -295,4 +295,4 @@ Scope: [full/diff/dependency/config]
- [STRIDE threat modeling (Microsoft)](https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats)
-
+
diff --git a/.github/skills/simplify/SKILL.md b/.github/skills/simplify/SKILL.md
index c2b9c133..7254d206 100644
--- a/.github/skills/simplify/SKILL.md
+++ b/.github/skills/simplify/SKILL.md
@@ -155,4 +155,4 @@ Escalate instead of over-simplifying when:
- Required outcomes are underspecified.
-
+
diff --git a/.github/skills/space-setup/SKILL.md b/.github/skills/space-setup/SKILL.md
index 3fb527b3..4105521b 100644
--- a/.github/skills/space-setup/SKILL.md
+++ b/.github/skills/space-setup/SKILL.md
@@ -87,4 +87,4 @@ Provide this structure:
Escalate when required docs are missing, stale, or inconsistent across product/architecture/design baselines.
-
+
diff --git a/.github/skills/terraform/SKILL.md b/.github/skills/terraform/SKILL.md
index 12ac7218..0d04b3cb 100644
--- a/.github/skills/terraform/SKILL.md
+++ b/.github/skills/terraform/SKILL.md
@@ -335,4 +335,4 @@ Run `terraform plan` after every state operation to verify the outcome.
- [tfsec rules](https://aquasecurity.github.io/tfsec/latest/checks/aws/) · [checkov checks](https://www.checkov.io/5.Policy%20Index/terraform.html)
-
+
diff --git a/.github/skills/terragrunt/SKILL.md b/.github/skills/terragrunt/SKILL.md
index 687d7f79..d38ee8f6 100644
--- a/.github/skills/terragrunt/SKILL.md
+++ b/.github/skills/terragrunt/SKILL.md
@@ -307,4 +307,4 @@ Use `--terragrunt-non-interactive` in CI to prevent hanging on prompts.
- [Gruntwork module registry](https://www.gruntwork.io/)
-
+
diff --git a/.github/skills/threat-model/SKILL.md b/.github/skills/threat-model/SKILL.md
index 4785498d..23405618 100644
--- a/.github/skills/threat-model/SKILL.md
+++ b/.github/skills/threat-model/SKILL.md
@@ -245,4 +245,4 @@ For each high-priority threat include:
- Final report is written to `docs/architecture/threat-model.md`.
-
+
diff --git a/.github/skills/upgrade-plan/SKILL.md b/.github/skills/upgrade-plan/SKILL.md
new file mode 100644
index 00000000..e1b6d200
--- /dev/null
+++ b/.github/skills/upgrade-plan/SKILL.md
@@ -0,0 +1,69 @@
+---
+name: upgrade-plan
+description: 'Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.'
+allowed-tools: 'read search'
+argument-hint: '[target version, component, or full repo]'
+user-invocable: true
+disable-model-invocation: true
+---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
+# upgrade-plan - Upgrade Planning
+
+Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.
+Plan only; do not install packages, apply upgrades, or change files.
+
+Use repository docs, manifests, and test constraints.
+
+Output exactly in this format:
+
+## Upgrade Scope
+
+- target
+- baseline version
+- compatibility boundaries
+
+## Step Plan
+
+Ordered upgrade steps.
+
+- step
+- dependency/precondition
+- success check
+
+## Risk and Rollback
+
+For each major step:
+
+- risk
+- trigger to rollback
+- rollback action
+
+## Verification Matrix
+
+- check
+- command
+- pass criteria
+
+
+
diff --git a/.github/skills/verify/SKILL.md b/.github/skills/verify/SKILL.md
index a58be95f..527f438b 100644
--- a/.github/skills/verify/SKILL.md
+++ b/.github/skills/verify/SKILL.md
@@ -266,4 +266,4 @@ scope: [path/component/full]
```
-
+
diff --git a/.github/skills/vision/SKILL.md b/.github/skills/vision/SKILL.md
index c5c1f2d7..8f6b47de 100644
--- a/.github/skills/vision/SKILL.md
+++ b/.github/skills/vision/SKILL.md
@@ -206,4 +206,4 @@ For each finding: explain the tradeoff, give an opinionated recommendation, ask
Present as: "Overall assessment: [READY/NEEDS REVISION/SCOPE CHANGE] because [1-2 sentence reason]."
-
+
diff --git a/.github/skills/workflow-check/SKILL.md b/.github/skills/workflow-check/SKILL.md
new file mode 100644
index 00000000..8ba71c13
--- /dev/null
+++ b/.github/skills/workflow-check/SKILL.md
@@ -0,0 +1,72 @@
+---
+name: workflow-check
+description: 'Review workflow stage flow, gate usage, and handoff integrity across role artifacts.'
+allowed-tools: 'read search'
+argument-hint: '[workflow scope or stage list]'
+user-invocable: true
+disable-model-invocation: true
+---
+## Skill Context
+
+This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+
+### AskUserQuestion Format
+
+When you need clarification, use this exact format — never invent or guess:
+
+> **Question:** [The specific question]
+> **Options:** A) … | B) … | C) …
+> **Default if no response:** [What you'll do]
+
+Never ask more than one question at a time without waiting for the answer.
+
+### Diagram Convention
+
+When producing hand-authored Markdown outputs, prefer Mermaid for flow,
+interaction, lifecycle, state, topology, dependency, and decision diagrams when
+the format is supported and improves clarity. Use ASCII as a fallback when
+Mermaid is unsupported or would be less readable. Keep ASCII/text trees for
+directory structures and other scan-friendly hierarchies.
+
+# workflow-check - Workflow Contract Audit
+
+Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
+Report only; do not change workflow configuration or role artifacts.
+
+Focus on evidence in workflow config, role templates, and docs.
+
+Output exactly in this format:
+
+## Flow Summary
+
+- workflow scope
+- current stage order
+- gate model used
+
+## Gate and Handoff Findings
+
+For each finding:
+
+- location: file path and section
+- issue: one sentence
+- impact: what can fail in execution
+- fix: concrete correction
+
+## Blocking Risks
+
+List only issues that block reliable workflow execution.
+
+- blocker
+- owner role
+- required action
+
+## Recommended Next Steps
+
+Provide an ordered short list of actions.
+
+- action
+- owner role
+- expected result
+
+
+
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a31a4568..9d5339b8 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -29,7 +29,7 @@ repos:
additional_dependencies:
- mdformat-gfm
files: \.(md)$
- exclude: ^(\.github/|tests/_fixtures/golden/|src/vstack/_templates/(prompts/reasoning/template\.md|skills/advise/template\.md)$)
+ exclude: ^(\.github/|tests/_fixtures/golden/|src/vstack/_templates/skills/(reasoning|advise)/template\.md$)
- repo: https://github.com/DavidAnson/markdownlint-cli2
rev: v0.22.1
diff --git a/.vstack/vstack.json b/.vstack/vstack.json
index 925c701c..9de3953e 100644
--- a/.vstack/vstack.json
+++ b/.vstack/vstack.json
@@ -1,365 +1,407 @@
{
"manifest_version": 2,
"hash_algorithm": "sha256",
- "vstack_version": "3.6.0",
- "installed_at": "2026-06-27T13:12:59.787877+00:00",
+ "vstack_version": "3.7.4",
+ "installed_at": "2026-10-17T13:27:19.161778+00:00",
"artifacts": {
"skills": [
{
"name": "adr",
"file": "skills/adr/SKILL.md",
"version": "20260421003",
- "checksum": "b6d6c1774467f339cce476f009b130e267d5fdbf217243bfc45b939ee11e9abe",
+ "checksum": "c219707f91680f94b72c628918beefc0ee4e4f053ef9baf9b358d87436a5b1a0",
"checksum_algorithm": "sha256"
},
{
"name": "advise",
"file": "skills/advise/SKILL.md",
- "version": "20260626001",
- "checksum": "4d2ca25d75d54d61600c192ee81674144c8dc6d14a49182798f1ae27bd83acef",
+ "version": "20261017001",
+ "checksum": "9d729523408f01317f96db07e7629987df0b6ba162bc9986ff188b27912fed60",
"checksum_algorithm": "sha256"
},
{
"name": "analyse",
"file": "skills/analyse/SKILL.md",
"version": "20260421004",
- "checksum": "4071c106b0842b3cd1fc674cb8e144c5598ec046feb85fcb204acca7cac654e3",
+ "checksum": "750cabc0fa079b038aa2b8ee1bcb64480701b07d763d2ffd3ac02ea8431ad77f",
"checksum_algorithm": "sha256"
},
{
"name": "architecture",
"file": "skills/architecture/SKILL.md",
"version": "20260421005",
- "checksum": "c30e38796267ad9e522f9ddbac0cd357c049383314c5bb89a75ffd9ea2859e20",
+ "checksum": "ae2bd8daa791fdec2a93253af696f39f59fa308e3b18569d030bed041d915cbc",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "artifact-integrity",
+ "file": "skills/artifact-integrity/SKILL.md",
+ "version": "20261017001",
+ "checksum": "7207f7bf7fb65c00720a726d8da48f56fe8b083dbac11b7f8854dff74c1a6f76",
"checksum_algorithm": "sha256"
},
{
"name": "ask",
"file": "skills/ask/SKILL.md",
"version": "20260618001",
- "checksum": "2c3311eea1529295c6c4159082c75b4bb859deb8356b63206b83bc8566b349c3",
+ "checksum": "19dba0952871993ea8a4a6bb7b8009b097912540664632741fae72bed150d940",
"checksum_algorithm": "sha256"
},
{
"name": "aws-cli",
"file": "skills/aws-cli/SKILL.md",
"version": "20260502033",
- "checksum": "9a04a1bd230a74847e2ff5c9d9b9c2231fd8ecc14bdc2a063104998cb9f642b6",
+ "checksum": "cd2156945d2e57cec860858996d0a90c978d6e4ce72d4b9609dc7778f4e4054f",
"checksum_algorithm": "sha256"
},
{
"name": "changedoc",
"file": "skills/changedoc/SKILL.md",
"version": "20260625001",
- "checksum": "0acae9195c58277a7b9a4b19abafefa1d2ec2e1e4c1e5b0efbed1415502d61a0",
+ "checksum": "c66be47d3e80bfbf368fa1f1e5d3d1c91ecb96c751d86a2423ba76ca74e84c74",
"checksum_algorithm": "sha256"
},
{
"name": "cicd",
"file": "skills/cicd/SKILL.md",
"version": "20260421006",
- "checksum": "b9f90d35d08e2baa45ef6d93c0e97e28751cd8d667114a8533a78c81445e94e8",
+ "checksum": "ca030b2e03d4c7f2da503532448218bf42423bfb7767c399a0e06a01e81936a5",
"checksum_algorithm": "sha256"
},
{
"name": "cloudformation",
"file": "skills/cloudformation/SKILL.md",
"version": "20260502032",
- "checksum": "ff5b9f34ce26347e2785d5c88ac549344942c625ededa389f1a902200f90544e",
+ "checksum": "6ecd6939048f5aa9dbfb521dfcb96338f597e46bf9d1c825409e78b31d78ccd9",
"checksum_algorithm": "sha256"
},
{
"name": "code-review",
"file": "skills/code-review/SKILL.md",
"version": "20260421007",
- "checksum": "52dcd1c837112205ffb2e6bd12cb4ec02c1150418159727ae32818605e818a63",
+ "checksum": "ed250caf234745a4e9c75dcd9b7a89030c8fa2b6a1bf00bc449d9a3a58c27918",
"checksum_algorithm": "sha256"
},
{
"name": "codeql",
"file": "skills/codeql/SKILL.md",
"version": "20260502026",
- "checksum": "ff55a96e69da8649e2474d333311e143649a937e33cab426fce75e085bad2694",
+ "checksum": "66e17e61388e1d0084f25a4921556f00926bb49b220deda6270054b25f96b270",
"checksum_algorithm": "sha256"
},
{
"name": "concise",
"file": "skills/concise/SKILL.md",
"version": "20260421008",
- "checksum": "5820b551f432a042cf9b8e61569799130b710ea85d6688749fd6f83518d4fc29",
+ "checksum": "eaddf3ccc588c7ae4d290132bd10efd5feef97ff282b6e9cc9df884db9097908",
"checksum_algorithm": "sha256"
},
{
"name": "consult",
"file": "skills/consult/SKILL.md",
"version": "20260421009",
- "checksum": "bc3a441398d5ef60a63ee3a44d75133f7b52c15ef247280810f165d4dff7f0de",
+ "checksum": "d5c6c8c23e453d5d8e970c7bab66faf5968379e877b79b0e2e42079f0360e35c",
"checksum_algorithm": "sha256"
},
{
"name": "container",
"file": "skills/container/SKILL.md",
"version": "20260421010",
- "checksum": "fa710b8a9aede396e357346a2b4975e63d8bfda6c564a0b0babb6d15495ad856",
+ "checksum": "2f30e154f489ad24a3768521782a3086b71f70b4accbcd1e39fcb186c2201a7b",
"checksum_algorithm": "sha256"
},
{
"name": "conventional-commit",
"file": "skills/conventional-commit/SKILL.md",
"version": "20260502024",
- "checksum": "0f9348d4613d0d2aaba4e9803dcc90890bc53cd5e89113aff2f529e1826afe21",
+ "checksum": "cf665af63b96120991ded48a15fc42d766d767adb7440adeb2a2c69ab1595943",
"checksum_algorithm": "sha256"
},
{
"name": "copilot-ops",
"file": "skills/copilot-ops/SKILL.md",
"version": "20260513012",
- "checksum": "582735a432d636f79a69853e9811b7ef2c23a4d32e00e1c46412a009492527c1",
+ "checksum": "08c4adc458443a97e5b203088dd20c17d17cab876c6843ee1690c278c4d0ae13",
"checksum_algorithm": "sha256"
},
{
"name": "debug",
"file": "skills/debug/SKILL.md",
"version": "20260421011",
- "checksum": "f30c6f27f1900d7d60739ba711e46dd7f386c14d0dcebf534b9cea7346d4f3a3",
+ "checksum": "2df8852573c45dc0a6c236fd6cd272ff906bc4e09668ac799b44febb594299c3",
"checksum_algorithm": "sha256"
},
{
"name": "dependabot",
"file": "skills/dependabot/SKILL.md",
"version": "20260502027",
- "checksum": "433d5bbae6f10b21140aa0ad85885085606d588c2854b95d74e75b39845d6c57",
+ "checksum": "62b54ce068b54f478a8b51b0c2639c230d1811b74423f83a98cdcb87b8ef88df",
"checksum_algorithm": "sha256"
},
{
"name": "dependency",
"file": "skills/dependency/SKILL.md",
"version": "20260421012",
- "checksum": "7bf1218cd64b5d56e300c5dfc92c2f34712a26fb6dc106ffc3f6ab7c3954c2e4",
+ "checksum": "ea46b279415f9faa5de370b9cb6a89e0af109ffe14c999a7d151a51d10fab98d",
"checksum_algorithm": "sha256"
},
{
"name": "design",
"file": "skills/design/SKILL.md",
"version": "20260421013",
- "checksum": "3d1330bfe022d024e1e6ce0920559d537701928827219fc2fadf6b13b03a2b71",
+ "checksum": "bf07db5f1aabcfaafdb37c54395ee78839688c40aa6918fa126a247943aadb5d",
"checksum_algorithm": "sha256"
},
{
"name": "docs",
"file": "skills/docs/SKILL.md",
"version": "20260421014",
- "checksum": "ea276109c096130af6730e9b03124ec81ac6b2a338096a0175e0f2c09f83f14b",
+ "checksum": "9872dc3ec451609b94481ec9ca4f53fbfceccd9ac94563fd5156ea62d7a54474",
"checksum_algorithm": "sha256"
},
{
"name": "explore",
"file": "skills/explore/SKILL.md",
"version": "20260611001",
- "checksum": "73ae9db2c19ef0b92e8770d7ca6e742cb5345451c7b7f0170fd89aeeebaa2a68",
+ "checksum": "68c22251cd3df81f89b07bffaa1395da243a4dfb2c841dddc5c8429882e64453",
"checksum_algorithm": "sha256"
},
{
"name": "gdpr",
"file": "skills/gdpr/SKILL.md",
"version": "20260502029",
- "checksum": "c59511181cafdef780a0190d555ca953002d5f194c886ebf0bb1d7cdd3742b60",
+ "checksum": "ee8dfc6b03ca06899c2bb8cf4b1e3142eafe99cb4d43e77e3832ba4513dd94b2",
"checksum_algorithm": "sha256"
},
{
"name": "gh-issues",
"file": "skills/gh-issues/SKILL.md",
"version": "20260502025",
- "checksum": "cf88898d3cd08483723504f6bd22450a79b03b28c23f3c39efa6380131116601",
+ "checksum": "f3502e61dbe6e4ee589fb2580e93e35641d1416538974052e603648ec3baf8e1",
"checksum_algorithm": "sha256"
},
{
"name": "gh-release",
"file": "skills/gh-release/SKILL.md",
"version": "20260502023",
- "checksum": "7d425d32a35a2ffa6f7dbd3dd6e52ac6d83bf140eca4454f8844d569046906a8",
+ "checksum": "cebc3cd7a5ae92875c6f54772eb2a95bfa20c4fb94bbcee9c565ce25a5cb2b16",
"checksum_algorithm": "sha256"
},
{
"name": "guardrails",
"file": "skills/guardrails/SKILL.md",
"version": "20260421016",
- "checksum": "1fe600ae0a5f5e9fc974d81aca8cb1ffdc50d1b5a7ced9fdd3ec400ddec9db4d",
+ "checksum": "6ef63153ba7945841cde8f4700867a5f193fdc1d659ca712eb7ff51f5956e93e",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "skills/helm/SKILL.md",
"version": "20260502037",
- "checksum": "d03178606be8fbc8152b97d95b146ad757061b97ac969207e5d92bda04ee7454",
+ "checksum": "0da07ec13ab699517a5dfef757b483d654083c78956d8071177e9967352a144e",
"checksum_algorithm": "sha256"
},
{
"name": "incident",
"file": "skills/incident/SKILL.md",
"version": "20260503002",
- "checksum": "ef1f63deb5c361d995e41c393ff63c55d1556f3a216515a2afe7dc564a80f561",
+ "checksum": "c7a68e588ae25e60b24218de80c0f0f603ada8dc68a1524296e54345cf86cd77",
"checksum_algorithm": "sha256"
},
{
"name": "inspect",
"file": "skills/inspect/SKILL.md",
"version": "20260421018",
- "checksum": "7bdc6776309a7130fbb47ae8f2be8f07511d4dca67dd3e42c7170b1fb0524d9c",
+ "checksum": "6fe8f3842251066cea682d088492366aa05cff256930c4f6a06245f81ca1aabf",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "skills/k8s/SKILL.md",
"version": "20260502036",
- "checksum": "d9ab4f7f08b6b1b2083034fcc068826871ad63fdb0d3861189c799e1679ca5b6",
+ "checksum": "3dbf7ee9f661ae2a6396917363b97ed431fdc21faa7320b74a8e96afc28976bb",
"checksum_algorithm": "sha256"
},
{
"name": "lazy",
"file": "skills/lazy/SKILL.md",
"version": "20260625001",
- "checksum": "9367ee448e3be8dedf2f361d8d9c37bed08673ced4082d8d38b5facb98195d3b",
+ "checksum": "094e3384a72e0b7ca1cc7b574eeba2d5b8a7846476effe52f0af2a48e7e068ce",
"checksum_algorithm": "sha256"
},
{
"name": "migrate",
"file": "skills/migrate/SKILL.md",
"version": "20260421019",
- "checksum": "eafa22586141e152b686c0148d20af3c482424b79cd1f7195f0fdbe8f1c75928",
+ "checksum": "68b326b585ffcd62e69dd9d6bf00b7d66dbfdf06035ccee472b87ef212e6898c",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "migration-plan",
+ "file": "skills/migration-plan/SKILL.md",
+ "version": "20261017001",
+ "checksum": "d84efc52811ab822bc168248e0b227e052f78448c8eeed35cd1587abc6c57df1",
"checksum_algorithm": "sha256"
},
{
"name": "onboard",
"file": "skills/onboard/SKILL.md",
"version": "20260421020",
- "checksum": "67cfa95ebacb72fab6c7289238315cf7d73bdec665f9d9775ba616ecf9827d09",
+ "checksum": "66498d30b8ed0c77f648c409764ba5b722c3113536b4e51bf14682b9478baa8e",
"checksum_algorithm": "sha256"
},
{
"name": "openapi",
"file": "skills/openapi/SKILL.md",
"version": "20260421021",
- "checksum": "6be2f0350a71826b0c70506331f8236075a767c3a66272d485efbfc31e02116c",
+ "checksum": "2df37a86e76ce9653aec8242a18da7cdcbdacf472caef15e9fe88a3bcafcd5e9",
"checksum_algorithm": "sha256"
},
{
"name": "performance",
"file": "skills/performance/SKILL.md",
"version": "20260421022",
- "checksum": "f1b3de41ddb049e1e6c11fee5305d1ede50fec6d7b8c2fbee424684cdbafbfe1",
+ "checksum": "e194acff5d8f662dd14382baa76e3cfc565b19c8999d9cc7496bb5e4b862bb70",
"checksum_algorithm": "sha256"
},
{
"name": "postmortem",
"file": "skills/postmortem/SKILL.md",
"version": "20260503001",
- "checksum": "e66a8637020c5d4f49667d68cb82cb23454f9b8e4bcae0d2306f8a14492d5a35",
+ "checksum": "0a05235f5c9a690d9e17590cb7c9fa1e37ac0e5e24088f07b6ad5f401699d0e3",
"checksum_algorithm": "sha256"
},
{
"name": "pr",
"file": "skills/pr/SKILL.md",
"version": "20260502013",
- "checksum": "10e21fea3fe695fd8b9375314570caf6d55994a3e92be9a560a8ca84c50b6685",
+ "checksum": "f8557f0ede29d0361c3c05410e126976acfd532d238545e02b6cebd503537a5c",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "skills/rancher/SKILL.md",
"version": "20260502038",
- "checksum": "585fca26d9085339c3c4cbb51dae9aca92029cc95819ea645f0f1339a3e408f0",
+ "checksum": "e2e63f14c59617702f051332f3d8bf69c812a7ae7c7b1d4852e70328cb517cfc",
"checksum_algorithm": "sha256"
},
{
"name": "rca",
"file": "skills/rca/SKILL.md",
"version": "20260503001",
- "checksum": "18f67a9fe20eb252ad3552112abe15cdc9b478b893a7f28368a36341a020398a",
+ "checksum": "1a231a53a656afb6339a2887a3b95b9799d8d83f94fbbd9299cf41467b503fde",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "reasoning",
+ "file": "skills/reasoning/SKILL.md",
+ "version": "20261017001",
+ "checksum": "85a1bbc39d49121f3b8a05b3980bb77677b880c8f4ed4890729abd21e3dedf1f",
"checksum_algorithm": "sha256"
},
{
"name": "refactor",
"file": "skills/refactor/SKILL.md",
"version": "20260421023",
- "checksum": "42fedb61708cb469f8325d738dc5a75688e7c34b981e8cad4abd257015e57520",
+ "checksum": "c804552f73f7be6fc6efb0709f4ec993c994bba1e9fdf75f549da275be854fb0",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "release-check",
+ "file": "skills/release-check/SKILL.md",
+ "version": "20261017001",
+ "checksum": "7ee64d4ea0a2c3c3d2fdce9606b24ad7b164503a53a4aa547d85647f1007171b",
"checksum_algorithm": "sha256"
},
{
"name": "release-notes",
"file": "skills/release-notes/SKILL.md",
"version": "20260502014",
- "checksum": "1d7daef61af9010f0afd53daa8d5524d26b71a0ddd5794e5b4fca89dd59d80a2",
+ "checksum": "a2a0a4c6bc94c1f1da996421c69d34f6de1590749de6c12217cecd605ad94126",
"checksum_algorithm": "sha256"
},
{
"name": "requirements",
"file": "skills/requirements/SKILL.md",
"version": "20260421024",
- "checksum": "87460b5b0dacb0df5a68c36662fab194a666f02cbe140a473b8d418d69421f7f",
+ "checksum": "4c4e7196fcb34bfcbab3bb99023acb887c1641d196b12f7e8725e7bdbd525c55",
"checksum_algorithm": "sha256"
},
{
"name": "secret-scan",
"file": "skills/secret-scan/SKILL.md",
"version": "20260502028",
- "checksum": "51bf8cc673fc6984aad45589a54aacbcc7a4cbdb7c3089d47110ef38a3fcbe4d",
+ "checksum": "e1f4dd9fe060b9c7d28763c316a9d64bca7647f5bc4fa4a65c18327a7391ccc1",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "skills/security/SKILL.md",
"version": "20260421025",
- "checksum": "53bca57d167a78c01b0edf1fca3ad6200fe4165fdb27d1cc19722dfee7ba6521",
+ "checksum": "7e98a5f86ed6d6adf78db584f2f3a958d2a7e6eaa742ea81f4c5373f2d12f65b",
"checksum_algorithm": "sha256"
},
{
"name": "simplify",
"file": "skills/simplify/SKILL.md",
"version": "20260625001",
- "checksum": "146fb31d0945c5e6af086607ff46c11aea5c8e6d8e230076bc083c3574ae18f3",
+ "checksum": "0808af6fff589768782cdaf1363ce21d72351777e19f632ec4212c2c1a87142e",
"checksum_algorithm": "sha256"
},
{
"name": "space-setup",
"file": "skills/space-setup/SKILL.md",
"version": "20260513011",
- "checksum": "5064b3e7f397fa026bfe10eb9ee7b14545acbab12f4c19b98764256380e50686",
+ "checksum": "753d7e3ad5ac773c21e23d9018719078effb853307bef5870fb4276bd9a53f34",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "skills/terraform/SKILL.md",
"version": "20260502030",
- "checksum": "599a1e19f900d98683d710bbecdbe897d0bcf919934419d1bbaf1474914db0c5",
+ "checksum": "d88a37c6f6b7ce807f0157c1fc8f1e1b21c281379952d58bc72c3ba6853e7e59",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "skills/terragrunt/SKILL.md",
"version": "20260502031",
- "checksum": "ca39ff5191a5edfa16fd38e6d2d617cfc4288206079698bcbfb30229c50d315a",
+ "checksum": "1fd15a27c8a3a376b9952058c65146256ab20bcce4d1774f93cc4524d087c65f",
"checksum_algorithm": "sha256"
},
{
"name": "threat-model",
"file": "skills/threat-model/SKILL.md",
"version": "20260502021",
- "checksum": "050590189a5d84faed9edc9253fc55297d2b86980c83438aed2b721346fa964a",
+ "checksum": "3d1781223e4b2c3be8ff6ad509726d0f2b3b11a7b13ae809fed2449321d63e23",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "upgrade-plan",
+ "file": "skills/upgrade-plan/SKILL.md",
+ "version": "20261017001",
+ "checksum": "cf94923afb5ab2a3a2fc0b798809563260efa277f84ec91a0e0e1e0e3c5b349e",
"checksum_algorithm": "sha256"
},
{
"name": "verify",
"file": "skills/verify/SKILL.md",
"version": "20260421026",
- "checksum": "72d2979131d2609ec90e9130b1109ec8c42467e5683493336e81f3b571c65915",
+ "checksum": "2eb0c9736f53ecfd05151a57675075d8afd65f1188f89aaf3a6b1274a338cfc3",
"checksum_algorithm": "sha256"
},
{
"name": "vision",
"file": "skills/vision/SKILL.md",
"version": "20260421027",
- "checksum": "8d688153c93138fe7ac97e748c3ee94f86fe8a03c78550d895400ac38303e256",
+ "checksum": "d03fc9b5cc5f41b4028516d9d60b5c7b523f3a8f0f679dd3cbe88e86bff13afc",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "workflow-check",
+ "file": "skills/workflow-check/SKILL.md",
+ "version": "20261017001",
+ "checksum": "5256914e95af280348654e9e7bbcb9fa1201e849fb08b5191725c7fc0a804317",
"checksum_algorithm": "sha256"
}
],
@@ -368,49 +410,49 @@
"name": "architect",
"file": "agents/architect.agent.md",
"version": "20260514001",
- "checksum": "df80bf7a7e63a435866be49a7f0c9222fda5003945b9f7629a03a8d9f74375a3",
+ "checksum": "c0ba7aab6baec8cbcbac379f006cb989c314df6af841aed7e0d5804c360e1fbc",
"checksum_algorithm": "sha256"
},
{
"name": "designer",
"file": "agents/designer.agent.md",
"version": "20260514001",
- "checksum": "5c2125fb4ae1fca15d1b4c621c8e6da0a5512bb4c4938a52a36f25534dae78d5",
+ "checksum": "51ed1da4df89d94007a5935f063cd8e119ad2c9a2ca04cd70d752861ec360aaf",
"checksum_algorithm": "sha256"
},
{
"name": "engineer",
"file": "agents/engineer.agent.md",
"version": "20260514001",
- "checksum": "a59ef1d8321c7fbe2e04428409c29354ebf85cc039bc3fe74a0bebcc2b3aa29b",
+ "checksum": "472ce9d75457fb9ff93ebb7063b0bc811f5b6d360a4f5ca42006fc56e0efebd1",
"checksum_algorithm": "sha256"
},
{
"name": "planner",
"file": "agents/planner.agent.md",
"version": "20260514001",
- "checksum": "8a54e9202b9dcb2ca8b479eeae709e7dae4f2f30a9d782bac3aeb463a6dd52af",
+ "checksum": "09a0243e9c59ee187427c22bdb348fc6c78d68e2320d9f11f790c6ea65a07b65",
"checksum_algorithm": "sha256"
},
{
"name": "product",
"file": "agents/product.agent.md",
"version": "20260514001",
- "checksum": "570272a093eed52edb7918c0ec4f753eb9fdea4372a7886c628e997ba727cd71",
+ "checksum": "19ce0a24eefefc83260f049104eb259dd3ae1ee3c7478a28d868a46a395571fa",
"checksum_algorithm": "sha256"
},
{
"name": "release",
"file": "agents/release.agent.md",
"version": "20260514001",
- "checksum": "f96cc7bf9907c68d5da1c65d564de302ab1734fbe549ad52a96adf5f841fc74a",
+ "checksum": "3539f1de734c47d3801a007181c1a6af6227d82d7e9841cfab2da5fd7d3f5da3",
"checksum_algorithm": "sha256"
},
{
"name": "tester",
"file": "agents/tester.agent.md",
"version": "20260514001",
- "checksum": "4497a4ee20f393101a526e6caeb1c17a64cf3c60aefe638ea5f04655c82a9443",
+ "checksum": "73c1255d2bf3c0034330e7e4bc0de292a69b176aac020a2d69ae2d765f1e5d5d",
"checksum_algorithm": "sha256"
}
],
@@ -418,49 +460,49 @@
{
"name": "agent-call-audit",
"file": "hooks/agent-call-audit.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "a03cc5df031670dd4902599048a9fc955a852862b2cb73408f5889ee74baa636",
"checksum_algorithm": "sha256"
},
{
"name": "log-retention-cleanup",
"file": "hooks/log-retention-cleanup.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "2c3048637dc0f85b7196934b0f6c5a2ee9a21739b45bc7a529e2f5531f2b2609",
"checksum_algorithm": "sha256"
},
{
"name": "post-commit-security-scan",
"file": "hooks/post-commit-security-scan.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "154305889deb5676a6b7d686400b14b4237687be130438d19843341addbdff8e",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-format",
"file": "hooks/post-edit-format.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "5911a2fc0211b268749e5200db8d43eec953f456294c8cbc5556cea9ab11f875",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-markdown-quality",
"file": "hooks/post-edit-markdown-quality.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "b8ef6b1805492a580902675ccd16564c693ec2ccf30fdb81d6b1d8dce610ab22",
"checksum_algorithm": "sha256"
},
{
"name": "pre-tool-safety-gate",
"file": "hooks/pre-tool-safety-gate.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "1d55d6c9cee6137472e37c9e16febb5a96419fc0813c4c474af5a50ee03ee5a0",
"checksum_algorithm": "sha256"
},
{
"name": "session-audit",
"file": "hooks/session-audit.json",
- "version": "3.6.0",
+ "version": "3.7.4",
"checksum": "0190aa65dfea26b2129ad8a5304377b2d40febf03779f561194e788bb8b27bfa",
"checksum_algorithm": "sha256"
}
@@ -470,205 +512,84 @@
"name": "git",
"file": "instructions/git.instructions.md",
"version": "20260421001",
- "checksum": "98b80a1ac1bc6449205bbb47ab55e1883db96408a00b387b13ba89c1bc3e607f",
+ "checksum": "357ed856de5e8b9d032453ef2dbc8b2225d02ff2b8b4a0fd912da015253afb10",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "instructions/helm.instructions.md",
"version": "20260502040",
- "checksum": "98074afe634848f3746b719785bb6ea193954c8a2d18b5be384a283d5037d1f8",
+ "checksum": "1e42da7a5f74b4dd8f1caa8e7a5edbc77b132d6acf98bc76d124abb13c758025",
"checksum_algorithm": "sha256"
},
{
"name": "java",
"file": "instructions/java.instructions.md",
"version": "20260502001",
- "checksum": "898d7bec68b530f4bebdf06b0f5187a723235dcfadbf7b5543458ce8c57d3bbd",
+ "checksum": "9d35507d6c3a5de3c80529c800f3f47da4f671ef7bbb9d3edbe127602da3af7b",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "instructions/k8s.instructions.md",
"version": "20260502039",
- "checksum": "988deef8f67a0014fc5048cc1b9176a8fcaa2ddbc31974ee51c69d79e415d942",
+ "checksum": "5d773a2ca7bbcb681bb0f6104a456fc727267f794fd4018e1e9a0cfae08460d8",
"checksum_algorithm": "sha256"
},
{
"name": "markdown",
"file": "instructions/markdown.instructions.md",
"version": "20260502002",
- "checksum": "7fd126db0f2aee3a85eb77ce93b50bb38d5027acdd4ae7cd5849a92a7b7c6ceb",
+ "checksum": "fdc14cd47c22b8884706369a300df78c2a5ae55de37ac38fe72b8f0ccc080627",
"checksum_algorithm": "sha256"
},
{
"name": "python",
"file": "instructions/python.instructions.md",
"version": "20260421002",
- "checksum": "b1629161e831aeca03c29b5bc3ff03e1d06d6a90bb6d8f746a1a1a44086f3f2e",
+ "checksum": "833808837e48accd049debf3b8a5043f9d5a3c03841123d01e9dd26d9674fdfd",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "instructions/rancher.instructions.md",
"version": "20260502041",
- "checksum": "3bd18bea97ca1515f6fac7543ddd242181c740ee529494e2f2c7a7801ef04ab5",
+ "checksum": "5dea653927b3d951fb7fa9e8b5944a33330b40800277f36d4f8fc5263cfd0ae2",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "instructions/security.instructions.md",
"version": "20260502003",
- "checksum": "004ca7d875f1d3aa81d25f721db2a5a08429ccad7013ae83b2bb90e5fcdffe1c",
+ "checksum": "dd2f30b1a9bf9e54223d894ef0a36c924b08510c8f13d601b0c9de8fa5a00ace",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "instructions/terraform.instructions.md",
"version": "20260502034",
- "checksum": "881d4c803a647da37c36b805071343a7d57840e901efc71cb4ec9e160501025a",
+ "checksum": "784bf231d33b2792b365be00af112e7da5370640afce7a655c2381996133d1ab",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "instructions/terragrunt.instructions.md",
"version": "20260502035",
- "checksum": "7cb98962ba3457d1163c7498efd05240b63d0c3a94d763aeb3527ae4e227e045",
+ "checksum": "5db2f90b5fd873cedbc11887ec5745492e78ee300257db17f2e1d719a358e43c",
"checksum_algorithm": "sha256"
},
{
"name": "testing",
"file": "instructions/testing.instructions.md",
"version": "20260502004",
- "checksum": "c0652c822f66494b8e1cabbccdacb3197a6bb723f7ac0d33f7d10a2f08d2db07",
+ "checksum": "2e84526ac2c6d2a4309139d6b36463370df2e911e061de4fc536d6ab0a20e74a",
"checksum_algorithm": "sha256"
},
{
"name": "typescript",
"file": "instructions/typescript.instructions.md",
"version": "20260502005",
- "checksum": "34c518a65b1e0cc4e95cca54c1b10fa2d3a597af658def40934ff83edf3a88c4",
- "checksum_algorithm": "sha256"
- }
- ],
- "prompts": [
- {
- "name": "api-design-review",
- "file": "prompts/api-design-review.prompt.md",
- "version": "20260502006",
- "checksum": "2b545504fe2ca6ed04b5a7d97cc8f1a8ce029a1d650c3ce169de8bca679547a3",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "architecture-risk",
- "file": "prompts/architecture-risk.prompt.md",
- "version": "20260502007",
- "checksum": "49c8c803f6da959bdecad75acef6532180adbd663f20acf3e4bc47a92ef69b35",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "artifact-integrity",
- "file": "prompts/artifact-integrity.prompt.md",
- "version": "20260513002",
- "checksum": "7ebc3d7b0bb4a16353e5e19064d8968c5bd176f988b71b58b19e7a3b6d99d2a3",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "ci-triage",
- "file": "prompts/ci-triage.prompt.md",
- "version": "20260513006",
- "checksum": "9d61be0f0df49541fd460784dd008b014e8e6d8397305a5d88bdd80e4f8ebbdc",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "dependency-audit",
- "file": "prompts/dependency-audit.prompt.md",
- "version": "20260502009",
- "checksum": "0f3e97dd31b2e3fbbe42165922580c148c5341cba6d8d895154445f008dc129d",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "incident-timeline",
- "file": "prompts/incident-timeline.prompt.md",
- "version": "20260502010",
- "checksum": "e5ef64a53a5533a491d357f9ed021ae50f929e19229556f6942a2730f911ded0",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "migration-plan",
- "file": "prompts/migration-plan.prompt.md",
- "version": "20260513010",
- "checksum": "ea4aaf48901af5a4dec17a92d560eec717910f904a3190fbc0c1fe0c473cd846",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "migration-safety",
- "file": "prompts/migration-safety.prompt.md",
- "version": "20260502011",
- "checksum": "6a8e7d995c24391d66e064f46dde67d220b870c8e9b583df0ecc89f4195c9cfb",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "ops-readiness",
- "file": "prompts/ops-readiness.prompt.md",
- "version": "20260513009",
- "checksum": "f6c9cbb326dd178e92faf9e412041b3a9a015ddccab41415fa3da078a23d5edc",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "quick-review",
- "file": "prompts/quick-review.prompt.md",
- "version": "20260502008",
- "checksum": "7d4362e35180953f32c58b15b8bde51303ed69bce06349c19b148908a5c83c85",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "reasoning",
- "file": "prompts/reasoning.prompt.md",
- "version": "20260626001",
- "checksum": "0afebccdc84d0c31aa44858d40f02183c678c3707cfb63db29401b1d27860418",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "release-check",
- "file": "prompts/release-check.prompt.md",
- "version": "20260513004",
- "checksum": "75cd201e04fa59ffd4de8e7f75568d8b13405493d3a6be12188155d90a7edde9",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "repo-assessment",
- "file": "prompts/repo-assessment.prompt.md",
- "version": "20260513001",
- "checksum": "130674bddb0ae0954cac5af9518566e320b7caef4e314faaa0ec84682df286f1",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "template-impact",
- "file": "prompts/template-impact.prompt.md",
- "version": "20260513005",
- "checksum": "e584f8e0ac38ac3baabe1b3181a8f0f43151b2250c8f4ffd754370cc026b88d9",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "test-gaps",
- "file": "prompts/test-gaps.prompt.md",
- "version": "20260513007",
- "checksum": "7386004b8e6f38608122e3357aa65f8927a9005b4bfd5f336865ea2b049d8d63",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "upgrade-plan",
- "file": "prompts/upgrade-plan.prompt.md",
- "version": "20260513008",
- "checksum": "e3c8c94fefbe59333b109fb164983612285929b189c1d2534bd75b4d19a535d4",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "workflow-check",
- "file": "prompts/workflow-check.prompt.md",
- "version": "20260513003",
- "checksum": "02cd2971f68172888528eb19c2dd559c35e1ce060628dddc7e4bef2ca8192f9b",
+ "checksum": "9399cfdaf8a806cf8c49e3f5d466cc31e8ec947bac923297bbc63578b8059a35",
"checksum_algorithm": "sha256"
}
]
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 38f59e9c..fe4cb46c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -57,14 +57,14 @@ make check
Use this table to find the minimum set of checks to run after each type of change.
Run `make check` before opening a PR when your change touches multiple areas.
-| Change type | Required checks |
-| ----------------------------------------------------------------------- | ---------------------------------------------------------------------- |
-| `src/vstack/_templates/agents/`, `skills/`, `instructions/`, `prompts/` | `python3 -m vstack install`, `make test-local`, `make markdown-format` |
-| `src/vstack/_templates/hooks/` | `python3 -m vstack install`, `make test-local` |
-| `docs/**/*.md` | `make markdown-format` |
-| `src/**/*.py` or `tests/**/*.py` | `make test-local` (run `make check` before merge) |
-| CLI behavior, manifest logic, or workflow contract | `make check` |
-| `pyproject.toml`, `Makefile`, or CI workflow files | `make check` |
+| Change type | Required checks |
+| ----------------------------------------------------------- | ---------------------------------------------------------------------- |
+| `src/vstack/_templates/agents/`, `skills/`, `instructions/` | `python3 -m vstack install`, `make test-local`, `make markdown-format` |
+| `src/vstack/_templates/hooks/` | `python3 -m vstack install`, `make test-local` |
+| `docs/**/*.md` | `make markdown-format` |
+| `src/**/*.py` or `tests/**/*.py` | `make test-local` (run `make check` before merge) |
+| CLI behavior, manifest logic, or workflow contract | `make check` |
+| `pyproject.toml`, `Makefile`, or CI workflow files | `make check` |
### Coverage requirement
@@ -115,7 +115,7 @@ type(optional-scope)!: short summary
- Domain and backend areas: `api`, `auth`, `permissions`, `serializer`, `viewset`, `orm`, `migrations`, `admin`, `settings`.
- Tooling and workflow areas: `deps`, `ci`, `docs`, `build`, `style`, `release`, `workflow`.
- Quality and test areas: `test`, `tests`.
-- Project modules: `cli`, `agents`, `skills`, `instructions`, `prompts`, `frontmatter`, `artifacts`.
+- Project modules: `cli`, `agents`, `skills`, `instructions`, `hooks`, `frontmatter`, `artifacts`.
### 5) Examples
diff --git a/README-pypi.md b/README-pypi.md
index ccdfc0b2..1d5717e8 100644
--- a/README-pypi.md
+++ b/README-pypi.md
@@ -12,7 +12,7 @@
The VS Code-native AI workflow system for backend engineering.
-vstack installs structured agents, skills, instructions, and prompts into `.github/` so GitHub Copilot Agent Mode can run repeatable backend workflows with clear role boundaries.
+vstack installs structured agents, skills, instructions, and hooks into `.github/` so GitHub Copilot Agent Mode can run repeatable backend workflows with clear role boundaries.
It provides six delivery roles for end-to-end software work: `product`, `architect`, `designer`, `engineer`, `tester`, and `release`, coordinated by `planner`.
diff --git a/README.md b/README.md
index 797112d4..a77072dc 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@
vstack is a VS Code-native AI engineering workflow system for backend services,
libraries, APIs, and adjacent platform work. It installs structured agents,
-skills, instructions, and prompts into `.github/` so GitHub Copilot Agent Mode
+skills, instructions, and hooks into `.github/` so GitHub Copilot Agent Mode
has a clear operating model instead of ad hoc chat prompts.
What gets built is determined by the product vision. vstack fixes the delivery
@@ -115,7 +115,7 @@ ______________________________________________________________________
- [CLI commands reference](docs/user/reference/cli-commands.md)
- [Configuration reference](docs/user/reference/configuration.md)
- [Hooks reference](docs/user/reference/hooks.md)
-- [Prompts overview](docs/user/reference/prompts-overview.md)
+- [Prompt-to-skill migration](docs/user/reference/prompt-migration.md)
- [Skills overview](docs/user/reference/skills-overview.md)
- [Instructions overview](docs/user/reference/instructions-overview.md)
- [Workflow modes explanation](docs/user/explanation/workflow-modes.md)
diff --git a/docs/architecture/adr/032-skills-replace-prompts.md b/docs/architecture/adr/032-skills-replace-prompts.md
new file mode 100644
index 00000000..0d622d4d
--- /dev/null
+++ b/docs/architecture/adr/032-skills-replace-prompts.md
@@ -0,0 +1,57 @@
+# ADR-032: Skills Replace Prompt Artifacts
+
+**Date:** 2026-10-17
+**Status:** accepted
+
+## Context
+
+The VS Code Copilot harness uses skills for reusable workflows and does not load
+`*.prompt.md` files. The Local harness still supports them, but vstack should
+provide one portable workflow surface rather than duplicate skills and prompts.
+Existing installations contain tracked prompts that must not be orphaned.
+
+## Decision
+
+Remove the prompt artifact family in the next major release. Reuse existing
+skills where workflows overlap and convert unique prompts to skills with
+`disable-model-invocation: true`.
+
+Keep legacy manifest data readable solely for migration. `install` and `init`
+automatically retire known prompts when skills are selected, replacement skills
+are successfully available, and the old files match their stored checksums.
+Preserve and report unmanaged, modified, unknown, or unsafe files.
+
+## Alternatives Considered
+
+- Keep prompts unchanged: compatible with Local sessions but unavailable to the
+ Copilot harness. Rejected.
+- Generate both prompts and skills: retains compatibility but duplicates command
+ discovery and maintenance. Rejected.
+- Retire prompts with safe migration: one workflow surface with an explicit
+ breaking-change boundary. Selected.
+
+## Rationale
+
+Roles belong to agents and reusable procedures belong to skills. A separate prompt
+generator no longer provides sufficient value. Reusing manifest checksums and the
+existing conservative install policy prevents loss of local work. Missing or
+conflicting replacement skills defer cleanup instead of removing usable workflows.
+
+## Consequences
+
+Prompt selectors, public generator imports, and some old command names disappear.
+Users with custom prompt templates must convert those themselves. The migration
+guide records replacement commands. Existing skills keep their invocation policy;
+converted skills remain opt-in and do not reproduce prompt-specific agent,
+model, or tool selection.
+
+For the Option B pipeline, role boundaries and handoff prompt strings remain
+unchanged. Stages invoke skills rather than prompt artifacts.
+
+## Related ADRs
+
+- [ADR-005](005-vscode-prompt-format.md): superseded prompt-generation direction.
+- [ADR-012](012-flat-templates-install-time-generation.md): retains source-first,
+ install-time generation for the remaining families.
+- [ADR-015](015-conservative-install-by-default.md): preserves local modifications.
+- [ADR-020](020-install-init-command-semantics.md): both commands share migration.
diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md
index ab558ceb..3faf092d 100644
--- a/docs/architecture/overview.md
+++ b/docs/architecture/overview.md
@@ -6,7 +6,7 @@
## overview
vstack is a VS Code–native AI engineering workflow system. It provides template-driven
-skills, agents, hooks, instructions, and prompts for planning, reviewing, verifying, and
+skills, agents, hooks, and instructions for planning, reviewing, verifying, and
releasing software via GitHub Copilot Agent Mode.
**System style:** `platform` — a standalone CLI tool and SDK. vstack installs
@@ -32,12 +32,11 @@ vstack/
│ ├── skills/ ← SKILL_SCHEMA, SKILL_TYPE
│ ├── agents/ ← AGENT_SCHEMA, AGENT_TYPE
│ ├── instructions/ ← instruction config and wrappers
-│ ├── prompts/ ← prompt config and wrappers
│ ├── hooks/ ← hook config and YAML-to-JSON generator
│ ├── manifest/ ← Manifest, ManifestFile, ArtifactEntry, checksums
│ ├── cli/ ← interface, registry, service, per-command handlers, helpers
│ └── _templates/ ← source templates for all artifact types
-│ ├── skills/, agents/, hooks/, instructions/, prompts/
+│ ├── skills/, agents/, hooks/, instructions/
│ ├── docs/ ← baseline doc stubs (seeded by vstack install)
│ └── project/ ← .vstack/ config and artifact starter templates
├── docs/
@@ -57,8 +56,7 @@ vstack/
│ ├── skills//SKILL.md
│ ├── agents/.agent.md
│ ├── hooks/.json
-│ ├── instructions/.instructions.md
-│ └── prompts/.prompt.md
+│ └── instructions/.instructions.md
└── README.md
```
@@ -117,7 +115,7 @@ have defined skill access and artifact ownership. See
### 5. manifest (`.vstack/vstack.json`)
Generated at install time at `.vstack/vstack.json`. Tracks every `.github/` artifact
-installed by `vstack init` (skills, agents, hooks, instructions, and prompts), including a
+installed by `vstack init` (skills, agents, hooks, and instructions), including a
per-file SHA-256 checksum, version, and algorithm so that:
- `vstack uninstall` removes exactly the files it installed.
@@ -133,6 +131,12 @@ The manifest schema is versioned (`manifest_version` field). Operations that req
the current schema fail fast with an upgrade hint rather than silently misbehaving.
See ADR-014 and ADR-020.
+Legacy `prompts` entries remain readable for migration only. When skills are
+selected, `install` and `init` automatically remove known, unchanged prompts after
+their replacement skills are available. Modified, unknown, or unsafe files remain
+tracked and are reported for manual review. See
+[ADR-032](adr/032-skills-replace-prompts.md).
+
Writes are atomic: content is staged to a sibling `.tmp` file and promoted with
`os.replace` so a crash or `KeyboardInterrupt` cannot produce a partially-written
manifest. See ADR-016.
diff --git a/docs/changes/retire-prompts_skill_migration_20261017.md b/docs/changes/retire-prompts_skill_migration_20261017.md
new file mode 100644
index 00000000..0f2a1aa5
--- /dev/null
+++ b/docs/changes/retire-prompts_skill_migration_20261017.md
@@ -0,0 +1,79 @@
+# Retire Prompts in Favor of Skills
+
+## Metadata
+
+```yaml
+status: IMPLEMENTED
+type: migration
+reference: user-request-20261017
+last_modified: 2026-10-17
+```
+
+## Goal and Context
+
+Retire the prompt artifact family because the Copilot harness does not load
+prompt files. Preserve reusable workflows as skills without maintaining duplicate
+procedures. This is a breaking change intended for the next major release.
+
+## AS-IS
+
+vstack generates 17 built-in prompts alongside skills, agents, instructions, and
+hooks. `init --prune` can remove obsolete artifacts only for selected, registered
+families. Removing the prompt generator alone would leave installed prompts and
+their manifest entries behind.
+
+## TO-BE
+
+- Remove the prompt generator, schema, CLI type, and source templates.
+- Reuse existing skills for overlapping workflows.
+- Convert unique workflows to manually invoked skills.
+- During `install` and `init` with skills selected, remove unchanged legacy prompts
+ only after their replacement skills are successfully available.
+- Preserve unmanaged, modified, checksum-less, unsafe-path, and unknown prompts.
+ Report why migration was deferred and retain manifest tracking for retry.
+- Keep legacy manifest parsing, dry-run behavior, and scoped installs intact.
+- Do not change agent handoff prompt strings or release/tag automation.
+
+## Impact (High Level)
+
+- Architecture: four active artifact families; legacy prompt data is migration-only.
+- API/data/model: remove `prompt` selectors and public prompt generator imports.
+- Security/privacy: require manifest ownership, checksums, canonical paths, and
+ non-symlink destinations before deleting a legacy file.
+- Operations: upgrade with `vstack install` or `vstack init`; repeated runs are
+ idempotent. Custom prompt workflows require manual conversion.
+- Option B: roles and handoffs remain unchanged; reusable procedures use skills.
+
+## Acceptance Criteria
+
+1. Fresh installs produce no prompt files and expose no prompt artifact type.
+1. Each retired built-in has a documented replacement skill.
+1. Unique workflows retain their instructions and explicit invocation behavior.
+1. Upgrades install replacements before removing safe legacy prompts.
+1. Unsafe or modified files remain untouched, tracked, and explicitly reported.
+1. Dry runs and non-skill installs do not remove prompts.
+1. Tests cover fresh installs, upgrades, collisions, exclusions, and repeat runs.
+
+## Test Scenarios
+
+- Upgrade an old manifest containing all built-in prompts.
+- Preserve a modified, untracked, checksum-less, unknown, or symlinked prompt.
+- Preserve prompts when replacement skills are excluded or collide with local files.
+- Reject unsafe manifest paths without accessing files outside the install root.
+- Retry a partially completed migration and clear entries for already missing files.
+- Confirm dry-run leaves files and manifest bytes unchanged.
+- Confirm CLI rejection of removed selectors and valid output for all four families.
+- Run lint, type checking, tests with 100% coverage, and source validation.
+
+## Verification
+
+- Full suite: 698 tests passed with 100% coverage on Python 3.14.
+- Ruff lint, Python formatting, and mypy passed.
+- Shipped templates validate; installed artifact checksums and metadata verify.
+- Repository migration removed all 17 tracked prompts and installed six explicit-only skills.
+- A repeat update dry-run reports no installations, updates, or preserved conflicts.
+- Changed Markdown passes mdformat with the repository's GFM plugin; local links resolve.
+- The pre-commit wrapper could not initialize its remote hook environments because
+ GitHub SSH authentication is unavailable. Markdownlint was not run. The full
+ Ruff formatting command also reports an unrelated pre-existing formatting issue
+ in the `refactor` skill's Python examples; those examples were left unchanged.
diff --git a/docs/design/overview.md b/docs/design/overview.md
index dfc45266..d7c49c24 100644
--- a/docs/design/overview.md
+++ b/docs/design/overview.md
@@ -25,7 +25,7 @@ ______________________________________________________________________
### 1.1 artifact lifecycle states
-An artifact (skill, agent, instruction, prompt, hook) exists in one of these states relative
+An artifact (skill, agent, instruction, hook) exists in one of these states relative
to the target `.github/` directory:
```text
@@ -83,8 +83,7 @@ stateDiagram-v2
],
"agents": [],
"hooks": [],
- "instructions": [],
- "prompts": []
+ "instructions": []
}
}
```
@@ -390,13 +389,22 @@ guidance, field semantics, examples, and template structure, see the dedicated d
| `description` | string | **yes** | When this instruction applies |
| `applyTo` | string | no | Glob pattern e.g. `"**/*.py"` or `"**/*"` |
-### 3.4 prompt frontmatter (`config.yaml`)
+### 3.4 retired prompt migration
-| Field | Type | Required | Notes |
-| ------------- | ------ | -------- | ----------------------------------- |
-| `name` | string | **yes** | Matches directory name; kebab-case |
-| `description` | string | **yes** | What this prompt does |
-| `mode` | string | no | `"ask"` \| `"edit"` \| `"generate"` |
+The prompt generator and frontmatter schema are removed in the next major release.
+The manifest remains schema v2 and accepts legacy `prompts` entries for migration.
+
+After successful skill generation, `InitCommand` compares legacy entries with the
+canonical prompt-to-skill mapping. Only known entries at
+`prompts/.prompt.md`, without symlinked paths, with matching stored checksums,
+and with successfully installed or unchanged replacement skills can be retired.
+Unknown, conflicting, modified, or unreadable entries are retained and reported.
+Dry-run simulates both generation and retirement without changing files or state.
+Non-skill installs preserve prompt tracking unchanged.
+
+Converted skills are explicitly invoked (`disable-model-invocation: true`).
+Overlapping workflows use existing skills without command aliases. See
+[Prompt migration](../user/reference/prompt-migration.md) for the complete mapping.
______________________________________________________________________
@@ -439,7 +447,7 @@ Every generated artifact ends with this block when `auto_gen_footer=True`:
- Human-readable line: constant in `src/vstack/artifacts/constants.py`
- Machine-readable `VSTACK-META` line: emitted by `GenericArtifactGenerator._build_footer`
-- Markdown artifact types (`skill`, `agent`, `instruction`, `prompt`) use
+- Markdown artifact types (`skill`, `agent`, `instruction`) use
`auto_gen_footer=True`; JSON hooks use `auto_gen_footer=False`
______________________________________________________________________
diff --git a/docs/design/skills.md b/docs/design/skills.md
index fa7b92df..5b043349 100644
--- a/docs/design/skills.md
+++ b/docs/design/skills.md
@@ -52,6 +52,7 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `adr` | Architecture Decision Record writing. Documents a decision with context, alternatives, and rationale. | architect | `docs/architecture/adr/NNN-*.md` |
| `analyse` | Cross-cutting technical analysis. Investigates impact, tradeoffs, root causes, or feasibility without implementing changes. | engineer, architect | analysis report |
| `architecture` | Engineering-lead plan review. Lock in service boundaries, data models, API contracts, test strategy. | architect | `docs/architecture/overview.md` |
+| `artifact-integrity` | Explicit-only vstack source-to-generated-artifact audit. | engineer, tester | drift report |
| `ask` | Read-only technical Q&A. Clarifies ambiguous questions, gathers repository evidence, and returns concise answers with references and confidence. | all roles | referenced answer + next-step guidance |
| `aws-cli` | AWS CLI workflows for IAM, S3, EC2, RDS, ECS, Lambda, CloudWatch, Secrets Manager, and SSM Parameter Store. | engineer, tester | — |
| `cicd` | Write GitHub Actions CI/CD workflow configuration. Covers build, test, lint, security scan, container publish, deploy. | release | GitHub Actions workflow |
@@ -80,6 +81,7 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `k8s` | Write, review, and troubleshoot Kubernetes manifests and operations. Covers rollout safety, probes, RBAC, namespace isolation, and diagnostics. | engineer, tester | Kubernetes manifests |
| `lazy` | Engineer-focused minimal-change execution. Prefer avoid/delete/reuse/stdlib/native solutions before writing new code while keeping safety guarantees. | engineer | minimal safe implementation report + changes |
| `migrate` | Database migration review and authoring. Forwards/backwards compatibility, zero-downtime strategies, rollback plans, data integrity, index safety. | engineer, tester | reviewed/corrected migration SQL |
+| `migration-plan` | Explicit-only cross-component migration planning with validation and rollback. | engineer | migration plan |
| `onboard` | Generate a contributor onboarding guide. Prerequisites, setup, tests, env vars, architecture overview, good first issues. | product | `CONTRIBUTING.md` + README dev section |
| `openapi` | Write and review OpenAPI 3.1 specifications. Resource naming, HTTP semantics, status codes, error conventions, pagination, security schemes. | designer, engineer | `openapi.yaml` |
| `performance` | Performance profiling and regression detection. Establishes baselines, detects regressions, profiles bottlenecks. | engineer, tester | perf report |
@@ -87,7 +89,9 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `pr` | Commit, push, and open a pull request from the current branch to main. | release | commit + PR |
| `rancher` | Operate Kubernetes workloads and governance through Rancher. Covers project scope, RBAC, Fleet/GitOps basics, and multi-cluster checks. | engineer, tester | Rancher/Fleet config |
| `rca` | Root cause analysis for incidents and bugs. Guides a systematic technical investigation and produces an RCA document linked to the triggering issue. | engineer, tester | technical RCA |
+| `reasoning` | Explicit-only evidence-based critical thinking framework. | all roles | evaluation |
| `refactor` | Structured refactoring without behavior change. Identify smells, plan incremental steps, execute, verify correctness. | engineer | refactored code + green tests |
+| `release-check` | Explicit-only release evidence and sign-off audit; does not publish. | release, tester | readiness report |
| `release-notes` | Prepare release artifacts: write release notes, own CHANGELOG updates, produce `docs/releases/YYYY-MM-DD.md`. | release | CHANGELOG + release doc |
| `requirements` | Collaborative requirements gathering. Clarifies what must be built, defines success criteria and NFRs. | product | `docs/product/requirements.md` |
| `secret-scan` | Configure GitHub secret scanning and push protection. Path exclusions, custom patterns, alert triage, and credential remediation. | tester, engineer | `.github/secret_scanning.yml` |
@@ -97,8 +101,15 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `terraform` | Write, review, and refactor Terraform IaC. Module structure, state management, variable conventions, provider pinning, and security hardening. | engineer | Terraform config files |
| `terragrunt` | Write, review, and refactor Terragrunt DRY multi-environment IaC. Root config, dependency blocks, `_envcommon`, and run-all workflows. | engineer | `terragrunt.hcl` files |
| `threat-model` | Threat modeling with STRIDE-first identification, optional DREAD prioritization, and selective PASTA depth for critical systems. | architect, tester, engineer, designer | `docs/architecture/threat-model.md` |
+| `upgrade-plan` | Explicit-only upgrade plan with compatibility and rollback checks. | engineer, tester | upgrade plan |
| `verify` | Verification fix-loop with mode routing (quick/standard/exhaustive). Runs targeted checks, fixes by severity, and re-verifies impacted paths. | engineer, tester | fixes + verification report |
| `vision` | CEO/founder-mode plan review. Rethink from first principles, validate ambition, find the 10x solution. | product | `docs/product/vision.md` |
+| `workflow-check` | Explicit-only stage, gate, and handoff integrity audit. | planner, tester | workflow report |
+
+The next major release removes prompt artifacts in favor of skills.
+Converted workflows retain their bodies and output sections, but do not select
+an agent or model. Existing replacement skills keep their own invocation policy.
+See [Prompt migration](../user/reference/prompt-migration.md) for all replacements.
### changedoc ownership model
diff --git a/docs/design/workflow.md b/docs/design/workflow.md
index 73145bfc..442a6325 100644
--- a/docs/design/workflow.md
+++ b/docs/design/workflow.md
@@ -18,6 +18,11 @@ For authoring boundaries between reusable guidance mechanisms:
- [013-instructions-vs-skills-boundary.md](../architecture/adr/013-instructions-vs-skills-boundary.md)
- [028-dag-dependency-semantics.md](../architecture/adr/028-dag-dependency-semantics.md)
+Reusable workflows use skills, not prompt files. The six converted planning and
+audit skills remain explicitly invoked; overlapping former prompts route users
+to existing skills. Role selection, handoff prompt strings, and the Option B
+pipeline are unchanged. See [Prompt migration](../user/reference/prompt-migration.md).
+
______________________________________________________________________
## workflow modes
diff --git a/docs/product/requirements.md b/docs/product/requirements.md
index 6bc77890..b363462a 100644
--- a/docs/product/requirements.md
+++ b/docs/product/requirements.md
@@ -8,7 +8,7 @@ ______________________________________________________________________
## context
vstack is a VS Code-native AI engineering workflow system. It installs structured
-agents, skills, instructions, and prompts into `.github/` so GitHub Copilot Agent
+agents, skills, instructions, and hooks into `.github/` so GitHub Copilot Agent
Mode has a clear operating model. vstack is distributed as a standalone Python CLI
tool via PyPI (`pipx install vstack`) with a single runtime dependency
(`pyyaml>=6.0`) for YAML frontmatter parsing (see ADR-025). A Homebrew private tap
@@ -24,8 +24,7 @@ ______________________________________________________________________
- Source templates live under `src/vstack/_templates///`.
- Supported artifact types: `skill` (`.github/skills//SKILL.md`), `agent`
(`.github/agents/.agent.md`), `instruction`
- (`.github/instructions/.instructions.md`), `prompt`
- (`.github/prompts/.prompt.md`), `hook`
+ (`.github/instructions/.instructions.md`), `hook`
(`.github/hooks/.json`).
- At generation time the generator resolves `{{TOKEN}}` placeholders from shared
partials and injects frontmatter validated against the artifact schema.
@@ -58,6 +57,11 @@ ______________________________________________________________________
- `--update` rewrites only when a newer version is available and the tracked file is
still clean. Mutually exclusive with `--force`.
- `--dry-run` prints what would change without writing any files.
+- The next major release retires the prompt family. `install` and `init` with
+ skills selected install replacements before removing known, unchanged,
+ manifest-tracked prompts. Unsafe, custom, or modified files remain tracked and
+ reported; force options do not bypass retirement safeguards. See
+ [Prompt migration](../user/reference/prompt-migration.md) and ADR-032.
### FR-5 — uninstall
diff --git a/docs/product/roadmap.md b/docs/product/roadmap.md
index 718bea8c..62c54b29 100644
--- a/docs/product/roadmap.md
+++ b/docs/product/roadmap.md
@@ -7,51 +7,52 @@ ______________________________________________________________________
## feature status table
-| Feature | Version | Status | Notes |
-| --------------------------------------------- | ------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| foundation | v1.0.0 | shipped | Core template-driven install model is in place |
-| backend-first verification | v1.0.0 | shipped | Verify/inspect focus on contracts, observability, security |
-| VS Code agent migration | v1.x | shipped | Native `.github/agents/*.agent.md` output format implemented |
-| role model + doc restructure | v1.1.0 | shipped | 6-role model, agent templates, and docs baseline established |
-| CLI modularisation | v2.0.0 | shipped | 12 focused CLI modules; BaseCommand + CommandContext contract |
-| manifest package | v2.0.0 | shipped | Dedicated `manifest/` package; atomic writes (ADR-016) |
-| mypy type checking | v2.0.0 | shipped | Full mypy coverage enforced in CI; 100% test coverage gate |
-| manifest schema versioning | v2.0.0 | shipped | `manifest_version: 2`; upgrade path via `manifest upgrade` (ADR-014) |
-| checksum backfill | v2.0.0 | shipped | `manifest upgrade --backfill` adds SHA-256 for VSTACK-META-tagged files (ADR-017) |
-| conservative install | v2.0.0 | shipped | Untracked files never overwritten; checksum-gated update (ADR-015, superseded by ADR-020) |
-| dry-run install | v2.1.0 | shipped | `vstack install --dry-run` previews actions; type/name selectors in summary |
-| new skill scaffolding | v2.2.0 | shipped | 47-skill set with canonical naming |
-| agent skill wiring | v2.2.0 | shipped | Role-to-skill mapping, handoffs, and concise modes wired into all agents |
-| project-scope directory | v3.0.0 | shipped | `.vstack/` directory: `config.yaml`, manifest, delta templates (ADR-019) |
-| install/init command semantics | v3.0.0 | shipped | `install` = first-run setup; `init` = idempotent CI regeneration (ADR-020, breaking change) |
-| manifest relocation | v3.0.0 | shipped | `vstack.json` moves from `.github/` to `.vstack/`; migration via `manifest upgrade` (ADR-014) |
-| selective install | v3.0.0 | shipped | Per-type and per-name exclusions via `exclude:` in `.vstack/config.yaml`; agents always installed (ADR-022) |
-| workflow contract source-of-truth | v3.1.0 | shipped | `workflow:` block in `.vstack/config.yaml`; `gate`, `hitl`, `handoffs` schema; `vstack migrate` command (ADR-023, ADR-026) |
-| agent hooks support | v3.2.0 | shipped | First-class `hook` artifact type: generate `.github/hooks/.json` from templates and track in manifest |
-| optional orchestrated role pipeline | v3.2.0 | shipped | `planner` coordinator agent implemented with mode-aware generation; default mode is `agentic` (`manual` and `hybrid` also supported) |
-| parallel workflow via DAG model | v3.3.0 | shipped | `depends_on` DAG semantics and planner parallel scheduling are shipped in v3.3.0 |
-| new skills (next batch) | v3.3.0 | shipped | `space-setup`: set up Copilot Spaces; `copilot-ops`: operate Copilot governance settings with audit-first checks |
-| golden-fixture coverage expansion | v3.3.0 | shipped | Extend deterministic golden fixtures to cover additional high-impact templates per artifact type. |
-| defect-fixture matrix expansion | v3.3.0 | shipped | Expand defect fixtures across artifact types and failure classes with stable expected error assertions. |
-| planner routing refinement | v3.4.0 | shipped | Planner/orchestrator routing follow-up to the DAG work |
-| Homebrew distribution | v3.5.0 | shipped | Homebrew tap/formula publish flow added for install and upgrade via `brew` |
-| configurable skill output paths | t.b.d. | candidate | Replace hardcoded skill artifact/output paths (for example changedoc location conventions) with project-configurable path settings while preserving safe defaults. |
-| docs information architecture (Diataxis) | t.b.d. | candidate | `docs/user/` scaffold and navigation are in place with segmented tutorials/how-to/reference/explanation routes; broader migration and fully realized IA come later |
-| team customization layer | t.b.d. | candidate | Deferred major update after VS Code-first model proves itself; custompacks, overlay merge rules, and install profiles all add major maintenance surface |
-| multi-IDE support (IntelliJ first) | t.b.d. | candidate | Deferred until vstack proves stable in VS Code; likely a major follow-up because it needs separate targets, schemas, and more maintenance |
-| plugin/bundle distribution model | t.b.d. | candidate | A self-contained, versioned bundle of vstack artifacts as a distribution model with no external registry or repository mapping |
-| artifact integrity and verification hardening | t.b.d. | candidate | Layered checks, generated-artifact drift detection, and deterministic fixtures to reduce release risk. |
-| hook telemetry parser hardening (P2) | t.b.d. | candidate | Optional deeper payload normalization for actor/tool/model extraction across broader event shapes without adding runtime dependencies. |
-| planner analytics enrichment (P2) | t.b.d. | candidate | Optional aggregation/reporting on stage-report telemetry (`planner_run_id`, `model_used`, `subagents_invoked`) for post-run analysis. |
-| template-change-aware fixture CI gate | t.b.d. | candidate | Require fixture drift checks automatically in CI whenever template sources are modified. |
-| fixture update policy in PR workflow | t.b.d. | candidate | Enforce contributor guidance that intended generated-output changes include fixture updates in the same pull request. |
-| deeper targeted verify tier | t.b.d. | candidate | Define and run a deeper pre-merge/release verification tier covering integration, fixture, and contract checks. |
-| obsolete artifact pruning for init | v3.5.x | shipped | `init --prune` removes safe obsolete tracked artifacts; default run reports candidates and preserves files; hook generator trailing-newline stability fix included. |
-| heavy agent runtime framework | — | not planned | Keeps runtime lightweight and transparent |
-| cloud control plane dependency | — | not planned | Keeps operation local/offline-capable |
-| VS Code extension packaging | — | not planned | Not required for current install model |
-| browser automation as default dependency | — | not planned | Backend/microservice-first remains default |
-| install target directory override | — | not planned | Won't implement unless a concrete tool incompatibility with `.github/` arises |
+| Feature | Version | Status | Notes |
+| --------------------------------------------- | ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| foundation | v1.0.0 | shipped | Core template-driven install model is in place |
+| backend-first verification | v1.0.0 | shipped | Verify/inspect focus on contracts, observability, security |
+| VS Code agent migration | v1.x | shipped | Native `.github/agents/*.agent.md` output format implemented |
+| role model + doc restructure | v1.1.0 | shipped | 6-role model, agent templates, and docs baseline established |
+| CLI modularisation | v2.0.0 | shipped | 12 focused CLI modules; BaseCommand + CommandContext contract |
+| manifest package | v2.0.0 | shipped | Dedicated `manifest/` package; atomic writes (ADR-016) |
+| mypy type checking | v2.0.0 | shipped | Full mypy coverage enforced in CI; 100% test coverage gate |
+| manifest schema versioning | v2.0.0 | shipped | `manifest_version: 2`; upgrade path via `manifest upgrade` (ADR-014) |
+| checksum backfill | v2.0.0 | shipped | `manifest upgrade --backfill` adds SHA-256 for VSTACK-META-tagged files (ADR-017) |
+| conservative install | v2.0.0 | shipped | Untracked files never overwritten; checksum-gated update (ADR-015, superseded by ADR-020) |
+| dry-run install | v2.1.0 | shipped | `vstack install --dry-run` previews actions; type/name selectors in summary |
+| new skill scaffolding | v2.2.0 | shipped | 47-skill set with canonical naming |
+| agent skill wiring | v2.2.0 | shipped | Role-to-skill mapping, handoffs, and concise modes wired into all agents |
+| project-scope directory | v3.0.0 | shipped | `.vstack/` directory: `config.yaml`, manifest, delta templates (ADR-019) |
+| install/init command semantics | v3.0.0 | shipped | `install` = first-run setup; `init` = idempotent CI regeneration (ADR-020, breaking change) |
+| manifest relocation | v3.0.0 | shipped | `vstack.json` moves from `.github/` to `.vstack/`; migration via `manifest upgrade` (ADR-014) |
+| selective install | v3.0.0 | shipped | Per-type and per-name exclusions via `exclude:` in `.vstack/config.yaml`; agents always installed (ADR-022) |
+| workflow contract source-of-truth | v3.1.0 | shipped | `workflow:` block in `.vstack/config.yaml`; `gate`, `hitl`, `handoffs` schema; `vstack migrate` command (ADR-023, ADR-026) |
+| agent hooks support | v3.2.0 | shipped | First-class `hook` artifact type: generate `.github/hooks/.json` from templates and track in manifest |
+| optional orchestrated role pipeline | v3.2.0 | shipped | `planner` coordinator agent implemented with mode-aware generation; default mode is `agentic` (`manual` and `hybrid` also supported) |
+| parallel workflow via DAG model | v3.3.0 | shipped | `depends_on` DAG semantics and planner parallel scheduling are shipped in v3.3.0 |
+| new skills (next batch) | v3.3.0 | shipped | `space-setup`: set up Copilot Spaces; `copilot-ops`: operate Copilot governance settings with audit-first checks |
+| golden-fixture coverage expansion | v3.3.0 | shipped | Extend deterministic golden fixtures to cover additional high-impact templates per artifact type. |
+| defect-fixture matrix expansion | v3.3.0 | shipped | Expand defect fixtures across artifact types and failure classes with stable expected error assertions. |
+| planner routing refinement | v3.4.0 | shipped | Planner/orchestrator routing follow-up to the DAG work |
+| Homebrew distribution | v3.5.0 | shipped | Homebrew tap/formula publish flow added for install and upgrade via `brew` |
+| skills replace prompt artifacts | next major | implemented | Retire the prompt family, reuse 11 existing workflows, convert six unique skills, and safely clean tracked prompts during install/init (ADR-032). |
+| configurable skill output paths | t.b.d. | candidate | Replace hardcoded skill artifact/output paths (for example changedoc location conventions) with project-configurable path settings while preserving safe defaults. |
+| docs information architecture (Diataxis) | t.b.d. | candidate | `docs/user/` scaffold and navigation are in place with segmented tutorials/how-to/reference/explanation routes; broader migration and fully realized IA come later |
+| team customization layer | t.b.d. | candidate | Deferred major update after VS Code-first model proves itself; custompacks, overlay merge rules, and install profiles all add major maintenance surface |
+| multi-IDE support (IntelliJ first) | t.b.d. | candidate | Deferred until vstack proves stable in VS Code; likely a major follow-up because it needs separate targets, schemas, and more maintenance |
+| plugin/bundle distribution model | t.b.d. | candidate | A self-contained, versioned bundle of vstack artifacts as a distribution model with no external registry or repository mapping |
+| artifact integrity and verification hardening | t.b.d. | candidate | Layered checks, generated-artifact drift detection, and deterministic fixtures to reduce release risk. |
+| hook telemetry parser hardening (P2) | t.b.d. | candidate | Optional deeper payload normalization for actor/tool/model extraction across broader event shapes without adding runtime dependencies. |
+| planner analytics enrichment (P2) | t.b.d. | candidate | Optional aggregation/reporting on stage-report telemetry (`planner_run_id`, `model_used`, `subagents_invoked`) for post-run analysis. |
+| template-change-aware fixture CI gate | t.b.d. | candidate | Require fixture drift checks automatically in CI whenever template sources are modified. |
+| fixture update policy in PR workflow | t.b.d. | candidate | Enforce contributor guidance that intended generated-output changes include fixture updates in the same pull request. |
+| deeper targeted verify tier | t.b.d. | candidate | Define and run a deeper pre-merge/release verification tier covering integration, fixture, and contract checks. |
+| obsolete artifact pruning for init | v3.5.x | shipped | `init --prune` removes safe obsolete tracked artifacts; default run reports candidates and preserves files; hook generator trailing-newline stability fix included. |
+| heavy agent runtime framework | — | not planned | Keeps runtime lightweight and transparent |
+| cloud control plane dependency | — | not planned | Keeps operation local/offline-capable |
+| VS Code extension packaging | — | not planned | Not required for current install model |
+| browser automation as default dependency | — | not planned | Backend/microservice-first remains default |
+| install target directory override | — | not planned | Won't implement unless a concrete tool incompatibility with `.github/` arises |
______________________________________________________________________
@@ -305,7 +306,7 @@ Rules:
- **Agents** — can be customized (description, tools, handoffs, prompt body); cannot be removed
(the six-role chain is an atomic unit, ADR-022)
- **Skills** — can be overridden entirely with a company version, or supplemented with new skills
-- **Instructions and prompts** — fully under team control; vstack defaults are a starting point
+- **Instructions** — fully under team control; vstack defaults are a starting point
- **Custompacks** — a named bundle of overrides and additions tracked in the manifest alongside first-party artifacts
Planned direction:
@@ -313,7 +314,7 @@ Planned direction:
- Define a `custompack` artifact type: a directory of templates with the same structure as
`src/vstack/_templates/` that a team maintains in their own repo
- `vstack install --pack ` installs the custompack after the base set; team artifacts
- win on conflict for skills, instructions, and prompts; agents are merged, not replaced
+ win on conflict for skills and instructions; agents are merged, not replaced
- Track custompack artifacts in `vstack.json` with a `source: custompack` marker so
`vstack status` and `uninstall` can distinguish first-party from team-owned files
- Add a `vstack pack init` scaffold command to create a well-structured custompack starter
@@ -321,7 +322,7 @@ Planned direction:
Overlay model (template source priority):
- Multiple template sources resolved in priority order: upstream vstack first, custompack second
-- Conflict resolution is deterministic: custompack wins for skills, instructions, and prompts;
+- Conflict resolution is deterministic: custompack wins for skills and instructions;
agents are merged (custompack fields override, core structure preserved)
- Source-aware checksums in `vstack.json` so updates can be applied safely per origin
- Longer term, if still justified: `vstack install --profile company` for named install profiles
@@ -527,7 +528,7 @@ Reference:
### portable bundle format [candidate — t.b.d.]
A portable bundle packages a curated set of vstack artifacts — agents, skills, instructions,
-prompts, and hooks — as a single versioned unit. The bundle can be distributed and installed
+and hooks — as a single versioned unit. The bundle can be distributed and installed
without coupling to any external registry or specific repository.
Scope to evaluate:
@@ -556,8 +557,9 @@ guidance on which checks apply after each class of change.
- Add a change-trigger validation matrix to `CONTRIBUTING.md` that maps change types to required
checks (e.g. template change → `python3 -m vstack install` + `make test-local`).
-- Expand the prompt catalog with `repo-assessment` and `artifact-integrity` prompts so engineers
- can run structured repository and drift assessments on demand.
+- Use `inspect` for repository assessment and `artifact-integrity` for explicit
+ source-to-generated drift audits. The next major release replaces the old
+ prompt catalog with skills; see [Prompt migration](../user/reference/prompt-migration.md).
**Phase B — generated-artifact drift guard:**
@@ -611,7 +613,7 @@ Tracked as dedicated candidate items in the feature status table: template-chang
- Contributors always know which checks to run after any class of change.
- Regressions in artifact generation are caught before they reach main.
-- Structured prompt artifacts enable repeatable repo-health reviews and drift audits.
+- Structured skills enable repeatable repo-health reviews and drift audits.
- The verify loop is both faster for day-to-day work and more thorough at the release gate.
______________________________________________________________________
@@ -647,10 +649,18 @@ ______________________________________________________________________
`vstack install --global` is now scoped to VS Code user-profile artifacts only:
- `agents/`
-- `prompts/`
- `instructions/`
- `skills/`
- `hooks/`
All global-supported artifact types are included above. vstack provides generic,
reusable behavior; project-specific customization is out of scope.
+
+### prompt retirement [next major]
+
+Remove the prompt generator and selectors, retain legacy manifest parsing for safe
+upgrade cleanup, and use skills for reusable workflows. Six converted skills remain
+explicit-only; eleven overlapping prompts reuse existing skills. Role agents and
+Option B stage/handoff contracts remain unchanged. Historical shipped prompt-fixture
+milestones above describe earlier releases, not the current artifact inventory.
+See [ADR-032](../architecture/adr/032-skills-replace-prompts.md).
diff --git a/docs/user/README.md b/docs/user/README.md
index 3825d76c..da24af12 100644
--- a/docs/user/README.md
+++ b/docs/user/README.md
@@ -17,7 +17,7 @@ This subtree contains user-facing documentation.
- [Reinitialize](how-to/reinitialize.md)
- [Partial upgrade](how-to/partial-upgrade.md)
- [Configure workflow modes](how-to/configure-workflow-modes.md)
- - [Choose agent, skill, or prompt](how-to/choose-agent-skill-or-prompt.md)
+ - [Choose agent or skill](how-to/choose-agent-or-skill.md)
- [How to install a skill](how-to/how-to-install-a-skill.md)
- [Install and upgrade](how-to/install-and-upgrade.md)
- [Troubleshooting](how-to/troubleshooting.md)
@@ -25,7 +25,7 @@ This subtree contains user-facing documentation.
- [CLI commands](reference/cli-commands.md)
- [Configuration](reference/configuration.md)
- [Hooks](reference/hooks.md)
- - [Prompts overview](reference/prompts-overview.md)
+ - [Prompt migration](reference/prompt-migration.md)
- [Skills overview](reference/skills-overview.md)
- [Instructions overview](reference/instructions-overview.md)
- [Artifact checks](reference/artifact-checks.md)
diff --git a/docs/user/how-to/README.md b/docs/user/how-to/README.md
index f56be71f..23ebd443 100644
--- a/docs/user/how-to/README.md
+++ b/docs/user/how-to/README.md
@@ -6,7 +6,7 @@ Use this section when you already know what you want to achieve and need direct,
Each guide should focus on one outcome and avoid conceptual digressions.
- [How to install a skill](how-to-install-a-skill.md)
-- [Choose agent, skill, or prompt](choose-agent-skill-or-prompt.md)
+- [Choose agent or skill](choose-agent-or-skill.md)
- [Install and upgrade](install-and-upgrade.md)
- [Global install](global-install.md)
- [Uninstall](uninstall.md)
diff --git a/docs/user/how-to/choose-agent-skill-or-prompt.md b/docs/user/how-to/choose-agent-or-skill.md
similarity index 83%
rename from docs/user/how-to/choose-agent-skill-or-prompt.md
rename to docs/user/how-to/choose-agent-or-skill.md
index 6f506d48..25c3930f 100644
--- a/docs/user/how-to/choose-agent-skill-or-prompt.md
+++ b/docs/user/how-to/choose-agent-or-skill.md
@@ -1,4 +1,4 @@
-# Choose agent, skill, or prompt
+# Choose Agent or Skill
Use this guide to decide how to run work in Copilot Chat with vstack.
@@ -16,11 +16,8 @@ Use a skill when:
- you already know the scope and want a direct playbook,
- you do not need full multi-role orchestration.
-Use a prompt when:
-
-- you need lightweight, one-off guidance,
-- you want to adapt wording for a specific context quickly,
-- you are not changing the role model or skill inventory.
+Use an ordinary chat message for one-off questions that need no reusable
+procedure. vstack no longer generates prompt files.
## Practical examples
@@ -29,14 +26,14 @@ Use a prompt when:
| Plan and execute a feature across design, implementation, and verification | Agent (`planner`) | Planner coordinates role flow and handoffs. |
| Fix failing checks before merge | Skill (`verify`) | Verify provides targeted fix-loop behavior. |
| Investigate a production bug cause | Skill (`debug`) | Debug is optimized for root-cause-first investigation. |
-| Ask for a one-off API naming suggestion | Prompt | Fast and local, no orchestration needed. |
+| Ask for a one-off API naming suggestion | Chat message | Fast and local, no orchestration needed. |
| Generate release artifacts from completed work | Agent (`release`) | Release role owns release gating outputs. |
## Escalation pattern
Start small, then escalate only when needed:
-1. Start with a prompt for low-risk, narrow tasks.
+1. Start with a chat message for low-risk, narrow tasks.
1. Move to a skill for repeatable specialist work.
1. Move to an agent when ownership boundaries and workflow handoffs matter.
@@ -45,5 +42,5 @@ Start small, then escalate only when needed:
- [Start Here](../start-here.md)
- [First planner run](../tutorials/first-planner-run.md)
- [Skills overview](../reference/skills-overview.md)
-- [Prompts overview](../reference/prompts-overview.md)
+- [Prompt migration](../reference/prompt-migration.md)
- [Work items](../reference/work-items.md)
diff --git a/docs/user/how-to/global-install.md b/docs/user/how-to/global-install.md
index 4afa1e9d..66cf554b 100644
--- a/docs/user/how-to/global-install.md
+++ b/docs/user/how-to/global-install.md
@@ -21,7 +21,7 @@ vstack install --global
Install selected artifact families only:
```bash
-vstack install --global --only agent skill prompt instruction hook
+vstack install --global --only agent skill instruction hook
```
## Update global artifacts
diff --git a/docs/user/how-to/partial-upgrade.md b/docs/user/how-to/partial-upgrade.md
index b4e06c4b..675c0e72 100644
--- a/docs/user/how-to/partial-upgrade.md
+++ b/docs/user/how-to/partial-upgrade.md
@@ -20,7 +20,7 @@ vstack init --only agent
Multiple types:
```bash
-vstack init --only skill prompt instruction
+vstack init --only skill instruction
```
Hooks only:
@@ -47,6 +47,8 @@ vstack manifest verify --target . --only agent
- Partial upgrade can leave other artifact types on older generated output.
- For broad CLI upgrades, a full `vstack init` is still the safest final step.
+- Safe prompt retirement runs only when skills are selected. See
+ [Prompt migration](../reference/prompt-migration.md).
## Related Docs
diff --git a/docs/user/how-to/reinitialize.md b/docs/user/how-to/reinitialize.md
index 9ed41b4d..f1c5c9e1 100644
--- a/docs/user/how-to/reinitialize.md
+++ b/docs/user/how-to/reinitialize.md
@@ -26,7 +26,7 @@ Use `--only` when you want a narrower regeneration scope:
```bash
vstack init --only agent
-vstack init --only skill prompt
+vstack init --only skill
vstack init --only hook
```
@@ -44,6 +44,10 @@ Preview prune actions without writing files:
vstack init --prune --dry-run
```
+Retired built-in prompts are a targeted migration exception: `init` and `install`
+remove safe tracked prompts automatically after their replacement skills are
+available. See [Prompt migration](../reference/prompt-migration.md).
+
## Verify the Reinitialized State
```bash
diff --git a/docs/user/how-to/upgrade.md b/docs/user/how-to/upgrade.md
index f4fc8949..90f2ddea 100644
--- a/docs/user/how-to/upgrade.md
+++ b/docs/user/how-to/upgrade.md
@@ -17,6 +17,12 @@ vstack init
`vstack init` is idempotent. You can run it repeatedly after upgrades.
+The next major release replaces prompts with skills. `init` and `install`
+automatically retire unchanged, tracked built-in prompts once their replacement
+skills are available. Modified and unmanaged files are preserved.
+Preview with `vstack init --dry-run`; see [Prompt migration](../reference/prompt-migration.md)
+for the command mapping, exclusions, and manual recovery.
+
## 3. Verify After Upgrade
The commands in this guide assume you run them from the repository root, so `--target` is omitted.
diff --git a/docs/user/reference/README.md b/docs/user/reference/README.md
index b3664f63..547997c8 100644
--- a/docs/user/reference/README.md
+++ b/docs/user/reference/README.md
@@ -15,7 +15,7 @@ Reference pages should be precise, complete, and free of tutorial flow.
- [CLI commands](cli-commands.md)
- [Configuration](configuration.md)
- [Hooks](hooks.md)
-- [Prompts overview](prompts-overview.md)
+- [Prompt migration](prompt-migration.md)
- [Skills overview](skills-overview.md)
- [Instructions overview](instructions-overview.md)
- [Artifact checks](artifact-checks.md)
diff --git a/docs/user/reference/cli-commands.md b/docs/user/reference/cli-commands.md
index 7a9d0fb7..f892dbaf 100644
--- a/docs/user/reference/cli-commands.md
+++ b/docs/user/reference/cli-commands.md
@@ -56,6 +56,12 @@ vstack manifest upgrade --target .
Both commands default to current working directory when `--target` is omitted.
+The active artifact types are `skill`, `agent`, `instruction`, and `hook`.
+The `prompt` family is retired. With skills selected, both install commands
+automatically retire safe, tracked legacy prompts after replacements are
+available; no `--prune` flag is needed for this migration.
+See [Prompt migration](prompt-migration.md) for safeguards and replacement commands.
+
`vstack init --prune` applies only to obsolete tracked artifacts where the current file content still matches the manifest checksum. Locally modified or untracked files are never removed by this flag.
For manual-edit preservation and force-overwrite flows, see [Update managed artifacts](../how-to/update-managed-artifacts.md).
diff --git a/docs/user/reference/configuration.md b/docs/user/reference/configuration.md
index 0b4bcc9a..a242f3aa 100644
--- a/docs/user/reference/configuration.md
+++ b/docs/user/reference/configuration.md
@@ -20,7 +20,6 @@ exclude:
- helm
- k8s
instructions: all
- prompts: all
hook: all
```
@@ -29,6 +28,8 @@ Rules:
- `type: all` skips an entire artifact type.
- `type: [name, ...]` skips only listed artifacts.
- Use exclusions to reduce generated surface for team needs.
+- `exclude.prompts` is retired and emits a warning. Configure replacement skills
+ instead; see [Prompt migration](prompt-migration.md).
## Workflow mode
diff --git a/docs/user/reference/instructions-overview.md b/docs/user/reference/instructions-overview.md
index f566a2c3..b8f859db 100644
--- a/docs/user/reference/instructions-overview.md
+++ b/docs/user/reference/instructions-overview.md
@@ -35,4 +35,4 @@ In vstack, instructions are generated into `.github/instructions/*.instructions.
- [Configuration](configuration.md)
- [Skills overview](skills-overview.md)
-- [Prompts overview](prompts-overview.md)
+- [Prompt migration](prompt-migration.md)
diff --git a/docs/user/reference/prompt-migration.md b/docs/user/reference/prompt-migration.md
new file mode 100644
index 00000000..c57d1404
--- /dev/null
+++ b/docs/user/reference/prompt-migration.md
@@ -0,0 +1,98 @@
+# Prompt Migration
+
+The next major version removes vstack's prompt artifact family. The VS Code Copilot
+harness does not load `*.prompt.md` files; Local harness sessions still support
+them. vstack now supplies reusable workflows as skills in
+`.github/skills//SKILL.md`.
+
+## Replacement Commands
+
+| Retired prompt | Replacement skill | Change |
+| -------------------- | -------------------- | ------------------------------------------------------------------ |
+| `api-design-review` | `openapi` | Reuse API contract writing and review. |
+| `architecture-risk` | `architecture` | Reuse architecture and execution-plan review. |
+| `artifact-integrity` | `artifact-integrity` | New explicit-only skill; vstack source audit. |
+| `ci-triage` | `debug` | Reuse root-cause investigation for CI failures. |
+| `dependency-audit` | `dependency` | Reuse dependency health auditing. |
+| `incident-timeline` | `postmortem` | Reuse incident timeline and postmortem workflow. |
+| `migration-plan` | `migration-plan` | New explicit-only cross-component planning skill. |
+| `migration-safety` | `migrate` | Reuse database migration review. |
+| `ops-readiness` | `inspect` | Reuse reliability and observability auditing. |
+| `quick-review` | `code-review` | Reuse pre-landing review. |
+| `reasoning` | `reasoning` | New explicit-only reasoning framework. |
+| `release-check` | `release-check` | New explicit-only release evidence audit, not release publication. |
+| `repo-assessment` | `inspect` | Reuse repository verification audit. |
+| `template-impact` | `analyse` | Reuse impact analysis. |
+| `test-gaps` | `inspect` | Reuse test and verification auditing. |
+| `upgrade-plan` | `upgrade-plan` | New explicit-only upgrade planning skill. |
+| `workflow-check` | `workflow-check` | New explicit-only stage, gate, and handoff audit. |
+
+Invoke skills with `/name`, for example `/code-review`. References such as
+`prompt/reasoning` become `skill/reasoning`. Existing replacement skills keep their
+own procedure and output format; the old prompt output contracts are not aliases.
+For example, `debug` may proceed to a fix and `inspect` can run checks; request a
+report-only scope when that is what you need.
+
+Converted skills have `user-invocable: true` and `disable-model-invocation: true`.
+Their bodies and output sections are preserved, but prompt-specific `agent`,
+`model`, and `tools` selection is not. Select a role agent separately when needed.
+The skills' `allowed-tools` metadata is not a replacement for runtime permissions.
+
+## Upgrade Safely
+
+After upgrading the CLI, preview and apply the artifact migration:
+
+```bash
+vstack init --dry-run
+vstack init
+vstack manifest verify
+```
+
+`vstack install` performs the same artifact migration. `vstack migrate` handles
+role-document paths, not prompt conversion. Installing the Python package alone
+does not change repository files.
+
+During an install with skills selected:
+
+1. Generate and install replacement skills using conservative install rules.
+1. Inspect legacy `prompts` entries in the install manifest.
+1. Remove only known, canonical, non-symlinked prompt files matching their stored
+ checksum and whose replacement skill was installed or verified unchanged.
+1. Remove their manifest entries and empty prompt directories.
+
+No `--prune` flag is needed for this targeted retirement. Other obsolete artifact
+cleanup still requires `init --prune`.
+
+Untracked files are never touched. Modified, unreadable, checksum-less, unknown,
+or unsafe-path prompts are preserved, reported, and kept in the manifest for
+retry. Missing old files can be cleared from tracking after the replacement is
+available. `--force` does not bypass prompt deletion safeguards.
+
+If skills are not selected, or a replacement skill is excluded, locally modified,
+untracked, or merely adopted, migration is deferred. Resolve the reported conflict
+and rerun `vstack init`. Review and migrate preserved custom workflows manually;
+vstack does not delete unknown custom prompts or scan directories for ownership.
+
+Deletion errors are reported with a nonzero exit code. The prompt's manifest entry
+is retained, so you can resolve the filesystem error and retry without losing
+ownership information.
+
+## Breaking Interfaces
+
+- `--only prompt` is no longer a valid CLI filter.
+- `prompt/` is no longer an install, force, or adoption selector.
+- `vstack.prompts`, `PromptGenerator`, and `PROMPT_SCHEMA` are removed.
+- Custom template packs must replace their prompt templates with skill templates.
+- `exclude.prompts` is retired and warns when read. Replace it with appropriate
+ `exclude.skills` entries; it no longer disables the replacement workflows.
+- Legacy manifest `prompts` entries remain readable for safe migration. Do not
+ hand-edit the manifest to claim ownership of files.
+
+See [ADR-032](../../architecture/adr/032-skills-replace-prompts.md) and the
+[VS Code migration guide](https://code.visualstudio.com/docs/agent-customization/migrate-customizations#_convert-prompt-files-to-skills).
+
+## Related Docs
+
+- [Skills overview](skills-overview.md)
+- [Instructions overview](instructions-overview.md)
+- [Work items](work-items.md)
diff --git a/docs/user/reference/prompts-overview.md b/docs/user/reference/prompts-overview.md
deleted file mode 100644
index e0844e71..00000000
--- a/docs/user/reference/prompts-overview.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Prompts Overview
-
-This page lists prompt templates built into the installed vstack package and explains what they are for.
-
-## What Prompts Are
-
-Prompts are reusable review and analysis templates that guide a focused task.
-
-In vstack, prompts are generated into `.github/prompts/*.prompt.md`.
-
-Prompt files should stay model-agnostic by default. Leave `model` out unless a prompt has a specific, justified need to pin a model for reproducibility or model-specific behavior.
-
-## Built-in Prompts
-
-| Prompt | Scope | What It Helps With |
-| -------------------- | ----------------- | --------------------------------------------------------------------------------------------------- |
-| `api-design-review` | `general-purpose` | Review an API design or OpenAPI spec for correctness, completeness, and consistency. |
-| `architecture-risk` | `general-purpose` | Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design. |
-| `artifact-integrity` | `vstack-internal` | Check source templates against generated artifacts and identify drift or missing regeneration. |
-| `ci-triage` | `general-purpose` | Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path. |
-| `quick-review` | `general-purpose` | Review a change for bugs, regressions, and missing tests. |
-| `dependency-audit` | `general-purpose` | Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene. |
-| `incident-timeline` | `general-purpose` | Build a structured, evidence-based incident timeline and action-oriented postmortem summary. |
-| `migration-plan` | `general-purpose` | Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints. |
-| `migration-safety` | `general-purpose` | Review database migration safety, rollback strategy, and zero-downtime risk. |
-| `ops-readiness` | `general-purpose` | Assess operational readiness across observability, runbooks, failure handling, and supportability. |
-| `release-check` | `general-purpose` | Evaluate release gate readiness using required reports, artifacts, and sign-off evidence. |
-| `repo-assessment` | `general-purpose` | Assess a repository for production-readiness gaps and prioritized improvements. |
-| `template-impact` | `general-purpose` | Assess impact of a template change on generated artifacts, tests, and release risk. |
-| `test-gaps` | `general-purpose` | Identify missing behavioral coverage and prioritize test additions by production risk. |
-| `upgrade-plan` | `general-purpose` | Build a safe upgrade plan with sequencing, compatibility checks, and rollback points. |
-| `workflow-check` | `general-purpose` | Review workflow stage flow, gate usage, and handoff integrity across role artifacts. |
-
-## Related Docs
-
-- [Skills overview](skills-overview.md)
-- [Instructions overview](instructions-overview.md)
-- [Work items](work-items.md)
diff --git a/docs/user/reference/skills-overview.md b/docs/user/reference/skills-overview.md
index 1476619e..9495fd6f 100644
--- a/docs/user/reference/skills-overview.md
+++ b/docs/user/reference/skills-overview.md
@@ -15,6 +15,7 @@ In vstack, skills are generated into `.github/skills//SKILL.md`.
| `adr` | Architecture Decision Record writing for significant technical decisions. |
| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. |
| `architecture` | Engineering-lead architecture and execution-plan review. |
+| `artifact-integrity` | Explicit-only audit of vstack source templates, installed artifacts, and manifest drift. |
| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. |
| `aws-cli` | AWS CLI operations across core AWS services. |
| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. |
@@ -43,6 +44,7 @@ In vstack, skills are generated into `.github/skills//SKILL.md`.
| `k8s` | Kubernetes manifest authoring and operational troubleshooting. |
| `lazy` | Engineer-first minimal-change implementation with safety guardrails. |
| `migrate` | Safe database migration planning and review. |
+| `migration-plan` | Explicit-only cross-component migration planning with checkpoints and rollback. |
| `onboard` | Contributor onboarding guide creation. |
| `openapi` | OpenAPI 3.1 specification writing and review. |
| `performance` | Benchmarking, profiling, and performance regression analysis. |
@@ -50,7 +52,9 @@ In vstack, skills are generated into `.github/skills//SKILL.md`.
| `pr` | Commit/push and pull-request creation workflow support. |
| `rancher` | Rancher and Fleet workload/governance operations. |
| `rca` | Technical root cause analysis for incidents and defects. |
+| `reasoning` | Explicit-only evidence-based critical thinking and evaluation framework. |
| `refactor` | Behavior-preserving structural refactoring. |
+| `release-check` | Explicit-only release evidence and sign-off audit without publishing. |
| `release-notes` | Release note artifact and changelog preparation. |
| `requirements` | Structured requirements gathering and documentation. |
| `secret-scan` | Secret scanning and push-protection setup and triage. |
@@ -60,11 +64,13 @@ In vstack, skills are generated into `.github/skills//SKILL.md`.
| `terraform` | Terraform IaC authoring and review. |
| `terragrunt` | Terragrunt DRY multi-environment configuration design. |
| `threat-model` | Threat modeling with STRIDE-first prioritization. |
+| `upgrade-plan` | Explicit-only upgrade planning with compatibility and rollback checks. |
| `verify` | Verification fix-loop with targeted re-checking. |
| `vision` | Scope and strategy review from first principles. |
+| `workflow-check` | Explicit-only workflow stage, gate, and handoff integrity review. |
## Related Docs
-- [Prompts overview](prompts-overview.md)
+- [Prompt migration](prompt-migration.md)
- [Instructions overview](instructions-overview.md)
- [Work items](work-items.md)
diff --git a/docs/user/reference/work-items.md b/docs/user/reference/work-items.md
index 64051da9..6cf8a2a0 100644
--- a/docs/user/reference/work-items.md
+++ b/docs/user/reference/work-items.md
@@ -43,5 +43,5 @@ They provide durable handoff context between stages.
- [Workflow modes explanation](../explanation/workflow-modes.md)
- [Configure workflow modes](../how-to/configure-workflow-modes.md)
- [Configuration](configuration.md)
-- [Prompts overview](prompts-overview.md)
+- [Prompt migration](prompt-migration.md)
- [Skills overview](skills-overview.md)
diff --git a/docs/user/start-here.md b/docs/user/start-here.md
index 233c5b88..68a2d7e9 100644
--- a/docs/user/start-here.md
+++ b/docs/user/start-here.md
@@ -43,7 +43,7 @@ vstack manifest verify --target .
## 3. Operations Path
1. Set operating behavior in [Configure workflow modes](how-to/configure-workflow-modes.md).
-1. Choose execution style with [Choose agent, skill, or prompt](how-to/choose-agent-skill-or-prompt.md).
+1. Choose execution style with [Choose agent or skill](how-to/choose-agent-or-skill.md).
1. Tune project settings in [Configuration](reference/configuration.md).
1. Manage automation points in [Hooks](reference/hooks.md).
1. Review role-owned outputs and handoff artifacts in [Work items](reference/work-items.md).
diff --git a/docs/user/tutorials/first-planner-run.md b/docs/user/tutorials/first-planner-run.md
index a9695a01..03ef9c45 100644
--- a/docs/user/tutorials/first-planner-run.md
+++ b/docs/user/tutorials/first-planner-run.md
@@ -51,6 +51,6 @@ If output does not look role-structured, verify that Agent mode is enabled and `
## Next steps
-1. Practice role targeting with [Choose agent, skill, or prompt](../how-to/choose-agent-skill-or-prompt.md).
+1. Practice role targeting with [Choose agent or skill](../how-to/choose-agent-or-skill.md).
1. Learn upgrade checks with [Upgrade with checks](upgrade-with-checks.md).
1. Keep command behavior handy with [CLI commands](../reference/cli-commands.md).
diff --git a/src/vstack/_templates/project/.vstack/config.yaml b/src/vstack/_templates/project/.vstack/config.yaml
index 048e3404..103b231a 100644
--- a/src/vstack/_templates/project/.vstack/config.yaml
+++ b/src/vstack/_templates/project/.vstack/config.yaml
@@ -25,7 +25,6 @@
# hooks:
# - post-edit-markdown-quality
# instructions: all
-# prompts: all
# -----------------------------------------------------------------------------
# REPOSITORY HOOKS
diff --git a/src/vstack/_templates/prompts/api-design-review/config.yaml b/src/vstack/_templates/prompts/api-design-review/config.yaml
deleted file mode 100644
index ffbccd7c..00000000
--- a/src/vstack/_templates/prompts/api-design-review/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: api-design-review
-description: Review an API design or OpenAPI spec for correctness, completeness, and consistency.
-argument-hint: "[OpenAPI spec file, design doc, or endpoint scope]"
-agent: designer
-tools:
- - read
- - search
-version: 20260502006
diff --git a/src/vstack/_templates/prompts/api-design-review/template.md b/src/vstack/_templates/prompts/api-design-review/template.md
deleted file mode 100644
index 29829807..00000000
--- a/src/vstack/_templates/prompts/api-design-review/template.md
+++ /dev/null
@@ -1,45 +0,0 @@
-Review the provided API design or OpenAPI specification for correctness, completeness, and consistency.
-
-Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions.
-Ignore implementation details and tooling preferences.
-
-Output exactly in this format:
-
-## Contract Issues
-
-List problems that would break or confuse consumers.
-
-For each item:
-
-- endpoint or field reference
-- what the problem is in one sentence
-- concrete fix
-
-## Naming and Consistency
-
-List naming violations, inconsistencies across endpoints, and deviations from REST conventions.
-
-## Missing Error Cases
-
-List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500).
-
-## Schema Completeness
-
-List fields or objects that are missing required constraints, descriptions, or examples.
-
-## Versioning and Compatibility
-
-- versioning strategy present: yes | no | partial
-- breaking changes relative to previous version: yes | no | unknown
-- backward compatibility risk: low | medium | high
-
-## Security Scheme Check
-
-- authentication documented: yes | no
-- authorization scopes documented where relevant: yes | no | partial
-- sensitive fields handled appropriately: yes | no | partial
-
-## Verdict
-
-- approve | approve-with-conditions | reject
-- top priority fix in one sentence
diff --git a/src/vstack/_templates/prompts/architecture-risk/config.yaml b/src/vstack/_templates/prompts/architecture-risk/config.yaml
deleted file mode 100644
index 93d486d0..00000000
--- a/src/vstack/_templates/prompts/architecture-risk/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: architecture-risk
-description: Identify architectural risks, tradeoffs, and mitigation priorities for a proposed design.
-argument-hint: "[design doc, ADR, or architecture scope]"
-agent: architect
-tools:
- - read
- - search
-version: 20260502007
diff --git a/src/vstack/_templates/prompts/architecture-risk/template.md b/src/vstack/_templates/prompts/architecture-risk/template.md
deleted file mode 100644
index d668c00c..00000000
--- a/src/vstack/_templates/prompts/architecture-risk/template.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Evaluate the provided architecture for delivery and runtime risk.
-
-Prioritize issues that could cause outages, data loss, severe operability pain, or major rework.
-Ignore stylistic preferences.
-
-Output exactly in this format:
-
-## High-Severity Risks
-
-List risks that can materially fail production or block safe delivery.
-
-For each risk:
-
-- impacted boundary (service, data, contract, deployment, observability, security)
-- why it is risky in one sentence
-- mitigation with smallest viable change
-- owner role
-
-## Medium Risks
-
-List important but non-blocking risks.
-
-## Tradeoff Notes
-
-List major tradeoffs and what is being optimized.
-
-## Missing Decisions
-
-List decisions that should become ADRs before implementation.
-
-## Recommended Sequence
-
-Provide an ordered mitigation sequence (step 1..N).
-
-## Security Considerations
-
-List security-specific risks not covered above: auth boundaries, sensitive data exposure, trust model assumptions, supply chain concerns.
-
-## Go/No-Go
-
-- go | conditional-go | no-go
-- one-sentence rationale
diff --git a/src/vstack/_templates/prompts/ci-triage/config.yaml b/src/vstack/_templates/prompts/ci-triage/config.yaml
deleted file mode 100644
index ce2ea6ce..00000000
--- a/src/vstack/_templates/prompts/ci-triage/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: ci-triage
-description: Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path.
-argument-hint: "[workflow run, failing job, or log scope]"
-agent: engineer
-tools:
- - read
- - search
-version: 20260513006
diff --git a/src/vstack/_templates/prompts/ci-triage/template.md b/src/vstack/_templates/prompts/ci-triage/template.md
deleted file mode 100644
index fb2cdc61..00000000
--- a/src/vstack/_templates/prompts/ci-triage/template.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Triage CI failures into root-cause clusters and prioritize the fastest safe recovery path.
-
-Use failing job logs, workflow config, and changed files.
-
-Output exactly in this format:
-
-## Failure Clusters
-
-For each cluster:
-
-- jobs affected
-- probable root cause
-- confidence: HIGH | MEDIUM | LOW
-
-## Priority Fix Order
-
-Ordered by unblock value.
-
-- fix action
-- expected unblocked jobs
-- owner role
-
-## Risk Notes
-
-- risky quick fixes to avoid
-- possible hidden regressions
-
-## Recovery Checklist
-
-- [ ] apply highest-priority fix
-- [ ] rerun targeted jobs
-- [ ] rerun full workflow
-- [ ] confirm no new failures
diff --git a/src/vstack/_templates/prompts/dependency-audit/config.yaml b/src/vstack/_templates/prompts/dependency-audit/config.yaml
deleted file mode 100644
index 571b4b49..00000000
--- a/src/vstack/_templates/prompts/dependency-audit/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: dependency-audit
-description: Audit dependencies for vulnerabilities, outdated versions, licence risks, and supply chain hygiene.
-argument-hint: "[dependency manifest, lockfile, or package scope]"
-agent: tester
-tools:
- - read
- - search
-version: 20260502009
diff --git a/src/vstack/_templates/prompts/dependency-audit/template.md b/src/vstack/_templates/prompts/dependency-audit/template.md
deleted file mode 100644
index 931b69f7..00000000
--- a/src/vstack/_templates/prompts/dependency-audit/template.md
+++ /dev/null
@@ -1,50 +0,0 @@
-Audit the provided dependency manifest or lockfile for vulnerabilities, outdated packages, licence risks, and supply chain hygiene.
-
-Prefer evidence from the manifest itself; flag items that need external verification.
-
-Output exactly in this format:
-
-## Vulnerabilities
-
-List dependencies with known CVEs or security advisories.
-
-For each item:
-
-- package name and version
-- CVE or advisory reference if known
-- severity: critical | high | medium | low
-- recommended action (upgrade, replace, or accept with rationale)
-
-## Outdated Packages
-
-List dependencies significantly behind latest stable releases where risk is meaningful.
-Do not list low-impact minor version differences.
-
-For each item:
-
-- package name: current version → latest stable
-- risk of staying on current version in one sentence
-
-## Licence Risks
-
-List licences that may conflict with the project's distribution model.
-
-For each item:
-
-- package name
-- licence identifier
-- conflict or concern in one sentence
-
-## Pinning and Version Policy
-
-- all direct dependencies pinned: yes | no | partial
-- unpinned transitive dependencies with risk: list or none
-- version ranges that allow breaking upgrades: list or none
-
-## Supply Chain Hygiene
-
-List packages with unusual provenance concerns: abandoned maintainers, single-maintainer projects, recent ownership transfers, or typosquatting risk.
-
-## Recommended Actions
-
-Ordered action list by priority (critical first).
diff --git a/src/vstack/_templates/prompts/incident-timeline/config.yaml b/src/vstack/_templates/prompts/incident-timeline/config.yaml
deleted file mode 100644
index 196baa88..00000000
--- a/src/vstack/_templates/prompts/incident-timeline/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: incident-timeline
-description: Build a structured, evidence-based incident timeline and action-oriented postmortem summary.
-argument-hint: "[logs, alerts, timeline notes, or incident ID]"
-agent: tester
-tools:
- - read
- - search
-version: 20260502010
diff --git a/src/vstack/_templates/prompts/incident-timeline/template.md b/src/vstack/_templates/prompts/incident-timeline/template.md
deleted file mode 100644
index 9806de44..00000000
--- a/src/vstack/_templates/prompts/incident-timeline/template.md
+++ /dev/null
@@ -1,47 +0,0 @@
-Construct a blameless incident timeline from the provided evidence.
-
-Anchor claims to available logs, alerts, traces, and change events.
-If evidence is missing, explicitly mark uncertainty.
-
-Output exactly in this format:
-
-## Incident Snapshot
-
-- incident title
-- impact window
-- affected systems/users
-- current status
-
-## Timeline (UTC)
-
-List timestamped events in order.
-
-For each event:
-
-- time
-- event description
-- evidence source
-- confidence: high | medium | low
-
-## Root Cause Analysis
-
-- primary cause
-- contributing factors
-- what made detection/recovery slower
-
-## What Worked / What Failed
-
-Two short lists.
-
-## Corrective Actions
-
-For each action:
-
-- action description
-- owner role
-- priority: P0 | P1 | P2
-- due expectation (short horizon)
-
-## Prevention Check
-
-List the minimum controls needed to reduce repeat probability.
diff --git a/src/vstack/_templates/prompts/migration-safety/config.yaml b/src/vstack/_templates/prompts/migration-safety/config.yaml
deleted file mode 100644
index 4a7df139..00000000
--- a/src/vstack/_templates/prompts/migration-safety/config.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: migration-safety
-description: Review database migration safety, rollback strategy, and zero-downtime risk.
-argument-hint: "[migration files, schema, or rollout plan]"
-agent: engineer
-tools:
- - read
- - search
- - edit
-version: 20260502011
diff --git a/src/vstack/_templates/prompts/migration-safety/template.md b/src/vstack/_templates/prompts/migration-safety/template.md
deleted file mode 100644
index be7b06cf..00000000
--- a/src/vstack/_templates/prompts/migration-safety/template.md
+++ /dev/null
@@ -1,41 +0,0 @@
-Review the selected migration plan and code for production safety.
-
-Focus on forward compatibility, rollback feasibility, data integrity, and operational risk.
-Assume a live system with concurrent reads and writes.
-
-Output exactly in this format:
-
-## Must Fix Before Apply
-
-List migration blockers.
-
-For each item:
-
-- file/section
-- failure mode in one sentence
-- concrete safe fix
-
-## Should Fix Soon
-
-List non-blocking risks with meaningful impact.
-
-## Rollback Plan Check
-
-- rollback feasible: yes | no | partial
-- missing rollback prerequisites
-- specific rollback procedure recommendation
-
-## Zero-Downtime Check
-
-- compatible with old and new app versions: yes | no | partial
-- lock/contention risk: low | medium | high
-- required phased rollout steps
-
-## Test Gaps
-
-List missing migration tests (forward, backward, data invariants, load-sensitive paths).
-
-## Final Recommendation
-
-- apply now | apply after fixes
-- biggest remaining risk in one sentence
diff --git a/src/vstack/_templates/prompts/ops-readiness/config.yaml b/src/vstack/_templates/prompts/ops-readiness/config.yaml
deleted file mode 100644
index 063ab884..00000000
--- a/src/vstack/_templates/prompts/ops-readiness/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: ops-readiness
-description: Assess operational readiness across observability, runbooks, failure handling, and supportability.
-argument-hint: "[service, component, or release scope]"
-agent: tester
-tools:
- - read
- - search
-version: 20260513009
diff --git a/src/vstack/_templates/prompts/ops-readiness/template.md b/src/vstack/_templates/prompts/ops-readiness/template.md
deleted file mode 100644
index b21f5f97..00000000
--- a/src/vstack/_templates/prompts/ops-readiness/template.md
+++ /dev/null
@@ -1,32 +0,0 @@
-Assess operational readiness across observability, runbooks, failure handling, and supportability.
-
-Use evidence from code, tests, docs, and runbooks.
-
-Output exactly in this format:
-
-## Ops Readiness Scorecard
-
-- observability: READY | PARTIAL | MISSING
-- alerting: READY | PARTIAL | MISSING
-- runbooks: READY | PARTIAL | MISSING
-- failure handling: READY | PARTIAL | MISSING
-
-## Gaps
-
-For each gap:
-
-- area
-- finding
-- risk if unresolved
-- owner role
-
-## Must-Fix Before Release
-
-- blocker
-- required evidence
-
-## Follow-up Actions
-
-- action
-- owner role
-- target milestone
diff --git a/src/vstack/_templates/prompts/quick-review/config.yaml b/src/vstack/_templates/prompts/quick-review/config.yaml
deleted file mode 100644
index 6ab53b9b..00000000
--- a/src/vstack/_templates/prompts/quick-review/config.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: quick-review
-description: Review a change for bugs, regressions, and missing tests.
-argument-hint: "[scope or files to review]"
-agent: engineer
-tools:
- - read
- - search
- - edit
-version: 20260502008
diff --git a/src/vstack/_templates/prompts/quick-review/template.md b/src/vstack/_templates/prompts/quick-review/template.md
deleted file mode 100644
index c44a8fab..00000000
--- a/src/vstack/_templates/prompts/quick-review/template.md
+++ /dev/null
@@ -1,40 +0,0 @@
-Review the selected code or diff for production risk.
-
-Focus only on issues with real impact:
-
-- correctness and edge cases
-- security and data exposure
-- performance and scalability
-- maintainability and ownership boundaries
-- missing tests for changed behavior
-- API contract changes: breaking changes, schema drift, missing versioning
-
-Ignore:
-
-- style-only preferences with no runtime impact
-- speculative risks without evidence in this change
-
-Output exactly in this format:
-
-## Must fix
-
-List blocking issues that should be resolved before merge.
-
-## Should consider
-
-List non-blocking improvements worth addressing now.
-
-## Looks good
-
-List intentional strengths in this change.
-
-For each item:
-
-- cite the relevant file/section
-- explain why it matters in one short sentence
-- give one concrete fix suggestion
-
-End with:
-
-- Merge recommendation: yes / no / yes-with-conditions
-- Biggest remaining risk: one sentence
diff --git a/src/vstack/_templates/prompts/repo-assessment/config.yaml b/src/vstack/_templates/prompts/repo-assessment/config.yaml
deleted file mode 100644
index 8b20b9ec..00000000
--- a/src/vstack/_templates/prompts/repo-assessment/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: repo-assessment
-description: Assess a repository for production-readiness gaps and prioritized improvements.
-argument-hint: "[repository scope or component path]"
-agent: engineer
-tools:
- - read
- - search
-version: 20260513001
diff --git a/src/vstack/_templates/prompts/repo-assessment/template.md b/src/vstack/_templates/prompts/repo-assessment/template.md
deleted file mode 100644
index 9ae04ed9..00000000
--- a/src/vstack/_templates/prompts/repo-assessment/template.md
+++ /dev/null
@@ -1,44 +0,0 @@
-Assess this repository for production-readiness gaps and prioritized improvements.
-
-Base findings on evidence in source files, tests, CI config, docs, and manifests.
-Prefer concrete findings over speculation.
-
-Output exactly in this format:
-
-## Critical Risks
-
-List only issues that block safe production operation right now.
-
-For each item:
-
-- location: file or component reference
-- risk: one sentence describing the production impact
-- remediation: concrete action with owner role
-
-## High-ROI Improvements
-
-List high-value improvements that reduce operational risk or developer friction, ranked by impact versus effort.
-
-For each item:
-
-- area: the domain (security | reliability | observability | dx | performance | maintainability)
-- finding: what is missing or suboptimal
-- suggested action: one clear improvement step
-
-## Testing and Verification Gaps
-
-List untested behavioral paths or areas where coverage may give false confidence.
-
-For each item:
-
-- uncovered behavior: what scenario is missing
-- risk if untested: what could go wrong in production
-- suggested test type: unit | integration | contract | e2e
-
-## Suggested Next Sprint Backlog
-
-Provide a short, actionable next-sprint task list ordered from highest to lowest priority.
-
-- task title
-- owner role (product | architect | designer | engineer | tester | release)
-- one-line rationale
diff --git a/src/vstack/_templates/prompts/template-impact/config.yaml b/src/vstack/_templates/prompts/template-impact/config.yaml
deleted file mode 100644
index 31a3be63..00000000
--- a/src/vstack/_templates/prompts/template-impact/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: template-impact
-description: Assess impact of a template change on generated artifacts, tests, and release risk.
-argument-hint: "[template path or change scope]"
-agent: engineer
-tools:
- - read
- - search
-version: 20260513005
diff --git a/src/vstack/_templates/prompts/template-impact/template.md b/src/vstack/_templates/prompts/template-impact/template.md
deleted file mode 100644
index bb61e8a0..00000000
--- a/src/vstack/_templates/prompts/template-impact/template.md
+++ /dev/null
@@ -1,33 +0,0 @@
-Assess impact of a template change on generated artifacts, tests, and release risk.
-
-Use source-template and generated-artifact evidence.
-
-Output exactly in this format:
-
-## Change Surface
-
-- template scope
-- affected artifact types
-- likely generated paths
-
-## Impact Findings
-
-For each finding:
-
-- impacted path
-- impact type: BEHAVIOR | DOCS | TESTS | TOOLING
-- risk
-- required validation
-
-## Regression Risk
-
-List highest-risk regressions first.
-
-- scenario
-- likelihood: HIGH | MEDIUM | LOW
-- mitigation
-
-## Verification Plan
-
-- commands to run
-- expected pass criteria
diff --git a/src/vstack/_templates/prompts/test-gaps/config.yaml b/src/vstack/_templates/prompts/test-gaps/config.yaml
deleted file mode 100644
index 92c6bb1c..00000000
--- a/src/vstack/_templates/prompts/test-gaps/config.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-name: test-gaps
-description: Identify missing behavioral coverage and prioritize test additions by production risk.
-argument-hint: "[component, feature, or repository scope]"
-agent: tester
-tools:
- - read
- - search
-version: 20260513007
diff --git a/src/vstack/_templates/prompts/test-gaps/template.md b/src/vstack/_templates/prompts/test-gaps/template.md
deleted file mode 100644
index 7ec9afa6..00000000
--- a/src/vstack/_templates/prompts/test-gaps/template.md
+++ /dev/null
@@ -1,30 +0,0 @@
-Identify missing behavioral coverage and prioritize test additions by production risk.
-
-Focus on observable behavior and realistic failure paths.
-
-Output exactly in this format:
-
-## Coverage Gaps
-
-For each gap:
-
-- behavior
-- current coverage weakness
-- production risk
-- suggested test type: unit | integration | contract | e2e
-
-## False Confidence Risks
-
-List tests that pass but may not protect real behavior.
-
-- location
-- why confidence is false
-- correction
-
-## Priority Test Backlog
-
-Ordered from highest to lowest risk reduction.
-
-- test title
-- owner role
-- acceptance check
diff --git a/src/vstack/_templates/skills/advise/config.yaml b/src/vstack/_templates/skills/advise/config.yaml
index 1ecdc604..10d0ab50 100644
--- a/src/vstack/_templates/skills/advise/config.yaml
+++ b/src/vstack/_templates/skills/advise/config.yaml
@@ -14,4 +14,4 @@ when_to_use:
- Assessing risk or feasibility claims
- Stress-testing an approach for hidden failures
- Making high-consequence trade-off decisions
-version: '20260626001'
+version: '20261017001'
diff --git a/src/vstack/_templates/skills/advise/template.md b/src/vstack/_templates/skills/advise/template.md
index cf5951e0..7a4add70 100644
--- a/src/vstack/_templates/skills/advise/template.md
+++ b/src/vstack/_templates/skills/advise/template.md
@@ -59,4 +59,4 @@ Always consider:
---
-**Related:** See `prompt/reasoning` for the underlying reasoning framework.
+**Related:** See `skill/reasoning` for the underlying reasoning framework.
diff --git a/src/vstack/_templates/prompts/artifact-integrity/config.yaml b/src/vstack/_templates/skills/artifact-integrity/config.yaml
similarity index 64%
rename from src/vstack/_templates/prompts/artifact-integrity/config.yaml
rename to src/vstack/_templates/skills/artifact-integrity/config.yaml
index f646d0c3..f729fd6a 100644
--- a/src/vstack/_templates/prompts/artifact-integrity/config.yaml
+++ b/src/vstack/_templates/skills/artifact-integrity/config.yaml
@@ -1,8 +1,7 @@
name: artifact-integrity
description: Check source templates against generated artifacts and identify drift or missing regeneration.
argument-hint: "[artifact type, path, or full repo]"
-agent: tester
-tools:
- - read
- - search
-version: 20260513002
+allowed-tools: 'read search'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/artifact-integrity/template.md b/src/vstack/_templates/skills/artifact-integrity/template.md
similarity index 92%
rename from src/vstack/_templates/prompts/artifact-integrity/template.md
rename to src/vstack/_templates/skills/artifact-integrity/template.md
index 0d9a00b1..193453e3 100644
--- a/src/vstack/_templates/prompts/artifact-integrity/template.md
+++ b/src/vstack/_templates/skills/artifact-integrity/template.md
@@ -1,4 +1,9 @@
+{{SKILL_CONTEXT}}
+
+# artifact-integrity - Generated Artifact Audit
+
Check source templates against generated artifacts and identify drift.
+Report only; do not regenerate, edit, or delete files.
Compare `src/vstack/_templates/` sources with installed artifacts in `.github/`
and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps.
diff --git a/src/vstack/_templates/prompts/migration-plan/config.yaml b/src/vstack/_templates/skills/migration-plan/config.yaml
similarity index 64%
rename from src/vstack/_templates/prompts/migration-plan/config.yaml
rename to src/vstack/_templates/skills/migration-plan/config.yaml
index f95ad7d6..594ad841 100644
--- a/src/vstack/_templates/prompts/migration-plan/config.yaml
+++ b/src/vstack/_templates/skills/migration-plan/config.yaml
@@ -1,8 +1,7 @@
name: migration-plan
description: Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.
argument-hint: "[migration scope or affected components]"
-agent: engineer
-tools:
- - read
- - search
-version: 20260513010
+allowed-tools: 'read search'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/migration-plan/template.md b/src/vstack/_templates/skills/migration-plan/template.md
similarity index 80%
rename from src/vstack/_templates/prompts/migration-plan/template.md
rename to src/vstack/_templates/skills/migration-plan/template.md
index 081bfc00..9e066302 100644
--- a/src/vstack/_templates/prompts/migration-plan/template.md
+++ b/src/vstack/_templates/skills/migration-plan/template.md
@@ -1,4 +1,9 @@
+{{SKILL_CONTEXT}}
+
+# migration-plan - Cross-Component Migration Planning
+
Produce a safe migration plan with sequencing, fallback paths, and verification checkpoints.
+Plan only; do not apply migrations or change files.
Use source changes, schema/contracts, and deployment constraints.
diff --git a/src/vstack/_templates/prompts/reasoning/config.yaml b/src/vstack/_templates/skills/reasoning/config.yaml
similarity index 54%
rename from src/vstack/_templates/prompts/reasoning/config.yaml
rename to src/vstack/_templates/skills/reasoning/config.yaml
index 280751cf..ab0a7094 100644
--- a/src/vstack/_templates/prompts/reasoning/config.yaml
+++ b/src/vstack/_templates/skills/reasoning/config.yaml
@@ -2,11 +2,8 @@ name: reasoning
description: |
Evidence-based reasoning framework for one-shot evaluation tasks.
Use when you need to apply critical thinking to a specific decision, proposal, or evaluation.
-category: review
-keywords:
- - critical thinking
- - evidence-based reasoning
- - adversarial thinking
- - evaluation framework
-reusable: true
-version: '20260626001'
+allowed-tools: 'read search'
+argument-hint: '[decision, proposal, or evaluation]'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/reasoning/template.md b/src/vstack/_templates/skills/reasoning/template.md
similarity index 95%
rename from src/vstack/_templates/prompts/reasoning/template.md
rename to src/vstack/_templates/skills/reasoning/template.md
index cea84c75..70e00b0d 100644
--- a/src/vstack/_templates/prompts/reasoning/template.md
+++ b/src/vstack/_templates/skills/reasoning/template.md
@@ -1,6 +1,8 @@
+{{SKILL_CONTEXT}}
+
# Evidence-Based Reasoning Framework
-Use this prompt when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation.
+Use this skill when you need to apply critical thinking to a specific decision, proposal, idea, or evaluation.
## Core Mindset
diff --git a/src/vstack/_templates/prompts/release-check/config.yaml b/src/vstack/_templates/skills/release-check/config.yaml
similarity index 62%
rename from src/vstack/_templates/prompts/release-check/config.yaml
rename to src/vstack/_templates/skills/release-check/config.yaml
index 2647d972..5d78c0aa 100644
--- a/src/vstack/_templates/prompts/release-check/config.yaml
+++ b/src/vstack/_templates/skills/release-check/config.yaml
@@ -1,8 +1,7 @@
name: release-check
description: Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.
argument-hint: "[release scope or target branch]"
-agent: release
-tools:
- - read
- - search
-version: 20260513004
+allowed-tools: 'read search'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/release-check/template.md b/src/vstack/_templates/skills/release-check/template.md
similarity index 81%
rename from src/vstack/_templates/prompts/release-check/template.md
rename to src/vstack/_templates/skills/release-check/template.md
index f75a94a1..4b014605 100644
--- a/src/vstack/_templates/prompts/release-check/template.md
+++ b/src/vstack/_templates/skills/release-check/template.md
@@ -1,4 +1,9 @@
+{{SKILL_CONTEXT}}
+
+# release-check - Release Evidence Audit
+
Evaluate release gate readiness using required reports, artifacts, and sign-off evidence.
+Report only; do not create a release, tag, pull request, or sign-off.
Use repository evidence only.
diff --git a/src/vstack/_templates/prompts/upgrade-plan/config.yaml b/src/vstack/_templates/skills/upgrade-plan/config.yaml
similarity index 63%
rename from src/vstack/_templates/prompts/upgrade-plan/config.yaml
rename to src/vstack/_templates/skills/upgrade-plan/config.yaml
index da7302dd..625447c4 100644
--- a/src/vstack/_templates/prompts/upgrade-plan/config.yaml
+++ b/src/vstack/_templates/skills/upgrade-plan/config.yaml
@@ -1,8 +1,7 @@
name: upgrade-plan
description: Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.
argument-hint: "[target version, component, or full repo]"
-agent: tester
-tools:
- - read
- - search
-version: 20260513008
+allowed-tools: 'read search'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/upgrade-plan/template.md b/src/vstack/_templates/skills/upgrade-plan/template.md
similarity index 79%
rename from src/vstack/_templates/prompts/upgrade-plan/template.md
rename to src/vstack/_templates/skills/upgrade-plan/template.md
index e2ff2f06..42faba8e 100644
--- a/src/vstack/_templates/prompts/upgrade-plan/template.md
+++ b/src/vstack/_templates/skills/upgrade-plan/template.md
@@ -1,4 +1,9 @@
+{{SKILL_CONTEXT}}
+
+# upgrade-plan - Upgrade Planning
+
Build a safe upgrade plan with sequencing, compatibility checks, and rollback points.
+Plan only; do not install packages, apply upgrades, or change files.
Use repository docs, manifests, and test constraints.
diff --git a/src/vstack/_templates/prompts/workflow-check/config.yaml b/src/vstack/_templates/skills/workflow-check/config.yaml
similarity index 62%
rename from src/vstack/_templates/prompts/workflow-check/config.yaml
rename to src/vstack/_templates/skills/workflow-check/config.yaml
index 0a56dfb6..07deae4c 100644
--- a/src/vstack/_templates/prompts/workflow-check/config.yaml
+++ b/src/vstack/_templates/skills/workflow-check/config.yaml
@@ -1,8 +1,7 @@
name: workflow-check
description: Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
argument-hint: "[workflow scope or stage list]"
-agent: planner
-tools:
- - read
- - search
-version: 20260513003
+allowed-tools: 'read search'
+user-invocable: true
+disable-model-invocation: true
+version: 20261017001
diff --git a/src/vstack/_templates/prompts/workflow-check/template.md b/src/vstack/_templates/skills/workflow-check/template.md
similarity index 83%
rename from src/vstack/_templates/prompts/workflow-check/template.md
rename to src/vstack/_templates/skills/workflow-check/template.md
index 151a770e..c6d71ffc 100644
--- a/src/vstack/_templates/prompts/workflow-check/template.md
+++ b/src/vstack/_templates/skills/workflow-check/template.md
@@ -1,4 +1,9 @@
+{{SKILL_CONTEXT}}
+
+# workflow-check - Workflow Contract Audit
+
Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
+Report only; do not change workflow configuration or role artifacts.
Focus on evidence in workflow config, role templates, and docs.
diff --git a/src/vstack/artifacts/__init__.py b/src/vstack/artifacts/__init__.py
index 3decf7a4..0dcb2909 100644
--- a/src/vstack/artifacts/__init__.py
+++ b/src/vstack/artifacts/__init__.py
@@ -1,7 +1,6 @@
-"""vstack.artifacts — shared prompt-artifact models, generator, and protocol."""
+"""Shared artifact models, generator, and protocol."""
from vstack.artifacts.config import INSTRUCTION_SCHEMA as INSTRUCTION_SCHEMA
-from vstack.artifacts.config import PROMPT_SCHEMA as PROMPT_SCHEMA
from vstack.artifacts.config import ArtifactTypeConfig as ArtifactTypeConfig
from vstack.artifacts.generator import (
GenericArtifactGenerator as GenericArtifactGenerator,
diff --git a/src/vstack/artifacts/config.py b/src/vstack/artifacts/config.py
index 9474c665..e62a77d8 100644
--- a/src/vstack/artifacts/config.py
+++ b/src/vstack/artifacts/config.py
@@ -2,10 +2,10 @@
This module provides:
-* :class:`ArtifactTypeConfig` — fully describes one family of prompt artifacts:
+* :class:`ArtifactTypeConfig` — fully describes one family of artifacts:
where to find source templates, how to derive output paths, which frontmatter
schema applies, and what to verify.
-* Shared schemas for **prompts** and **instructions**.
+* The shared schema for **instructions**.
Frontmatter field types (:class:`~vstack.frontmatter.FieldSpec`,
:class:`~vstack.frontmatter.FrontmatterSchema`, :data:`~vstack.frontmatter.FieldType`)
@@ -28,7 +28,7 @@
@dataclass
class ArtifactTypeConfig:
- """Describes a family of prompt artifacts and how to process them.
+ """Describe an artifact family and how to process it.
Attributes:
type_name: Singular identifier used in log output and internal lookups
@@ -89,18 +89,6 @@ def __post_init__(self) -> None:
# ── Frontmatter schemas ───────────────────────────────────────────────────────
-#: Fields recognised in VS Code prompt files (``.prompt.md``).
-PROMPT_SCHEMA = FrontmatterSchema(
- [
- FieldSpec("description"),
- FieldSpec("name", quoted=False),
- FieldSpec("argument-hint"),
- FieldSpec("agent", quoted=False),
- FieldSpec("model", quoted=False),
- FieldSpec("tools", type="list"),
- ]
-)
-
#: Fields recognised in VS Code instruction files (``.instructions.md``).
INSTRUCTION_SCHEMA = FrontmatterSchema(
[
diff --git a/src/vstack/artifacts/models.py b/src/vstack/artifacts/models.py
index f5fc7539..b6543575 100644
--- a/src/vstack/artifacts/models.py
+++ b/src/vstack/artifacts/models.py
@@ -1,10 +1,4 @@
-"""Shared data models for prompt artifacts.
-
-A *prompt artifact* is any Markdown file produced by vstack: a skill file,
-an agent file, a prompt file, or an instructions file. Some artifact types
-always carry YAML front matter (``*.agent.md``, ``SKILL.md``); others do not
-(``AGENTS.md``, ``copilot-instructions.md`` — not yet in scope).
-"""
+"""Shared models for generated skills, agents, instructions, and hooks."""
from __future__ import annotations
@@ -16,7 +10,7 @@
@dataclass
class RenderedArtifact:
- """A single rendered prompt artifact, ready to write to disk.
+ """Represent a rendered artifact ready to write to disk.
Attributes:
name: Logical identifier (directory name or stem without suffix).
diff --git a/src/vstack/cli/catalog.py b/src/vstack/cli/catalog.py
index cd2f84dc..d929304c 100644
--- a/src/vstack/cli/catalog.py
+++ b/src/vstack/cli/catalog.py
@@ -76,7 +76,7 @@ class ManifestSubcommandConfig:
include_scope_group=True,
include_only_option=True,
scope_help="Verify output in /.github/",
- only_help="Verify only these artifact types, e.g. --only agent prompt",
+ only_help="Verify only these artifact types, e.g. --only agent skill",
),
"status": TopLevelCommandConfig(
command_factory=StatusCommand,
@@ -163,6 +163,6 @@ class ManifestSubcommandConfig:
help_text="Verify installed output against manifest ownership and checksums",
scope_help="Verify output in /.github/",
include_only_option=True,
- only_help="Verify only these artifact types, e.g. --only agent prompt",
+ only_help="Verify only these artifact types, e.g. --only agent skill",
),
}
diff --git a/src/vstack/cli/constants.py b/src/vstack/cli/constants.py
index 63064a39..e62919d3 100644
--- a/src/vstack/cli/constants.py
+++ b/src/vstack/cli/constants.py
@@ -5,13 +5,13 @@
from vstack.agents.config import AGENT_TYPE
from vstack.hooks.config import HOOK_TYPE
from vstack.instructions.config import INSTRUCTION_TYPE
-from vstack.prompts.config import PROMPT_TYPE
from vstack.skills.config import SKILL_TYPE
EXPECTED_CANONICAL_NAMES = [
"advise",
"analyse",
"architecture",
+ "artifact-integrity",
"ask",
"adr",
"aws-cli",
@@ -41,6 +41,7 @@
"k8s",
"lazy",
"migrate",
+ "migration-plan",
"onboard",
"openapi",
"performance",
@@ -48,7 +49,9 @@
"pr",
"rancher",
"rca",
+ "reasoning",
"refactor",
+ "release-check",
"release-notes",
"requirements",
"secret-scan",
@@ -58,8 +61,10 @@
"terraform",
"terragrunt",
"threat-model",
+ "upgrade-plan",
"verify",
"vision",
+ "workflow-check",
]
@@ -76,13 +81,12 @@ class Colors:
RESET = "\033[0m"
-KNOWN_TYPES = [SKILL_TYPE, AGENT_TYPE, HOOK_TYPE, INSTRUCTION_TYPE, PROMPT_TYPE]
+KNOWN_TYPES = [SKILL_TYPE, AGENT_TYPE, HOOK_TYPE, INSTRUCTION_TYPE]
KNOWN_TYPE_NAMES = [type_config.type_name for type_config in KNOWN_TYPES]
GLOBAL_SUPPORTED_TYPE_NAMES = [
AGENT_TYPE.type_name,
HOOK_TYPE.type_name,
INSTRUCTION_TYPE.type_name,
- PROMPT_TYPE.type_name,
SKILL_TYPE.type_name,
]
@@ -126,23 +130,25 @@ class ArtifactState:
"pre-tool-safety-gate",
"session-audit",
],
- "prompt": [
- "api-design-review",
- "architecture-risk",
- "artifact-integrity",
- "ci-triage",
- "dependency-audit",
- "incident-timeline",
- "migration-plan",
- "migration-safety",
- "ops-readiness",
- "quick-review",
- "reasoning",
- "release-check",
- "repo-assessment",
- "template-impact",
- "test-gaps",
- "upgrade-plan",
- "workflow-check",
- ],
+}
+
+# Legacy names are retained only to migrate manifest-tracked prompt files.
+RETIRED_PROMPT_SKILLS: dict[str, str] = {
+ "api-design-review": "openapi",
+ "architecture-risk": "architecture",
+ "artifact-integrity": "artifact-integrity",
+ "ci-triage": "debug",
+ "dependency-audit": "dependency",
+ "incident-timeline": "postmortem",
+ "migration-plan": "migration-plan",
+ "migration-safety": "migrate",
+ "ops-readiness": "inspect",
+ "quick-review": "code-review",
+ "reasoning": "reasoning",
+ "release-check": "release-check",
+ "repo-assessment": "inspect",
+ "template-impact": "analyse",
+ "test-gaps": "inspect",
+ "upgrade-plan": "upgrade-plan",
+ "workflow-check": "workflow-check",
}
diff --git a/src/vstack/cli/init.py b/src/vstack/cli/init.py
index b41d5355..53ad6ebe 100644
--- a/src/vstack/cli/init.py
+++ b/src/vstack/cli/init.py
@@ -8,7 +8,7 @@
from typing import TYPE_CHECKING
from vstack.cli.base import BaseCommand, CommandContext
-from vstack.cli.constants import Colors
+from vstack.cli.constants import RETIRED_PROMPT_SKILLS, Colors
from vstack.constants import VERSION
from vstack.manifest import (
CURRENT_HASH_ALGORITHM,
@@ -401,7 +401,7 @@ def _can_prune_obsolete_entry(*, install_dir: Path, entry) -> tuple[bool, str]:
checksum_algorithm = (entry.checksum_algorithm or CURRENT_HASH_ALGORITHM).lower()
try:
current = hash_with_algorithm(out_file.read_text(encoding="utf-8"), checksum_algorithm)
- except OSError:
+ except (OSError, UnicodeError):
return False, "file is unreadable"
except ValueError:
return False, "unknown checksum algorithm"
@@ -470,14 +470,14 @@ def _process_obsolete_entry(
return "preserve", True
reason_suffix = "" if reason == "" else f" — {reason}"
- print(
- f" {prefix}{colors.CYAN}−{colors.RESET} {rel}"
- f" {colors.DIM}removed obsolete tracked artifact ({selector}){reason_suffix}{colors.RESET}"
- )
InitCommand._remove_file_if_present(
out_file=install_dir / entry.file,
dry_run=dry_run,
)
+ print(
+ f" {prefix}{colors.CYAN}−{colors.RESET} {rel}"
+ f" {colors.DIM}removed obsolete tracked artifact ({selector}){reason_suffix}{colors.RESET}"
+ )
return "prune", False
@staticmethod
@@ -497,10 +497,11 @@ def _print_summary(
adopted = action_counts.get("adopt", 0)
obsolete = action_counts.get("obsolete", 0)
pruned = action_counts.get("prune", 0)
+ retired = action_counts.get("retire", 0)
install_label = "installed"
summary_title = "Summary (dry-run)" if dry_run else "Summary"
- total = installed + updated + preserved + skipped + adopted + obsolete
+ total = installed + updated + preserved + skipped + adopted + obsolete + retired
print()
print(f" {colors.BOLD}{summary_title}{colors.RESET}")
@@ -512,6 +513,8 @@ def _print_summary(
print(f" adopted : {colors.BOLD}{adopted}{colors.RESET}")
print(f" obsolete : {colors.BOLD}{obsolete}{colors.RESET}")
print(f" pruned : {colors.BOLD}{pruned}{colors.RESET}")
+ if retired:
+ print(f" retired prompts : {colors.BOLD}{retired}{colors.RESET}")
if obsolete and not prune:
print()
@@ -536,6 +539,10 @@ def _print_summary(
if preserved_selectors:
for selector in sorted(preserved_selectors):
print(f" - {selector}")
+ if any(selector.startswith("prompt/") for selector in preserved_selectors):
+ print(" Retired prompts require manual review; --force does not remove them.")
+ if all(selector.startswith("prompt/") for selector in preserved_selectors):
+ return
print(" Next steps:")
print(f" {colors.DIM}--force{colors.RESET} overwrite all")
print(
@@ -547,6 +554,84 @@ def _print_summary(
"take ownership without overwriting"
)
+ @staticmethod
+ def _migrate_retired_prompts(
+ *,
+ install_dir: Path,
+ existing_manifest: Manifest | None,
+ new_entries: dict[str, list[ArtifactEntry]],
+ available_skills: set[str],
+ dry_run: bool,
+ action_counts: dict[str, int],
+ preserved_selectors: set[str],
+ colors,
+ prefix: str,
+ ) -> bool:
+ """Retire known prompts only after their replacement skills are available.
+
+ Unsafe or locally modified files remain tracked so a later install can
+ retry. Return false if a deletion fails. Neither force options nor legacy
+ metadata bypass checksum checks.
+ """
+ if existing_manifest is None:
+ return True
+ all_ok = True
+ new_entries.pop("prompts", None)
+ for entry in existing_manifest.entries_for("prompts"):
+ replacement = RETIRED_PROMPT_SKILLS.get(entry.name)
+ out_file = install_dir / entry.file
+ reason = None
+ if replacement is None:
+ reason = "unknown retired prompt; convert this custom workflow manually"
+ elif entry.file != f"prompts/{entry.name}.prompt.md":
+ reason = "noncanonical legacy prompt path"
+ elif out_file.is_symlink() or out_file.parent.is_symlink():
+ reason = "symlinked legacy prompt path"
+ elif replacement not in available_skills:
+ reason = f"replacement skill/{replacement} is unavailable, excluded, or preserved"
+
+ if reason is not None:
+ print(
+ f" {prefix}{colors.YELLOW}↷{colors.RESET} {entry.file}"
+ f" retired prompt preserved — {reason}"
+ )
+ Manifest.preserve_existing_entry(
+ new_entries=new_entries,
+ manifest_key="prompts",
+ existing_entry=entry,
+ )
+ action = "preserve"
+ preserved = True
+ else:
+ print(f" {prefix}Migrating prompt/{entry.name} → skill/{replacement}")
+ try:
+ action, preserved = InitCommand._process_obsolete_entry(
+ install_dir=install_dir,
+ manifest_key="prompts",
+ type_name="prompt",
+ entry=entry,
+ prune=True,
+ dry_run=dry_run,
+ colors=colors,
+ prefix=prefix,
+ new_entries=new_entries,
+ )
+ except OSError as exc:
+ print(f"ERROR: could not retire prompt/{entry.name}: {exc}", file=sys.stderr)
+ Manifest.preserve_existing_entry(
+ new_entries=new_entries,
+ manifest_key="prompts",
+ existing_entry=entry,
+ )
+ action, preserved = "preserve", True
+ all_ok = False
+ if action == "prune":
+ action = "retire"
+ action_counts[action] = action_counts.get(action, 0) + 1
+ if preserved:
+ preserved_selectors.add(f"prompt/{entry.name}")
+ return all_ok
+
@staticmethod
def _warn_unknown_workflow_roles(
*,
@@ -698,6 +783,7 @@ def execute(
all_ok = True
action_counts: dict[str, int] = {}
preserved_selectors: set[str] = set()
+ available_skills: set[str] = set()
for gen in gens:
out_dir = install_dir / gen.config.output_subdir
@@ -731,6 +817,12 @@ def execute(
action_counts[artifact_action] = action_counts.get(artifact_action, 0) + 1
if artifact_action == "preserve":
preserved_selectors.add(f"{gen.config.type_name}/{artifact.name}")
+ elif gen.config.type_name == "skill" and artifact_action in {
+ "install",
+ "update",
+ "skip",
+ }:
+ available_skills.add(artifact.name)
InitCommand._prune_planner_when_manual_mode(
install_dir=install_dir,
@@ -776,6 +868,19 @@ def execute(
if was_preserved:
preserved_selectors.add(f"{type_name}/{entry.name}")
+ if all_ok and any(gen.config.type_name == "skill" for gen in gens):
+ all_ok = InitCommand._migrate_retired_prompts(
+ install_dir=install_dir,
+ existing_manifest=existing_manifest,
+ new_entries=new_entries,
+ available_skills=available_skills,
+ dry_run=dry_run,
+ action_counts=action_counts,
+ preserved_selectors=preserved_selectors,
+ colors=colors,
+ prefix=prefix,
+ )
+
InitCommand._print_summary(
colors=colors,
action_counts=action_counts,
diff --git a/src/vstack/cli/interface.py b/src/vstack/cli/interface.py
index c2e25630..25e29469 100644
--- a/src/vstack/cli/interface.py
+++ b/src/vstack/cli/interface.py
@@ -20,7 +20,6 @@
"agents": "agent",
"hooks": "hook",
"instructions": "instruction",
- "prompts": "prompt",
"skills": "skill",
}
@@ -128,6 +127,12 @@ def _read_exclude(
excluded_types: set[str] = set()
excluded_names: dict[str, list[str]] = {}
for config_key, value in raw_exclude.items():
+ if config_key == "prompts":
+ print(
+ "WARNING: exclude.prompts is retired; configure replacement skill exclusions instead.",
+ file=sys.stderr,
+ )
+ continue
type_name = _CONFIG_TYPE_ALIAS.get(config_key)
if type_name is None:
continue # unknown key, ignore gracefully
diff --git a/src/vstack/cli/parser.py b/src/vstack/cli/parser.py
index a035fab1..3a3fbd41 100644
--- a/src/vstack/cli/parser.py
+++ b/src/vstack/cli/parser.py
@@ -29,6 +29,15 @@ def add_parser(self, name: str, **kwargs: Any) -> argparse.ArgumentParser:
class CommandLineParser:
"""Create the vstack command-line parser and resolve install targets."""
+ @staticmethod
+ def _artifact_selector(value: str) -> str:
+ """Reject retired prompt selectors with an actionable migration message."""
+ if value.strip().startswith("prompt/"):
+ raise argparse.ArgumentTypeError(
+ "prompt artifacts are retired; use the replacement skill/ selector"
+ )
+ return value
+
@staticmethod
def _add_scope_group(parser: argparse.ArgumentParser, *, help_text: str) -> None:
"""Add mutually-exclusive target scope flags to a parser."""
@@ -38,7 +47,7 @@ def _add_scope_group(parser: argparse.ArgumentParser, *, help_text: str) -> None
"--global",
dest="use_global",
action="store_true",
- help="VS Code user profile (agents/prompts/instructions/skills)",
+ help="VS Code user profile (agents/instructions/skills)",
)
@staticmethod
@@ -177,6 +186,7 @@ def _add_install_command(self, sub: SubparserFactory) -> None:
"--force-name",
dest="force_names",
action="append",
+ type=self._artifact_selector,
metavar="",
help=(
"Force install one named artifact without overwriting everything. "
@@ -188,6 +198,7 @@ def _add_install_command(self, sub: SubparserFactory) -> None:
parser.add_argument(
"--adopt-name",
action="append",
+ type=self._artifact_selector,
default=None,
metavar="",
help=(
@@ -225,6 +236,7 @@ def _add_init_command(self, sub: SubparserFactory) -> None:
"--force-name",
dest="force_names",
action="append",
+ type=self._artifact_selector,
metavar="",
help=(
"Force regenerate one named artifact without overwriting everything. "
@@ -235,6 +247,7 @@ def _add_init_command(self, sub: SubparserFactory) -> None:
parser.add_argument(
"--adopt-name",
action="append",
+ type=self._artifact_selector,
default=None,
metavar="",
help=(
@@ -275,6 +288,7 @@ def _add_uninstall_command(self, sub: SubparserFactory) -> None:
"--force-name",
dest="force_names",
action="append",
+ type=self._artifact_selector,
metavar="",
help="Force uninstall one named artifact without removing every modified file",
)
diff --git a/src/vstack/prompts/__init__.py b/src/vstack/prompts/__init__.py
deleted file mode 100644
index 95c77f16..00000000
--- a/src/vstack/prompts/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-"""Package initialization for vstack.prompts."""
-
-from vstack.prompts.generator import PromptGenerator
-
-__all__ = ["PromptGenerator"]
diff --git a/src/vstack/prompts/config.py b/src/vstack/prompts/config.py
deleted file mode 100644
index ab9fd3d1..00000000
--- a/src/vstack/prompts/config.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""Prompt artifact type configuration."""
-
-from vstack.artifacts.config import PROMPT_SCHEMA, ArtifactTypeConfig
-from vstack.prompts.constants import (
- PROMPT_OUTPUT_SUBDIR,
- PROMPT_OUTPUT_SUFFIX,
- PROMPT_TEMPLATES_SUBDIR,
-)
-
-PROMPT_TYPE = ArtifactTypeConfig(
- type_name="prompt",
- templates_dir=PROMPT_TEMPLATES_SUBDIR,
- output_subdir=PROMPT_OUTPUT_SUBDIR,
- output_pattern=f"{{name}}{PROMPT_OUTPUT_SUFFIX}",
- add_frontmatter=True,
- artifact_is_dir=False,
- partials_subdir=None,
- auto_gen_footer=True,
- fail_on_unresolved=False,
- frontmatter_schema=PROMPT_SCHEMA,
-)
diff --git a/src/vstack/prompts/constants.py b/src/vstack/prompts/constants.py
deleted file mode 100644
index 14d2c9d7..00000000
--- a/src/vstack/prompts/constants.py
+++ /dev/null
@@ -1,9 +0,0 @@
-"""Constants for prompt template and output locations."""
-
-from vstack.constants import TEMPLATES_ROOT
-
-PROMPT_OUTPUT_SUFFIX = ".prompt.md"
-PROMPT_TEMPLATES_SUBDIR = "prompts"
-PROMPT_OUTPUT_SUBDIR = "prompts"
-
-PROMPT_TEMPLATES_DIR = TEMPLATES_ROOT / PROMPT_TEMPLATES_SUBDIR
diff --git a/src/vstack/prompts/generator.py b/src/vstack/prompts/generator.py
deleted file mode 100644
index 59f594be..00000000
--- a/src/vstack/prompts/generator.py
+++ /dev/null
@@ -1,13 +0,0 @@
-"""Thin prompt generator wrapper over ``GenericArtifactGenerator``."""
-
-from vstack.artifacts.generator import GenericArtifactGenerator
-from vstack.constants import TEMPLATES_ROOT
-from vstack.prompts.config import PROMPT_TYPE
-
-
-class PromptGenerator(GenericArtifactGenerator):
- """Generate prompt artifacts using the built-in prompt configuration."""
-
- def __init__(self) -> None:
- """Create a prompt generator bound to the built-in template root."""
- super().__init__(PROMPT_TYPE, TEMPLATES_ROOT)
diff --git a/tests/_fixtures/golden/prompts/api-design-review.prompt.md b/tests/_fixtures/golden/prompts/api-design-review.prompt.md
deleted file mode 100644
index a909b91f..00000000
--- a/tests/_fixtures/golden/prompts/api-design-review.prompt.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-description: 'Review an API design or OpenAPI spec for correctness, completeness, and consistency.'
-name: api-design-review
-argument-hint: '[OpenAPI spec file, design doc, or endpoint scope]'
-agent: designer
-tools:
- - read
- - search
----
-Review the provided API design or OpenAPI specification for correctness, completeness, and consistency.
-
-Focus on consumer impact: breaking contracts, ambiguous semantics, missing errors, and inconsistent conventions.
-Ignore implementation details and tooling preferences.
-
-Output exactly in this format:
-
-## Contract Issues
-
-List problems that would break or confuse consumers.
-
-For each item:
-
-- endpoint or field reference
-- what the problem is in one sentence
-- concrete fix
-
-## Naming and Consistency
-
-List naming violations, inconsistencies across endpoints, and deviations from REST conventions.
-
-## Missing Error Cases
-
-List expected error responses that are undocumented or missing status codes (400, 401, 403, 404, 409, 422, 500).
-
-## Schema Completeness
-
-List fields or objects that are missing required constraints, descriptions, or examples.
-
-## Versioning and Compatibility
-
-- versioning strategy present: yes | no | partial
-- breaking changes relative to previous version: yes | no | unknown
-- backward compatibility risk: low | medium | high
-
-## Security Scheme Check
-
-- authentication documented: yes | no
-- authorization scopes documented where relevant: yes | no | partial
-- sensitive fields handled appropriately: yes | no | partial
-
-## Verdict
-
-- approve | approve-with-conditions | reject
-- top priority fix in one sentence
-
-
-
diff --git a/tests/_fixtures/golden/prompts/quick-review.prompt.md b/tests/_fixtures/golden/prompts/quick-review.prompt.md
deleted file mode 100644
index d0b734e7..00000000
--- a/tests/_fixtures/golden/prompts/quick-review.prompt.md
+++ /dev/null
@@ -1,53 +0,0 @@
----
-description: 'Review a change for bugs, regressions, and missing tests.'
-name: quick-review
-argument-hint: '[scope or files to review]'
-agent: engineer
-tools:
- - read
- - search
- - edit
----
-Review the selected code or diff for production risk.
-
-Focus only on issues with real impact:
-
-- correctness and edge cases
-- security and data exposure
-- performance and scalability
-- maintainability and ownership boundaries
-- missing tests for changed behavior
-- API contract changes: breaking changes, schema drift, missing versioning
-
-Ignore:
-
-- style-only preferences with no runtime impact
-- speculative risks without evidence in this change
-
-Output exactly in this format:
-
-## Must fix
-
-List blocking issues that should be resolved before merge.
-
-## Should consider
-
-List non-blocking improvements worth addressing now.
-
-## Looks good
-
-List intentional strengths in this change.
-
-For each item:
-
-- cite the relevant file/section
-- explain why it matters in one short sentence
-- give one concrete fix suggestion
-
-End with:
-
-- Merge recommendation: yes / no / yes-with-conditions
-- Biggest remaining risk: one sentence
-
-
-
diff --git a/tests/vstack/artifacts/conftest.py b/tests/vstack/artifacts/conftest.py
index 33482bae..2b97acb8 100644
--- a/tests/vstack/artifacts/conftest.py
+++ b/tests/vstack/artifacts/conftest.py
@@ -36,16 +36,6 @@ def _build(name: str) -> Path:
return _build
-@pytest.fixture(scope="session", name="prompt_fixture_path")
-def fixture_prompt_fixture_path(golden_fixtures_root: Path) -> Callable[[str], Path]:
- """Build the fixture path for a prompt artifact."""
-
- def _build(name: str) -> Path:
- return golden_fixtures_root / "prompts" / f"{name}.prompt.md"
-
- return _build
-
-
@pytest.fixture(scope="session", name="instruction_fixture_path")
def fixture_instruction_fixture_path(golden_fixtures_root: Path) -> Callable[[str], Path]:
"""Build the fixture path for an instruction artifact."""
diff --git a/tests/vstack/artifacts/test_config.py b/tests/vstack/artifacts/test_config.py
index 2970c625..3edfd328 100644
--- a/tests/vstack/artifacts/test_config.py
+++ b/tests/vstack/artifacts/test_config.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from vstack.artifacts.config import INSTRUCTION_SCHEMA, PROMPT_SCHEMA, ArtifactTypeConfig
+from vstack.artifacts.config import INSTRUCTION_SCHEMA, ArtifactTypeConfig
class TestArtifactTypeConfig:
@@ -23,10 +23,6 @@ def test_post_init_sets_manifest_key(self) -> None:
class TestSchemas:
"""Test cases for Schemas."""
- def test_prompt_schema_has_description(self) -> None:
- """Test that prompt schema has description."""
- assert PROMPT_SCHEMA.get("description") is not None
-
def test_instruction_schema_has_apply_to(self) -> None:
"""Test that instruction schema has apply to."""
assert INSTRUCTION_SCHEMA.get("applyTo") is not None
diff --git a/tests/vstack/artifacts/test_generator.py b/tests/vstack/artifacts/test_generator.py
index e97f4648..2c0ee9f4 100644
--- a/tests/vstack/artifacts/test_generator.py
+++ b/tests/vstack/artifacts/test_generator.py
@@ -16,7 +16,6 @@
from vstack.artifacts.generator import GenericArtifactGenerator
from vstack.instructions.config import INSTRUCTION_TYPE
from vstack.models import ValidationResult
-from vstack.prompts.config import PROMPT_TYPE
from vstack.skills.config import SKILL_TYPE
@@ -302,39 +301,33 @@ def test_render_agent_product_matches_golden_fixture(
artifact_label="agent/product",
)
- def test_render_prompt_quick_review_matches_golden_fixture(
- self,
- templates_root: Path,
- prompt_fixture_path: Callable[[str], Path],
- ) -> None:
- """Quick-review prompt rendering must remain byte-for-byte stable."""
- templates = templates_root
- template_dir = templates / "prompts" / "quick-review"
- expected_fixture = prompt_fixture_path("quick-review")
-
- artifact = GenericArtifactGenerator(PROMPT_TYPE, templates).render(template_dir)
- self._assert_matches_golden_fixture(
- artifact_content=artifact.content,
- expected_fixture=expected_fixture,
- artifact_label="prompt/quick-review",
- )
-
- def test_render_prompt_api_design_review_matches_golden_fixture(
- self,
- templates_root: Path,
- prompt_fixture_path: Callable[[str], Path],
+ @pytest.mark.parametrize(
+ "name, heading",
+ [
+ ("artifact-integrity", "## Drift Findings"),
+ ("migration-plan", "## Rollback Plan"),
+ ("reasoning", "## Hallucination Guardrails"),
+ ("release-check", "## Sign-off Gaps"),
+ ("upgrade-plan", "## Verification Matrix"),
+ ("workflow-check", "## Gate and Handoff Findings"),
+ ],
+ )
+ def test_converted_prompt_is_a_manually_invoked_skill(
+ self, templates_root: Path, name: str, heading: str
) -> None:
- """API-design-review prompt rendering must remain byte-for-byte stable."""
- templates = templates_root
- template_dir = templates / "prompts" / "api-design-review"
- expected_fixture = prompt_fixture_path("api-design-review")
-
- artifact = GenericArtifactGenerator(PROMPT_TYPE, templates).render(template_dir)
- self._assert_matches_golden_fixture(
- artifact_content=artifact.content,
- expected_fixture=expected_fixture,
- artifact_label="prompt/api-design-review",
+ """Converted workflows retain their output contracts and require explicit invocation."""
+ artifact = GenericArtifactGenerator(SKILL_TYPE, templates_root).render(
+ templates_root / "skills" / name
)
+ assert artifact.frontmatter is not None
+ assert artifact.frontmatter["name"] == name
+ assert artifact.frontmatter["user-invocable"] is True
+ assert artifact.frontmatter["disable-model-invocation"] is True
+ assert "agent" not in artifact.frontmatter
+ assert "model" not in artifact.frontmatter
+ assert "tools" not in artifact.frontmatter
+ assert heading in artifact.content
+ assert "{{" not in artifact.content
def test_render_skill_verify_matches_golden_fixture(
self,
diff --git a/tests/vstack/cli/test_constants.py b/tests/vstack/cli/test_constants.py
index 99602036..962fd168 100644
--- a/tests/vstack/cli/test_constants.py
+++ b/tests/vstack/cli/test_constants.py
@@ -9,6 +9,7 @@
"advise",
"analyse",
"architecture",
+ "artifact-integrity",
"ask",
"adr",
"aws-cli",
@@ -38,6 +39,7 @@
"k8s",
"lazy",
"migrate",
+ "migration-plan",
"onboard",
"openapi",
"performance",
@@ -45,7 +47,9 @@
"pr",
"rancher",
"rca",
+ "reasoning",
"refactor",
+ "release-check",
"release-notes",
"requirements",
"secret-scan",
@@ -55,8 +59,10 @@
"terraform",
"terragrunt",
"threat-model",
+ "upgrade-plan",
"verify",
"vision",
+ "workflow-check",
]
diff --git a/tests/vstack/cli/test_interface.py b/tests/vstack/cli/test_interface.py
index d326469b..9343a43c 100644
--- a/tests/vstack/cli/test_interface.py
+++ b/tests/vstack/cli/test_interface.py
@@ -154,7 +154,7 @@ def test_run_dispatches_install_with_global_default_types(self, monkeypatch, tmp
assert len(command.calls) == 1
assert command.calls[0].args is args
assert command.calls[0].install_dir == tmp_path / ".github"
- assert command.calls[0].only == ["agent", "hook", "instruction", "prompt", "skill"]
+ assert command.calls[0].only == ["agent", "hook", "instruction", "skill"]
def test_resolve_only_for_scope_rejects_disallowed_global_types(self) -> None:
"""Global mode rejects unsupported type filters with a helpful message."""
@@ -1298,10 +1298,10 @@ def test_handles_mixed_all_and_list(self, tmp_path: Path) -> None:
vstack_dir = tmp_path / ".vstack"
vstack_dir.mkdir()
(vstack_dir / "config.yaml").write_text(
- "exclude:\n prompts: all\n skills:\n - helm\n", encoding="utf-8"
+ "exclude:\n instructions: all\n skills:\n - helm\n", encoding="utf-8"
)
excluded_types, excluded_names = CommandLineInterface._read_exclude(tmp_path / ".github")
- assert "prompt" in excluded_types
+ assert "instruction" in excluded_types
assert excluded_names == {"skill": ["helm"]}
def test_ignores_unknown_keys(self, tmp_path: Path) -> None:
diff --git a/tests/vstack/cli/test_parser.py b/tests/vstack/cli/test_parser.py
index 0f2dd0ce..0b18acca 100644
--- a/tests/vstack/cli/test_parser.py
+++ b/tests/vstack/cli/test_parser.py
@@ -96,11 +96,41 @@ def test_build_parser_has_expected_commands(self) -> None:
def test_verify_accepts_only_filter(self) -> None:
"""Test that verify command supports --only type filters."""
parser = parser_module.CommandLineParser().build()
- args = parser.parse_args(["verify", "--only", "agent", "prompt", "--no-source"])
+ args = parser.parse_args(["verify", "--only", "agent", "skill", "--no-source"])
assert args.command == "verify"
- assert args.only == ["agent", "prompt"]
+ assert args.only == ["agent", "skill"]
assert args.source is False
+ @pytest.mark.parametrize(
+ "command", ["install", "init", "verify", "validate", "status", "uninstall"]
+ )
+ def test_prompt_artifact_filter_is_rejected(self, command: str) -> None:
+ """Removed prompt selectors are rejected instead of silently doing nothing."""
+ parser = parser_module.CommandLineParser().build()
+ with pytest.raises(SystemExit) as exc:
+ parser.parse_args([command, "--only", "prompt"])
+ assert exc.value.code == 2
+
+ @pytest.mark.parametrize(
+ "command, option",
+ [
+ ("install", "--force-name"),
+ ("install", "--adopt-name"),
+ ("init", "--force-name"),
+ ("init", "--adopt-name"),
+ ("uninstall", "--force-name"),
+ ],
+ )
+ def test_prompt_artifact_selector_is_rejected(
+ self, command: str, option: str, capsys: pytest.CaptureFixture[str]
+ ) -> None:
+ """Removed selectors explain the replacement instead of silently being ignored."""
+ parser = parser_module.CommandLineParser().build()
+ with pytest.raises(SystemExit) as exc:
+ parser.parse_args([command, option, "prompt/quick-review"])
+ assert exc.value.code == 2
+ assert "use the replacement skill/" in capsys.readouterr().err
+
def test_install_accepts_force_name(self) -> None:
"""Test that install supports targeted force names."""
parser = parser_module.CommandLineParser().build()
diff --git a/tests/vstack/cli/test_prompt_migration.py b/tests/vstack/cli/test_prompt_migration.py
new file mode 100644
index 00000000..87aa3a6b
--- /dev/null
+++ b/tests/vstack/cli/test_prompt_migration.py
@@ -0,0 +1,329 @@
+"""Regression tests for retiring managed prompts during skill installation."""
+
+from argparse import Namespace
+from pathlib import Path
+
+import pytest
+
+from vstack.cli.base import CommandContext
+from vstack.cli.constants import RETIRED_PROMPT_SKILLS
+from vstack.cli.init import InitCommand
+from vstack.cli.install import InstallCommand
+from vstack.cli.service import CommandService
+from vstack.constants import TEMPLATES_ROOT
+from vstack.manifest import ArtifactEntry, Manifest, content_hash
+from vstack.models import CheckMessage, ValidationResult
+
+
+@pytest.fixture
+def service() -> CommandService:
+ """Use shipped templates to test upgrades against actual replacement skills."""
+ return CommandService(TEMPLATES_ROOT)
+
+
+def track_prompts(service: CommandService, install_dir: Path, names: list[str]) -> Manifest:
+ """Write a previous-release manifest and clean prompt files."""
+ entries = []
+ for name in names:
+ relative_path = f"prompts/{name}.prompt.md"
+ path = install_dir / relative_path
+ path.parent.mkdir(parents=True, exist_ok=True)
+ content = f"Legacy workflow: {name}\n"
+ path.write_text(content, encoding="utf-8")
+ entries.append(
+ ArtifactEntry(
+ name=name,
+ file=relative_path,
+ version="20260513001",
+ checksum=content_hash(content),
+ checksum_algorithm="sha256",
+ )
+ )
+ manifest = Manifest(
+ vstack_version="3.7.0",
+ installed_at="2026-10-01T00:00:00Z",
+ artifacts={"prompts": entries},
+ )
+ service.manifest_for(install_dir).write(manifest)
+ return manifest
+
+
+@pytest.mark.parametrize("command_cls", [InitCommand, InstallCommand])
+def test_upgrade_replaces_all_builtin_prompts_and_is_repeatable(
+ service: CommandService, tmp_path: Path, command_cls: type[InitCommand] | type[InstallCommand]
+) -> None:
+ """Both upgrade entry points install skills and retire all clean managed prompts."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, list(RETIRED_PROMPT_SKILLS))
+ personal_prompt = install_dir / "prompts" / "personal.prompt.md"
+ personal_prompt.write_text("Personal workflow\n", encoding="utf-8")
+ context = CommandContext(args=Namespace(), install_dir=install_dir, only=["skill"])
+
+ command = command_cls(service)
+ assert command.run(context=context) == 0
+ assert command.run(context=context) == 0
+
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert "prompts" not in manifest.artifacts
+ for old_name, skill in RETIRED_PROMPT_SKILLS.items():
+ assert not (install_dir / "prompts" / f"{old_name}.prompt.md").exists()
+ assert (install_dir / "skills" / skill / "SKILL.md").is_file()
+ assert skill in manifest.names_for("skills")
+ assert personal_prompt.read_text(encoding="utf-8") == "Personal workflow\n"
+
+
+def test_fresh_install_does_not_generate_or_adopt_prompts(
+ service: CommandService, tmp_path: Path
+) -> None:
+ """Untracked prompts remain outside vstack ownership on new installations."""
+ install_dir = tmp_path / ".github"
+ prompt = install_dir / "prompts" / "quick-review.prompt.md"
+ prompt.parent.mkdir(parents=True)
+ prompt.write_text("My workflow\n", encoding="utf-8")
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 0
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert "prompts" not in manifest.artifacts
+ assert list(prompt.parent.iterdir()) == [prompt]
+ assert prompt.read_text(encoding="utf-8") == "My workflow\n"
+
+
+def test_upgrade_dry_run_preserves_files_and_manifest(
+ service: CommandService, tmp_path: Path, capsys: pytest.CaptureFixture[str]
+) -> None:
+ """Dry-run simulates replacement installation and deletion without writing either."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, ["quick-review"])
+ manifest_file = service.manifest_for(install_dir).path
+ original_manifest = manifest_file.read_bytes()
+ prompt = install_dir / "prompts" / "quick-review.prompt.md"
+ original_content = prompt.read_bytes()
+
+ assert InitCommand.execute(service, install_dir, only=["skill"], dry_run=True) == 0
+ assert manifest_file.read_bytes() == original_manifest
+ assert prompt.read_bytes() == original_content
+ assert not (install_dir / "skills").exists()
+ output = capsys.readouterr().out
+ assert "[dry-run]" in output
+ assert "Migrating prompt/quick-review" in output
+
+
+def test_non_skill_install_defers_prompt_migration(service: CommandService, tmp_path: Path) -> None:
+ """Selecting another artifact family leaves old prompts tracked and untouched."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, ["quick-review"])
+ assert InitCommand.execute(service, install_dir, only=["instruction"]) == 0
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert manifest.names_for("prompts") == ["quick-review"]
+ assert (install_dir / "prompts" / "quick-review.prompt.md").is_file()
+
+
+@pytest.mark.parametrize(
+ "case, expected_reason",
+ [
+ ("modified", "local changes detected"),
+ ("no-checksum", "no stored checksum"),
+ ("unknown-algorithm", "unknown checksum algorithm"),
+ ("invalid-utf8", "file is unreadable"),
+ ("directory", "file is unreadable"),
+ ("unknown-prompt", "convert this custom workflow manually"),
+ ("unsafe-path", "noncanonical legacy prompt path"),
+ ("file-symlink", "symlinked legacy prompt path"),
+ ("directory-symlink", "symlinked legacy prompt path"),
+ ],
+)
+def test_unsafe_legacy_prompt_is_preserved_even_with_force_and_prune(
+ service: CommandService,
+ tmp_path: Path,
+ capsys: pytest.CaptureFixture[str],
+ case: str,
+ expected_reason: str,
+) -> None:
+ """No force mode bypasses ownership, path, or checksum migration safeguards."""
+ install_dir = tmp_path / ".github"
+ name = "custom-workflow" if case == "unknown-prompt" else "quick-review"
+ manifest = track_prompts(service, install_dir, [name])
+ entry = manifest.entries_for("prompts")[0]
+ prompt = install_dir / entry.file
+ outside = tmp_path / "outside.prompt.md"
+ outside.write_text("Do not touch\n", encoding="utf-8")
+ if case == "modified":
+ prompt.write_text("Local changes\n", encoding="utf-8")
+ elif case == "no-checksum":
+ entry.checksum = None
+ entry.checksum_algorithm = None
+ elif case == "unknown-algorithm":
+ entry.checksum_algorithm = "sha999"
+ elif case == "invalid-utf8":
+ prompt.write_bytes(b"\xff")
+ elif case == "directory":
+ prompt.unlink()
+ prompt.mkdir()
+ elif case == "unsafe-path":
+ entry.file = "../outside.prompt.md"
+ entry.checksum = content_hash("Do not touch\n")
+ elif case == "file-symlink":
+ prompt.unlink()
+ prompt.symlink_to(outside)
+ entry.checksum = content_hash("Do not touch\n")
+ elif case == "directory-symlink":
+ prompt.unlink()
+ prompt.parent.rmdir()
+ external_dir = tmp_path / "external-prompts"
+ external_dir.mkdir()
+ (external_dir / prompt.name).write_text("External workflow\n", encoding="utf-8")
+ prompt.parent.symlink_to(external_dir, target_is_directory=True)
+ entry.checksum = content_hash("External workflow\n")
+ service.manifest_for(install_dir).write(manifest)
+
+ assert InitCommand.execute(service, install_dir, only=["skill"], force=True, prune=True) == 0
+ updated = service.manifest_for(install_dir).read()
+ assert updated is not None
+ assert updated.entries_for("prompts") == [entry]
+ assert prompt.exists()
+ assert outside.read_text(encoding="utf-8") == "Do not touch\n"
+ output = capsys.readouterr().out
+ assert expected_reason in output
+ assert "--force does not remove them" in output
+ assert "--force-name <" not in output
+
+
+@pytest.mark.parametrize("collision", ["excluded", "untracked", "modified", "adopted"])
+def test_unavailable_replacement_defers_cleanup_and_can_be_retried(
+ service: CommandService,
+ tmp_path: Path,
+ capsys: pytest.CaptureFixture[str],
+ collision: str,
+) -> None:
+ """Install never deletes a prompt when its replacement was excluded or preserved."""
+ install_dir = tmp_path / ".github"
+ manifest = track_prompts(service, install_dir, ["quick-review"])
+ replacement = install_dir / "skills" / "code-review" / "SKILL.md"
+ if collision != "excluded":
+ replacement.parent.mkdir(parents=True)
+ replacement.write_text("Local skill\n", encoding="utf-8")
+ if collision == "modified":
+ manifest.artifacts["skills"] = [
+ ArtifactEntry(
+ name="code-review",
+ file="skills/code-review/SKILL.md",
+ checksum=content_hash("Original skill\n"),
+ )
+ ]
+ service.manifest_for(install_dir).write(manifest)
+ assert (
+ InitCommand.execute(
+ service,
+ install_dir,
+ only=["skill"],
+ excluded_names={"skill": ["code-review"]} if collision == "excluded" else None,
+ adopt_names=["skill/code-review"] if collision == "adopted" else None,
+ )
+ == 0
+ )
+ prompt = install_dir / "prompts" / "quick-review.prompt.md"
+ assert prompt.is_file()
+ current = service.manifest_for(install_dir).read()
+ assert current is not None
+ assert current.names_for("prompts") == ["quick-review"]
+ assert "replacement skill/code-review is unavailable" in capsys.readouterr().out
+ if collision != "excluded":
+ assert replacement.read_text(encoding="utf-8") == "Local skill\n"
+ assert (
+ InitCommand.execute(service, install_dir, only=["skill"], force_names=["skill/code-review"])
+ == 0
+ )
+ assert not prompt.exists()
+
+
+def test_already_missing_prompt_is_removed_from_manifest(
+ service: CommandService, tmp_path: Path
+) -> None:
+ """Interrupted upgrades are retryable when the old prompt was already deleted."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, ["quick-review"])
+ prompt = install_dir / "prompts" / "quick-review.prompt.md"
+ prompt.unlink()
+ assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert not manifest.entries_for("prompts")
+ assert not prompt.parent.exists()
+
+
+def test_failed_prompt_deletion_is_reported_and_retryable(
+ service: CommandService,
+ tmp_path: Path,
+ monkeypatch: pytest.MonkeyPatch,
+ capsys: pytest.CaptureFixture[str],
+) -> None:
+ """A filesystem failure returns nonzero and keeps ownership for a later retry."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, ["quick-review"])
+
+ def fail_removal(**_kwargs: object) -> None:
+ raise PermissionError("deletion denied")
+
+ with monkeypatch.context() as patch:
+ patch.setattr(InitCommand, "_remove_file_if_present", staticmethod(fail_removal))
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 1
+ output = capsys.readouterr()
+ assert "ERROR: could not retire prompt/quick-review: deletion denied" in output.err
+ assert "removed obsolete tracked artifact" not in output.out
+ assert (install_dir / "prompts" / "quick-review.prompt.md").exists()
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert manifest.names_for("prompts") == ["quick-review"]
+ assert "code-review" in manifest.names_for("skills")
+ assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0
+ assert not (install_dir / "prompts" / "quick-review.prompt.md").exists()
+
+
+def test_profile_scoped_upgrade_uses_the_same_safe_retirement(
+ service: CommandService, tmp_path: Path
+) -> None:
+ """Existing profile installs migrate relative paths without a project scaffold."""
+ install_dir = tmp_path / "User"
+ track_prompts(service, install_dir, ["reasoning"])
+ context = CommandContext(
+ args=Namespace(use_global=True), install_dir=install_dir, only=["skill"]
+ )
+ assert InstallCommand(service).run(context=context) == 0
+ assert not (install_dir / "prompts" / "reasoning.prompt.md").exists()
+ assert (install_dir / "skills" / "reasoning" / "SKILL.md").exists()
+ assert not (tmp_path / ".vstack").exists()
+
+
+def test_source_validation_failure_does_not_retire_prompts(
+ service: CommandService, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
+) -> None:
+ """Failed generation does not trigger cleanup of the previous release's workflows."""
+ install_dir = tmp_path / ".github"
+ track_prompts(service, install_dir, ["quick-review"])
+ gen = service.gen_for("skill")
+ assert gen is not None
+ monkeypatch.setattr(
+ gen,
+ "verify_input",
+ lambda: ValidationResult(messages=[CheckMessage(level="fail", message="bad source")]),
+ )
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 1
+ assert (install_dir / "prompts" / "quick-review.prompt.md").exists()
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert manifest.names_for("prompts") == ["quick-review"]
+
+
+def test_retired_prompt_exclusions_warn_instead_of_blocking_upgrade(
+ tmp_path: Path, capsys: pytest.CaptureFixture[str]
+) -> None:
+ """Legacy exclusion keys no longer select a type, and explain their replacement."""
+ from vstack.cli.interface import CommandLineInterface
+
+ config = tmp_path / ".vstack" / "config.yaml"
+ config.parent.mkdir()
+ config.write_text("exclude:\n prompts: all\n", encoding="utf-8")
+ assert CommandLineInterface._read_exclude(tmp_path / ".github") == (frozenset(), {})
+ assert "exclude.prompts is retired" in capsys.readouterr().err
diff --git a/tests/vstack/cli/test_service.py b/tests/vstack/cli/test_service.py
index ecc52afb..408d08b6 100644
--- a/tests/vstack/cli/test_service.py
+++ b/tests/vstack/cli/test_service.py
@@ -64,7 +64,7 @@ def test_cli_class_uses_known_types(self) -> None:
"""Service generators cover all known artifact families."""
svc = CommandService(templates_root=TEMPLATES_ROOT)
names = {g.config.type_name for g in svc.generators}
- assert names == {"skill", "agent", "hook", "instruction", "prompt"}
+ assert names == {"skill", "agent", "hook", "instruction"}
def test_custom_items_root_is_passed_to_agent_generator(self, tmp_path: Path) -> None:
"""items_root kwarg is forwarded to the AgentGenerator instance."""
diff --git a/tests/vstack/cli/test_status.py b/tests/vstack/cli/test_status.py
index bc7e6879..9f2f63df 100644
--- a/tests/vstack/cli/test_status.py
+++ b/tests/vstack/cli/test_status.py
@@ -32,7 +32,7 @@ def _fake_execute(*args, **kwargs):
context = CommandContext(
args=Namespace(output_format="json", verbose=True, no_color=True),
install_dir=tmp_path,
- only=["prompt"],
+ only=["skill"],
)
assert StatusCommand(service=cast(CommandService, object())).run(context=context) == 3
assert captured["kwargs"]["output_format"] == "json"
diff --git a/tests/vstack/prompts/test___init__.py b/tests/vstack/prompts/test___init__.py
deleted file mode 100644
index 65e3f940..00000000
--- a/tests/vstack/prompts/test___init__.py
+++ /dev/null
@@ -1,19 +0,0 @@
-"""Tests for vstack.prompts package public API."""
-
-from __future__ import annotations
-
-from vstack.prompts import PromptGenerator
-
-
-class TestPromptsInit:
- """Test cases for vstack.prompts package exports."""
-
- def test_exports_prompt_generator(self) -> None:
- """Package exports PromptGenerator at the top level."""
- assert PromptGenerator is not None
-
- def test_all_contains_prompt_generator(self) -> None:
- """__all__ declares PromptGenerator."""
- import vstack.prompts as mod
-
- assert "PromptGenerator" in mod.__all__
diff --git a/tests/vstack/prompts/test_config.py b/tests/vstack/prompts/test_config.py
deleted file mode 100644
index 43311756..00000000
--- a/tests/vstack/prompts/test_config.py
+++ /dev/null
@@ -1,29 +0,0 @@
-"""Tests for prompt artifact type configuration."""
-
-from __future__ import annotations
-
-from vstack.prompts.config import PROMPT_TYPE
-
-
-class TestPromptType:
- """Test cases for PROMPT_TYPE artifact configuration."""
-
- def test_type_name_is_prompt(self) -> None:
- """type_name must be 'prompt'."""
- assert PROMPT_TYPE.type_name == "prompt"
-
- def test_output_subdir_is_prompts(self) -> None:
- """Output artifacts go under the prompts subdirectory."""
- assert PROMPT_TYPE.output_subdir == "prompts"
-
- def test_artifact_is_not_dir(self) -> None:
- """Prompts produce single-file artifacts, not directories."""
- assert PROMPT_TYPE.artifact_is_dir is False
-
- def test_add_frontmatter_is_true(self) -> None:
- """Prompt artifacts include frontmatter."""
- assert PROMPT_TYPE.add_frontmatter is True
-
- def test_auto_gen_footer_is_true(self) -> None:
- """Prompt artifacts include the auto-gen footer."""
- assert PROMPT_TYPE.auto_gen_footer is True
diff --git a/tests/vstack/prompts/test_constants.py b/tests/vstack/prompts/test_constants.py
deleted file mode 100644
index 9086d22d..00000000
--- a/tests/vstack/prompts/test_constants.py
+++ /dev/null
@@ -1,25 +0,0 @@
-"""Tests for prompt module constants."""
-
-from __future__ import annotations
-
-from vstack.prompts.constants import (
- PROMPT_OUTPUT_SUBDIR,
- PROMPT_OUTPUT_SUFFIX,
- PROMPT_TEMPLATES_SUBDIR,
-)
-
-
-class TestPromptConstants:
- """Test cases for prompt constant values."""
-
- def test_output_suffix_is_prompt_md(self) -> None:
- """Output suffix must end with .prompt.md."""
- assert PROMPT_OUTPUT_SUFFIX == ".prompt.md"
-
- def test_templates_subdir_is_prompts(self) -> None:
- """Templates subdir must be 'prompts'."""
- assert PROMPT_TEMPLATES_SUBDIR == "prompts"
-
- def test_output_subdir_is_prompts(self) -> None:
- """Output subdir must be 'prompts'."""
- assert PROMPT_OUTPUT_SUBDIR == "prompts"
diff --git a/tests/vstack/prompts/test_generator.py b/tests/vstack/prompts/test_generator.py
deleted file mode 100644
index 778cddda..00000000
--- a/tests/vstack/prompts/test_generator.py
+++ /dev/null
@@ -1,14 +0,0 @@
-"""Tests for prompt generator behavior."""
-
-from __future__ import annotations
-
-from vstack.prompts.generator import PromptGenerator
-
-
-class TestPromptGenerator:
- """Test cases for PromptGenerator."""
-
- def test_generator_uses_prompt_type(self) -> None:
- """Test that generator uses prompt type."""
- gen = PromptGenerator()
- assert gen.config.type_name == "prompt"
From 4761cb1ea8638167a56d39a6d5310a68f9eea1f1 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 15:50:11 +0200
Subject: [PATCH 2/9] feat(python): support Python 3.15 and default to Python
3.14
Retain Python 3.11 compatibility and extend tox and CI coverage through 3.15. Update pyenv patch versions, package metadata, lockfile, and support documentation.
Validation: 698 tests with 100% coverage on each supported minor; lint, typecheck, formatting, Markdown lint, package builds, and boundary wheel smoke tests pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
.github/workflows/README.md | 2 +-
.github/workflows/check.yml | 2 +-
.github/workflows/commit.yml | 4 +-
.github/workflows/publish.yml | 2 +-
.github/workflows/security.yml | 2 +-
.github/workflows/verify.yml | 4 +-
.python-version | 9 +++--
CONTRIBUTING.md | 9 ++++-
Makefile | 12 +++---
README-pypi.md | 2 +-
README.md | 2 +-
docs/architecture/adr/007-python-runtime.md | 21 ++++++++--
docs/architecture/homebrew-publish-plan.md | 2 +-
docs/architecture/overview.md | 2 +-
docs/design/cicd.md | 44 +++++++++++----------
docs/design/workflow.md | 4 +-
docs/product/requirements.md | 4 +-
poetry.lock | 9 +++--
pyproject.toml | 5 ++-
19 files changed, 86 insertions(+), 55 deletions(-)
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index 1ecf5b7b..b79719fe 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -9,7 +9,7 @@ For the full CI/CD design and release model, see `docs/design/cicd.md`.
| Workflow | Trigger | Purpose |
| --- | --- | --- |
| `commit.yml` | push to non-main branches and PRs to `main` | Commit/branch policy and lint/typecheck |
-| `check.yml` | push to non-main branches and PRs to `main` | Single-version unit test feedback (py3.11) |
+| `check.yml` | push to non-main branches and PRs to `main` | Single-version unit test feedback (py3.14) |
| `verify.yml` | pull_request to `main` | Required verification checks: cross-version test matrix + artifact verify |
| `security.yml` | pull_request to `main` | Required security checks |
| `codeql.yml` | push/pull_request to `main` + weekly schedule | Code scanning for Actions and Python with CodeQL |
diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml
index 192f15a2..338e6525 100644
--- a/.github/workflows/check.yml
+++ b/.github/workflows/check.yml
@@ -24,7 +24,7 @@ permissions:
contents: read
env:
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.14"
POETRY_VERSION: "2.4.1"
POETRY_VIRTUALENVS_IN_PROJECT: "true"
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml
index 1ab8d487..bbe31c33 100644
--- a/.github/workflows/commit.yml
+++ b/.github/workflows/commit.yml
@@ -25,7 +25,7 @@ permissions:
contents: read
env:
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.14"
POETRY_VERSION: "2.4.1"
POETRY_VIRTUALENVS_IN_PROJECT: "true"
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
@@ -125,7 +125,7 @@ jobs:
fi
quality:
- # Lint, format, and typecheck on the baseline Python version.
+ # Run tools on the default Python; compatibility targets stay at the minimum.
name: Format Lint Typecheck
runs-on: ubuntu-latest
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 702eae8b..adaaafd2 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -18,7 +18,7 @@ permissions:
id-token: write
env:
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.14"
POETRY_VERSION: "2.4.1"
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
TRUSTED_RELEASE_ACTORS: "vstack-release-bot[bot],eschaar"
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index 9b04280a..d2da57ef 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -19,7 +19,7 @@ permissions:
env:
# Keep scanner runtime consistent across runs.
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.14"
# Pin Poetry CLI version for deterministic CI behavior.
POETRY_VERSION: "2.4.1"
# Keep Poetry virtual environments inside the workspace for deterministic paths.
diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml
index e322dde5..27ce56bd 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify.yml
@@ -19,7 +19,7 @@ permissions:
env:
# Shared interpreter version for reproducible CI behavior.
- PYTHON_VERSION: "3.11"
+ PYTHON_VERSION: "3.14"
# Pin Poetry CLI version for deterministic CI behavior.
POETRY_VERSION: "2.4.1"
# Keep Poetry virtual environments inside the workspace for deterministic paths.
@@ -35,7 +35,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- python-version: ["3.11", "3.12", "3.13", "3.14"]
+ python-version: ["3.11", "3.12", "3.13", "3.14", "3.15"]
steps:
- name: Checkout
diff --git a/.python-version b/.python-version
index ef3e413c..be0c7e98 100644
--- a/.python-version
+++ b/.python-version
@@ -1,4 +1,5 @@
-3.14.3
-3.13.12
-3.12.12
-3.11.14
+3.14.8
+3.15.0
+3.13.16
+3.12.15
+3.11.17
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index fe4cb46c..ec4fb272 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -4,9 +4,16 @@ Thanks for your interest in contributing to vstack.
## Prerequisites
-- Python 3.11-3.14
+- Python 3.11-3.15 (Python 3.14 is the default development and CI runtime)
- Virtual environment enabled
+The repository's `.python-version` selects Python 3.14.8 by default and lists
+the patch versions used for the 3.11-3.15 test matrix. With pyenv,
+run `pyenv install --skip-existing 3.14.8` before setup and install the other
+listed versions before running the full test matrix.
+CI selects the latest available patch release for each minor version.
+Python 3.11 remains supported while it receives upstream security updates.
+
## Setup
```bash
diff --git a/Makefile b/Makefile
index 1f33ced5..1da0a0af 100644
--- a/Makefile
+++ b/Makefile
@@ -30,14 +30,14 @@ help:
@echo " make setup - create .venv, install dev tools, install pre-commit hook"
@echo " make format - format Python and Markdown"
@echo " make lint - lint Python"
- @echo " make test - run tests on Python 3.11-3.14 via tox"
+ @echo " make test - run tests on Python 3.11-3.15 via tox"
@echo " make test-local - run pytest on current interpreter only"
@echo " make test-fixtures - run fixture-only generator tests without coverage"
@echo " make check - full local quality gate"
@echo " make verify-fast - fast deterministic checks: format-check + lint + typecheck + test-local"
@echo " make verify-full - full verification profile: check + vstack-validate"
@echo " make ci - check + vstack template validation"
- @echo " make tox - run pytest across Python 3.11-3.14 (if interpreters are available)"
+ @echo " make tox - run pytest across Python 3.11-3.15 (if interpreters are available)"
@echo " make clean - remove build/cache artifacts"
@echo " make vstack-install - install generated artifacts into target"
@echo ""
@@ -62,14 +62,14 @@ help-all:
@echo " make markdown-format-check - run markdown formatting check hook (may rewrite files)"
@echo " make markdown-lint - lint Markdown via pre-commit markdownlint hook"
@echo " make typecheck - run mypy on src/ and tests/"
- @echo " make test - run pytest matrix via tox (py311, py312, py313, py314)"
+ @echo " make test - run pytest matrix via tox (py311, py312, py313, py314, py315)"
@echo " make test-local - run pytest on current interpreter only"
@echo " make test-fixtures - run fixture-only generator tests without coverage"
@echo " make check - run format-check + markdown checks + lint + typecheck + test"
@echo " make verify-fast - run format-check + lint + typecheck + test-local"
@echo " make verify-full - run check + vstack-validate"
@echo " make ci - run check + vstack-validate"
- @echo " make tox - run tox pytest matrix (py311, py312, py313, py314)"
+ @echo " make tox - run tox pytest matrix (py311, py312, py313, py314, py315)"
@echo " make tox-all - run all tox envs (tests + lint + type)"
@echo " make vstack-validate - run vstack validate"
@echo " make vstack-install - run vstack install --target (default .)"
@@ -138,7 +138,7 @@ test-fixtures:
$(VENV_PYTHON) -m pytest -q tests/vstack/artifacts/test_generator.py -k "golden_fixture or defect_fixture" --no-cov
test:
- $(TOX_PYTHON) -m tox -e py311,py312,py313,py314
+ $(TOX_PYTHON) -m tox -e py311,py312,py313,py314,py315
check: format-check markdown-lint lint typecheck test
@@ -149,7 +149,7 @@ verify-full: check vstack-validate
ci: check vstack-validate
tox:
- $(TOX_PYTHON) -m tox -e py311,py312,py313,py314
+ $(TOX_PYTHON) -m tox -e py311,py312,py313,py314,py315
tox-all:
$(TOX_PYTHON) -m tox
diff --git a/README-pypi.md b/README-pypi.md
index 1d5717e8..c24cbf07 100644
--- a/README-pypi.md
+++ b/README-pypi.md
@@ -3,7 +3,7 @@
[](https://pypi.org/project/vstack/)
-[](https://github.com/eschaar/vstack/blob/main/pyproject.toml)
+[](https://github.com/eschaar/vstack/blob/main/pyproject.toml)
[](https://github.com/eschaar/vstack/actions/workflows/verify.yml)
[](https://github.com/eschaar/vstack/actions/workflows/security.yml)
[](https://github.com/eschaar/vstack/blob/main/pyproject.toml)
diff --git a/README.md b/README.md
index a77072dc..a6ca6416 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
[](https://pypi.org/project/vstack/)
-[](pyproject.toml)
+[](pyproject.toml)
[](https://github.com/eschaar/vstack/actions/workflows/verify.yml)
[](https://github.com/eschaar/vstack/actions/workflows/security.yml)
[](pyproject.toml)
diff --git a/docs/architecture/adr/007-python-runtime.md b/docs/architecture/adr/007-python-runtime.md
index 82341628..ca188c4e 100644
--- a/docs/architecture/adr/007-python-runtime.md
+++ b/docs/architecture/adr/007-python-runtime.md
@@ -35,12 +35,27 @@ Zero external Python dependencies at runtime. All runtime code uses stdlib only:
## rationale
-Python 3.11–3.14 is the supported range, matching CI and type-checking compatibility
-requirements. The package is distributed via PyPI with no runtime dependencies beyond
-the Python standard library.
+Python 3.11–3.15 is the supported and tested range. Python 3.14 is the default
+development, build, and single-version CI runtime; compatibility targets for
+linters and type checkers remain at Python 3.11.
+
+As of 2026-10-17, the project adds Python 3.15 while retaining Python 3.11,
+which receives upstream security support until October 2027. Dropping 3.11
+would reduce the validation range but unnecessarily exclude existing consumers;
+defaulting to 3.15 would adopt the newest runtime immediately. Instead, 3.14
+remains the stable default while the full suite validates 3.11 through 3.15.
+Package metadata declares `>=3.11` without an upper bound; future versions are
+not claimed as tested until added to the matrix.
+
+The repository pins the default interpreter to Python 3.14.8 and lists exact
+patch versions for the other supported minors in `.python-version`. CI uses the
+latest available patch in each selected minor. Existing virtual environments
+are not automatically recreated when these pins change.
## impact on future orchestrated pipeline
The future orchestrated pipeline runner will be implemented in Python.
`asyncio` + `subprocess` provide sufficient primitives for sequential and parallel
stage execution.
+Any future orchestrated pipeline runner must also support Python 3.11–3.15;
+the default interpreter does not permit using Python 3.14-only APIs in shared code.
diff --git a/docs/architecture/homebrew-publish-plan.md b/docs/architecture/homebrew-publish-plan.md
index 2b35bbe3..4f6a30aa 100644
--- a/docs/architecture/homebrew-publish-plan.md
+++ b/docs/architecture/homebrew-publish-plan.md
@@ -117,7 +117,7 @@ class Vstack < Formula
license "MIT"
head "https://github.com/eschaar/vstack.git", branch: "main"
- depends_on "python@3.11"
+ depends_on "python@3.14"
resource "pyyaml" do
url "https://files.pythonhosted.org/packages/source/P/PyYAML/PyYAML-6.0.2.tar.gz"
diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md
index 3faf092d..e3f940c0 100644
--- a/docs/architecture/overview.md
+++ b/docs/architecture/overview.md
@@ -213,7 +213,7 @@ These bind architecture decisions. Full list in `docs/product/requirements.md`.
| ID | Requirement | Architectural binding |
| ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| NFR-1 | No external binary dependencies in skill template content | ADR-006; one pip dependency (`pyyaml`) allowed per ADR-025 |
-| NFR-2 | Python 3.11–3.14 compatibility | ADR-007 |
+| NFR-2 | Python 3.11–3.15 compatibility; Python 3.14 by default | ADR-007 |
| NFR-3 | Manifest writes are atomic | ADR-016 |
| NFR-4 | All public behavior covered by automated tests; CI enforces test pass | `tests/` structure, `verify.yml` workflow |
| NFR-5 | CLI operates standalone; no VS Code process required for CLI operations | ADR-006; only `pyyaml` required at runtime (ADR-025) |
diff --git a/docs/design/cicd.md b/docs/design/cicd.md
index 18b6f203..a350391c 100644
--- a/docs/design/cicd.md
+++ b/docs/design/cicd.md
@@ -1,7 +1,7 @@
# vstack CI/CD Pipeline
> Maintained by: **designer** role\
-> Last updated: 2026-06-02
+> Last updated: 2026-10-17
## Overview
@@ -22,8 +22,8 @@ Their jobs are merge-blocking when configured as required status checks in the `
| Workflow | Trigger | Responsibility |
| --------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `.github/workflows/commit.yml` | push to non-main branches, pull_request to `main` | Commit/branch policy and lint/typecheck |
-| `.github/workflows/check.yml` | push to non-main branches, pull_request to `main` | Single-version unit tests (py3.11) |
-| `.github/workflows/verify.yml` | pull_request to `main` | Cross-version test matrix (py3.11–3.14), fixture tests, and artifact install verify |
+| `.github/workflows/check.yml` | push to non-main branches, pull_request to `main` | Single-version unit tests (py3.14) |
+| `.github/workflows/verify.yml` | pull_request to `main` | Cross-version test matrix (py3.11–3.15), fixture tests, and artifact install verify |
| `.github/workflows/security.yml` | pull_request to `main` | Dependency vulnerability scan and secret scan |
| `.github/workflows/codeql.yml` | push/pull_request to `main` + weekly schedule | Code scanning for GitHub Actions and Python |
| `.github/workflows/automerge.yml` | pull_request_target to `main` | Dependabot auto-approve/auto-merge policy gate |
@@ -46,13 +46,13 @@ sequenceDiagram
Dev->>GH: [1] Push commit to feature branch
GH->>GH: [2a] commit.yml / Validate Commit Messages
GH->>GH: [2b] commit.yml / Format Lint Typecheck
- GH->>GH: [2c] check.yml / Unit Tests (py3.11)
+ GH->>GH: [2c] check.yml / Unit Tests (py3.14)
Dev->>GH: [3] Open PR to main
GH->>GH: [4a] commit.yml / Validate Commit Messages
GH->>GH: [4b] commit.yml / Format Lint Typecheck
- GH->>GH: [4c] check.yml / Unit Tests (py3.11)
- GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast)
+ GH->>GH: [4c] check.yml / Unit Tests (py3.14)
+ GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast)
GH->>GH: [4e] verify.yml / Artifact Install Verify
GH->>GH: [4f] security.yml / Dependency and Secret Scan
Dev->>GH: [5] Approve and merge PR
@@ -60,7 +60,7 @@ sequenceDiagram
GH->>GH: [6] Push to main triggers release.yml
GH->>RP: [7] release.yml / Release Please (PR + Tag + Notes)
RP-->>GH: [8] Create or update release PR branch + PR
- GH->>GH: [9a] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast)
+ GH->>GH: [9a] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast)
GH->>GH: [9b] verify.yml / Artifact Install Verify
GH->>GH: [9c] security.yml / Dependency and Secret Scan
@@ -82,13 +82,13 @@ sequenceDiagram
1. `[1]` Push commit to feature branch.
1. `[2a]` `commit.yml / Validate Commit Messages` — checks commit format, branch name, and reserved scope policy.
-1. `[2b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.11.
-1. `[2c]` `check.yml / Unit Tests` — runs `make test-local` on py3.11.
+1. `[2b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.14, targeting compatibility with py3.11.
+1. `[2c]` `check.yml / Unit Tests` — runs `make test-local` on py3.14.
1. `[3]` Open PR to `main`.
1. `[4a]` `commit.yml / Validate Commit Messages` — validates commit messages, branch policy, and reserved `docs(changelog)` scope.
-1. `[4b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.11.
-1. `[4c]` `check.yml / Unit Tests` — runs `make test-local` on py3.11.
-1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.14)` plus `Fixture Tests (fast)` — matrix jobs run `make test-local`; fixture job runs `make test-fixtures`.
+1. `[4b]` `commit.yml / Format Lint Typecheck` — runs `make format-check`, `make lint`, `make typecheck` on py3.14, targeting compatibility with py3.11.
+1. `[4c]` `check.yml / Unit Tests` — runs `make test-local` on py3.14.
+1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.15)` plus `Fixture Tests (fast)` — matrix jobs run `make test-local`; fixture job runs `make test-fixtures`.
1. `[4e]` `verify.yml / Artifact Install Verify` — installs vstack into a temp dir and runs `vstack verify`.
1. `[4f]` `security.yml / Dependency and Secret Scan` — pip-audit + trufflehog diff scan.
1. `[5]` Approve and merge PR.
@@ -119,13 +119,13 @@ sequenceDiagram
DB->>GH: [1] Push dependency branch update
GH->>GH: [2a] commit.yml / Validate Commit Messages
GH->>GH: [2b] commit.yml / Format Lint Typecheck
- GH->>GH: [2c] check.yml / Unit Tests (py3.11)
+ GH->>GH: [2c] check.yml / Unit Tests (py3.14)
DB->>GH: [3] Open dependency PR to main
GH->>GH: [4a] commit.yml / Validate Commit Messages
GH->>GH: [4b] commit.yml / Format Lint Typecheck
- GH->>GH: [4c] check.yml / Unit Tests (py3.11)
- GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4]
+ GH->>GH: [4c] check.yml / Unit Tests (py3.14)
+ GH->>GH: [4d] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5]
GH->>GH: [4e] verify.yml / Artifact Install Verify
GH->>GH: [4f] security.yml / Dependency and Secret Scan
Note over GH: [5] automerge.yml job runs only if actor == dependabot[bot]
@@ -145,7 +145,7 @@ sequenceDiagram
GH->>GH: [11] Push to main triggers release.yml
GH->>RP: [12] release.yml / Release Please (PR + Tag + Notes)
RP-->>GH: [13] Create or update release PR branch + PR
- GH->>GH: [14a] verify.yml / Tests (py3.11) — Tests (py3.14) [matrix ×4] + Fixture Tests (fast)
+ GH->>GH: [14a] verify.yml / Tests (py3.11) — Tests (py3.15) [matrix ×5] + Fixture Tests (fast)
GH->>GH: [14b] verify.yml / Artifact Install Verify
GH->>GH: [14c] security.yml / Dependency and Secret Scan
@@ -162,13 +162,13 @@ sequenceDiagram
1. `[1]` Dependabot pushes dependency update branch.
1. `[2a]` `commit.yml / Validate Commit Messages` — commit format and branch name validated (`chore(deps)` / `chore(ci)` prefix, `dependabot/` branch).
-1. `[2b]` `commit.yml / Format Lint Typecheck` — lint/typecheck on py3.11.
-1. `[2c]` `check.yml / Unit Tests` — `make test-local` on py3.11.
+1. `[2b]` `commit.yml / Format Lint Typecheck` — lint/typecheck on py3.14, targeting compatibility with py3.11.
+1. `[2c]` `check.yml / Unit Tests` — `make test-local` on py3.14.
1. `[3]` Dependabot opens PR to `main`.
1. `[4a]` `commit.yml / Validate Commit Messages` — commit message policy on PR commits.
1. `[4b]` `commit.yml / Format Lint Typecheck`.
1. `[4c]` `check.yml / Unit Tests`.
-1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.14)` plus `Fixture Tests (fast)`.
+1. `[4d]` `verify.yml / Tests (py3.11)` through `Tests (py3.15)` plus `Fixture Tests (fast)`.
1. `[4e]` `verify.yml / Artifact Install Verify`.
1. `[4f]` `security.yml / Dependency and Secret Scan`.
1. `[5]` `automerge.yml` job runs only when `github.actor == 'dependabot[bot]'`.
@@ -204,7 +204,7 @@ Configure via **Settings → Rules → Rulesets** on GitHub.
- `Commit / Validate Commit Messages`
- `Commit / Format Lint Typecheck`
- `Check / Unit Tests`
-- `Verify / Tests (py3.11)`, `Verify / Tests (py3.12)`, `Verify / Tests (py3.13)`, `Verify / Tests (py3.14)`
+- `Verify / Tests (py3.11)`, `Verify / Tests (py3.12)`, `Verify / Tests (py3.13)`, `Verify / Tests (py3.14)`, `Verify / Tests (py3.15)`
- `Verify / Fixture Tests (fast)`
- `Verify / Artifact Install Verify`
- `Security / Dependency and Secret Scan`
@@ -214,6 +214,10 @@ Configure via **Settings → Rules → Rulesets** on GitHub.
- **Allowed merge methods**: must include **Squash** — required for `automerge.yml` to enable auto-merge for Dependabot PRs.
- **Restrict force pushes**: enabled.
+When extending the Python support range, add the required `py3.15` check
+to the GitHub Ruleset while retaining `py3.11`. Workflow changes do not update
+repository settings automatically.
+
### Actions permissions
Configure via **Settings → Actions → General**.
diff --git a/docs/design/workflow.md b/docs/design/workflow.md
index 442a6325..46c75034 100644
--- a/docs/design/workflow.md
+++ b/docs/design/workflow.md
@@ -238,8 +238,8 @@ and easy to reason about.
| Workflow | Trigger | Responsibility |
| --------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `.github/workflows/commit.yml` | Push to non-main branches and pull requests to `main` | Commit/branch policy and lint/typecheck gate. |
-| `.github/workflows/check.yml` | Push to non-main branches and pull requests to `main` | Single-version unit tests (py3.11) for fast feedback. |
-| `.github/workflows/verify.yml` | Pull request to `main` | Cross-version test matrix (py3.11–3.14) and artifact install/verify flow. |
+| `.github/workflows/check.yml` | Push to non-main branches and pull requests to `main` | Single-version unit tests (py3.14) for fast feedback. |
+| `.github/workflows/verify.yml` | Pull request to `main` | Cross-version test matrix (py3.11–3.15) and artifact install/verify flow. |
| `.github/workflows/security.yml` | Pull request to `main` | Dependency vulnerability audit and secret scan. |
| `.github/workflows/codeql.yml` | Push/pull request to `main` + weekly schedule | Code scanning for GitHub Actions and Python. |
| `.github/workflows/automerge.yml` | Pull request target to `main` | Dependabot safe auto-merge policy for eligible updates. |
diff --git a/docs/product/requirements.md b/docs/product/requirements.md
index b363462a..e2e037fc 100644
--- a/docs/product/requirements.md
+++ b/docs/product/requirements.md
@@ -124,7 +124,7 @@ ______________________________________________________________________
| ID | Requirement |
| ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| NFR-1 | One runtime dependency only: PyYAML (`pyyaml>=6.0`) for YAML frontmatter parsing. |
-| NFR-2 | Python 3.11–3.14 compatibility. |
+| NFR-2 | Python 3.11–3.15 compatibility; Python 3.14 is the default development and CI runtime. |
| NFR-3 | Manifest writes are atomic: write to a temporary file, then replace atomically. |
| NFR-4 | All public behavior exercised by automated tests (pytest). CI gate enforces test pass. |
| NFR-5 | CLI operates standalone; no VS Code process required for `install`, `verify`, or `validate`. |
@@ -157,5 +157,5 @@ ______________________________________________________________________
at runtime.
1. Manifest schema is versioned; old manifests require explicit upgrade before further
use.
-1. CLI behavior must be reproducible across Python 3.11–3.14.
+1. CLI behavior must be reproducible across Python 3.11–3.15.
1. No cloud, network, or VS Code process dependency for CLI operations.
diff --git a/poetry.lock b/poetry.lock
index 9e1fba2d..979d2925 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -405,7 +405,10 @@ ast-serialize = ">=0.6.0,<1.0.0"
librt = {version = ">=0.13.0", markers = "platform_python_implementation != \"PyPy\""}
mypy_extensions = ">=1.0.0"
pathspec = ">=1.0.0"
-typing_extensions = {version = ">=4.6.0", markers = "python_version < \"3.15\""}
+typing_extensions = [
+ {version = ">=4.6.0", markers = "python_version < \"3.15\""},
+ {version = ">=4.14.0", markers = "python_version >= \"3.15\""},
+]
[package.extras]
dmypy = ["psutil (>=4.0)"]
@@ -802,5 +805,5 @@ python-discovery = ">=1.4.2"
[metadata]
lock-version = "2.1"
-python-versions = ">=3.11,<3.15"
-content-hash = "289466667e6732d99a4c97d293554faebc87ed1a8bf88b853e984713d93fab78"
+python-versions = ">=3.11"
+content-hash = "f3c255c6d01cb73602afb27d4d76ee064cd692c6183bb8230292dee6fd25615c"
diff --git a/pyproject.toml b/pyproject.toml
index 6ff41b5b..6bb5632b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ dynamic = ["version"]
description = "VS Code-native AI engineering workflow system for microservices, libraries, and backend systems."
license = "MIT"
readme = "README-pypi.md"
-requires-python = ">=3.11,<3.15"
+requires-python = ">=3.11"
dependencies = ["pyyaml>=6.0.3"]
keywords = [
"github-copilot",
@@ -38,6 +38,7 @@ classifiers = [
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
+ "Programming Language :: Python :: 3.15",
"Environment :: Console",
"Intended Audience :: Developers",
"Topic :: Software Development :: Build Tools",
@@ -179,7 +180,7 @@ extraPaths = ["scripts"]
legacy_tox_ini = """
[tox]
min_version = 4.54.0
-env_list = py311, py312, py313, py314, lint, type
+env_list = py311, py312, py313, py314, py315, lint, type
skip_missing_interpreters = true
[testenv]
From 217624ce67b50a81567db9eb90c3f787bd1d4c68 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 15:58:27 +0200
Subject: [PATCH 3/9] fix(skills): keep vstack artifact audit repository-local
Remove the maintenance-only artifact-integrity template from distribution and retain its hand-authored skill outside manifest ownership. Map the retired prompt to inspect and reuse conservative obsolete cleanup for previously managed copies.
Document repository-only artifact ownership and cover fresh installs, forced installs, pruning, and modified legacy copies. Validation: 702 tests with 100% coverage, including Python 3.11 and 3.15; lint, typing, formatting, packaging, and manifest checks pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
.github/agents/architect.agent.md | 2 +-
.github/agents/designer.agent.md | 2 +-
.github/agents/engineer.agent.md | 2 +-
.github/agents/planner.agent.md | 2 +-
.github/agents/product.agent.md | 2 +-
.github/agents/release.agent.md | 2 +-
.github/agents/tester.agent.md | 2 +-
.github/copilot-instructions.md | 15 +-
.github/instructions/git.instructions.md | 2 +-
.github/instructions/helm.instructions.md | 2 +-
.github/instructions/java.instructions.md | 2 +-
.github/instructions/k8s.instructions.md | 2 +-
.github/instructions/markdown.instructions.md | 2 +-
.github/instructions/python.instructions.md | 2 +-
.github/instructions/rancher.instructions.md | 2 +-
.github/instructions/security.instructions.md | 2 +-
.../instructions/terraform.instructions.md | 2 +-
.../instructions/terragrunt.instructions.md | 2 +-
.github/instructions/testing.instructions.md | 2 +-
.../instructions/typescript.instructions.md | 2 +-
.github/skills/adr/SKILL.md | 2 +-
.github/skills/advise/SKILL.md | 2 +-
.github/skills/analyse/SKILL.md | 2 +-
.github/skills/architecture/SKILL.md | 2 +-
.github/skills/artifact-integrity/SKILL.md | 10 +-
.github/skills/ask/SKILL.md | 2 +-
.github/skills/aws-cli/SKILL.md | 2 +-
.github/skills/changedoc/SKILL.md | 2 +-
.github/skills/cicd/SKILL.md | 2 +-
.github/skills/cloudformation/SKILL.md | 2 +-
.github/skills/code-review/SKILL.md | 2 +-
.github/skills/codeql/SKILL.md | 2 +-
.github/skills/concise/SKILL.md | 2 +-
.github/skills/consult/SKILL.md | 2 +-
.github/skills/container/SKILL.md | 2 +-
.github/skills/conventional-commit/SKILL.md | 2 +-
.github/skills/copilot-ops/SKILL.md | 2 +-
.github/skills/debug/SKILL.md | 2 +-
.github/skills/dependabot/SKILL.md | 2 +-
.github/skills/dependency/SKILL.md | 2 +-
.github/skills/design/SKILL.md | 2 +-
.github/skills/docs/SKILL.md | 2 +-
.github/skills/explore/SKILL.md | 2 +-
.github/skills/gdpr/SKILL.md | 2 +-
.github/skills/gh-issues/SKILL.md | 2 +-
.github/skills/gh-release/SKILL.md | 2 +-
.github/skills/guardrails/SKILL.md | 2 +-
.github/skills/helm/SKILL.md | 2 +-
.github/skills/incident/SKILL.md | 2 +-
.github/skills/inspect/SKILL.md | 2 +-
.github/skills/k8s/SKILL.md | 2 +-
.github/skills/lazy/SKILL.md | 2 +-
.github/skills/migrate/SKILL.md | 2 +-
.github/skills/migration-plan/SKILL.md | 2 +-
.github/skills/onboard/SKILL.md | 2 +-
.github/skills/openapi/SKILL.md | 2 +-
.github/skills/performance/SKILL.md | 2 +-
.github/skills/postmortem/SKILL.md | 2 +-
.github/skills/pr/SKILL.md | 2 +-
.github/skills/rancher/SKILL.md | 2 +-
.github/skills/rca/SKILL.md | 2 +-
.github/skills/reasoning/SKILL.md | 2 +-
.github/skills/release-check/SKILL.md | 2 +-
.github/skills/release-notes/SKILL.md | 2 +-
.github/skills/requirements/SKILL.md | 2 +-
.github/skills/secret-scan/SKILL.md | 2 +-
.github/skills/security/SKILL.md | 2 +-
.github/skills/simplify/SKILL.md | 2 +-
.github/skills/space-setup/SKILL.md | 2 +-
.github/skills/terraform/SKILL.md | 2 +-
.github/skills/terragrunt/SKILL.md | 2 +-
.github/skills/threat-model/SKILL.md | 2 +-
.github/skills/upgrade-plan/SKILL.md | 2 +-
.github/skills/verify/SKILL.md | 2 +-
.github/skills/vision/SKILL.md | 2 +-
.github/skills/workflow-check/SKILL.md | 2 +-
.vstack/vstack.json | 173 +++++++++---------
.../adr/032-skills-replace-prompts.md | 9 +
docs/architecture/overview.md | 7 +-
docs/design/overview.md | 7 +
docs/design/skills.md | 11 +-
docs/design/workflow.md | 5 +-
docs/product/roadmap.md | 7 +-
docs/user/reference/prompt-migration.md | 45 +++--
docs/user/reference/skills-overview.md | 6 +-
.../skills/artifact-integrity/config.yaml | 7 -
.../skills/artifact-integrity/template.md | 51 ------
src/vstack/cli/constants.py | 3 +-
tests/vstack/artifacts/test_generator.py | 1 -
tests/vstack/cli/test_constants.py | 1 -
tests/vstack/cli/test_prompt_migration.py | 69 +++++++
91 files changed, 314 insertions(+), 261 deletions(-)
delete mode 100644 src/vstack/_templates/skills/artifact-integrity/config.yaml
delete mode 100644 src/vstack/_templates/skills/artifact-integrity/template.md
diff --git a/.github/agents/architect.agent.md b/.github/agents/architect.agent.md
index e7d0912a..b2f2d339 100644
--- a/.github/agents/architect.agent.md
+++ b/.github/agents/architect.agent.md
@@ -227,4 +227,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#threat-model` — design-time threat modeling (STRIDE-first, with DREAD/PASTA as needed)
-
+
diff --git a/.github/agents/designer.agent.md b/.github/agents/designer.agent.md
index a04d6274..dbc08ac4 100644
--- a/.github/agents/designer.agent.md
+++ b/.github/agents/designer.agent.md
@@ -241,4 +241,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#simplify` — simplify proposals and designs while preserving required outcomes
-
+
diff --git a/.github/agents/engineer.agent.md b/.github/agents/engineer.agent.md
index 3f0722c0..441c7422 100644
--- a/.github/agents/engineer.agent.md
+++ b/.github/agents/engineer.agent.md
@@ -228,4 +228,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#verify` — run tests, fix issues, re-verify loop
-
+
diff --git a/.github/agents/planner.agent.md b/.github/agents/planner.agent.md
index bf928d78..5e609943 100644
--- a/.github/agents/planner.agent.md
+++ b/.github/agents/planner.agent.md
@@ -291,4 +291,4 @@ that requires changes to upstream items, flag it and trigger a reverse handoff.
- `@#simplify` - simplify stage plans and handoffs while preserving gate requirements
-
+
diff --git a/.github/agents/product.agent.md b/.github/agents/product.agent.md
index f8bd8422..f18b86f4 100644
--- a/.github/agents/product.agent.md
+++ b/.github/agents/product.agent.md
@@ -213,4 +213,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#vision` — vision document writing and review
-
+
diff --git a/.github/agents/release.agent.md b/.github/agents/release.agent.md
index 07ba8226..cda0452a 100644
--- a/.github/agents/release.agent.md
+++ b/.github/agents/release.agent.md
@@ -203,4 +203,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#simplify` — simplify release scope and release steps while preserving controls
-
+
diff --git a/.github/agents/tester.agent.md b/.github/agents/tester.agent.md
index 56d9df33..bf2186f0 100644
--- a/.github/agents/tester.agent.md
+++ b/.github/agents/tester.agent.md
@@ -220,4 +220,4 @@ Keep this list lean. Use additional installed domain skills only when needed.
- `@#threat-model` — structured threat analysis and mitigation prioritization
-
+
diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 3271e526..0866e62c 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -50,7 +50,7 @@ src/vstack/_templates/
├── template.md ← instruction file body
└── config.yaml
docs/ ← overview.md, design.md, skills.md, workflow.md, roadmap.md, adr/
-.github/ ← generated output (never edit directly*)
+.github/ ← generated output plus hand-authored exceptions*
├── skills//SKILL.md
├── agents/.agent.md
└── instructions/.instructions.md
@@ -59,7 +59,13 @@ docs/ ← overview.md, design.md, skills.md, workflow.md, roadmap.md,
```
*Hand-authored exceptions in `.github/`: `copilot-instructions.md`, `CODEOWNERS`,
-`PULL_REQUEST_TEMPLATE/`, `ISSUE_TEMPLATE/`, `workflows/`.
+`PULL_REQUEST_TEMPLATE/`, `ISSUE_TEMPLATE/`, `workflows/`, and repository-only skills
+such as `skills/artifact-integrity/SKILL.md`.
+
+Repository-only skills live directly in `.github/skills//SKILL.md`.
+They have no template under `src/vstack/_templates/`, no generation footer, and no
+entry in `.vstack/vstack.json`. They are not packaged or installed for consumers.
+Edit these files directly; the template-first rules apply only to distributed artifacts.
Generated files are written to `.github/` at install time:
@@ -71,7 +77,8 @@ python3 -m vstack install
When vstack is installed inside its own repo (`.github/agents/` and `.github/skills/` exist):
-**Source of truth is always in `src/vstack/_templates/`.** After every change:
+**Source of truth for distributed artifacts is in `src/vstack/_templates/`.**
+Repository-only skills are hand-authored exceptions. After every template change:
| What changed | Command to run |
|---|---|
@@ -85,7 +92,7 @@ A single command handles all artifact types:
python3 -m vstack install
```
-Never edit `.github/agents/`, `.github/skills/`, or `.github/instructions/` directly — changes will be overwritten. Legacy managed prompts are retired by install/init only when safe.
+Never edit generated files in `.github/agents/`, `.github/skills/`, or `.github/instructions/` directly — changes will be overwritten. Repository-only skills are edited directly and remain outside manifest ownership. Legacy managed prompts are retired by install/init only when safe.
## Execution Model
diff --git a/.github/instructions/git.instructions.md b/.github/instructions/git.instructions.md
index 00c16620..fde263e4 100644
--- a/.github/instructions/git.instructions.md
+++ b/.github/instructions/git.instructions.md
@@ -41,4 +41,4 @@ Use these Git and release hygiene conventions.
1. Prefer local verification before pushing release-impacting changes.
-
+
diff --git a/.github/instructions/helm.instructions.md b/.github/instructions/helm.instructions.md
index a8afec2d..6f5b67f0 100644
--- a/.github/instructions/helm.instructions.md
+++ b/.github/instructions/helm.instructions.md
@@ -45,4 +45,4 @@ Use these Helm conventions.
- [Helm chart best practices](https://helm.sh/docs/chart_best_practices/)
-
+
diff --git a/.github/instructions/java.instructions.md b/.github/instructions/java.instructions.md
index 141ae7ba..0a8ab548 100644
--- a/.github/instructions/java.instructions.md
+++ b/.github/instructions/java.instructions.md
@@ -56,4 +56,4 @@ Use these Java conventions.
1. Do not suppress static analysis warnings without a documented, task-specific reason.
-
+
diff --git a/.github/instructions/k8s.instructions.md b/.github/instructions/k8s.instructions.md
index 0aa66910..47f5a32f 100644
--- a/.github/instructions/k8s.instructions.md
+++ b/.github/instructions/k8s.instructions.md
@@ -51,4 +51,4 @@ Use these Kubernetes conventions.
- [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/)
-
+
diff --git a/.github/instructions/markdown.instructions.md b/.github/instructions/markdown.instructions.md
index 3e3ea596..67f76e16 100644
--- a/.github/instructions/markdown.instructions.md
+++ b/.github/instructions/markdown.instructions.md
@@ -51,4 +51,4 @@ Use these Markdown conventions.
1. Keep examples accurate and runnable.
-
+
diff --git a/.github/instructions/python.instructions.md b/.github/instructions/python.instructions.md
index 1fbbc30a..6e4ae028 100644
--- a/.github/instructions/python.instructions.md
+++ b/.github/instructions/python.instructions.md
@@ -42,4 +42,4 @@ Use these Python conventions.
1. Do not silence lint/type errors unless there is a documented, task-specific reason.
-
+
diff --git a/.github/instructions/rancher.instructions.md b/.github/instructions/rancher.instructions.md
index 3f5487f0..75f8fe18 100644
--- a/.github/instructions/rancher.instructions.md
+++ b/.github/instructions/rancher.instructions.md
@@ -44,4 +44,4 @@ Use these Rancher conventions.
- [Fleet docs](https://fleet.rancher.io/)
-
+
diff --git a/.github/instructions/security.instructions.md b/.github/instructions/security.instructions.md
index f581e783..f399d021 100644
--- a/.github/instructions/security.instructions.md
+++ b/.github/instructions/security.instructions.md
@@ -42,4 +42,4 @@ Use these security policies.
1. Keep privileged logic minimal, auditable, and separate from business logic.
-
+
diff --git a/.github/instructions/terraform.instructions.md b/.github/instructions/terraform.instructions.md
index 2b1bc692..6cc5b8cd 100644
--- a/.github/instructions/terraform.instructions.md
+++ b/.github/instructions/terraform.instructions.md
@@ -60,4 +60,4 @@ Use these Terraform conventions.
- [tfsec](https://aquasecurity.github.io/tfsec/) · [checkov](https://www.checkov.io/)
-
+
diff --git a/.github/instructions/terragrunt.instructions.md b/.github/instructions/terragrunt.instructions.md
index 3a7ce45f..43092df4 100644
--- a/.github/instructions/terragrunt.instructions.md
+++ b/.github/instructions/terragrunt.instructions.md
@@ -57,4 +57,4 @@ Use these Terragrunt conventions.
- [Terragrunt CLI reference](https://terragrunt.gruntwork.io/docs/reference/cli-options/)
-
+
diff --git a/.github/instructions/testing.instructions.md b/.github/instructions/testing.instructions.md
index a92bd41e..0138061e 100644
--- a/.github/instructions/testing.instructions.md
+++ b/.github/instructions/testing.instructions.md
@@ -43,4 +43,4 @@ Use these testing conventions.
1. Treat flaky tests as bugs.
-
+
diff --git a/.github/instructions/typescript.instructions.md b/.github/instructions/typescript.instructions.md
index 6735d131..1d2bab9c 100644
--- a/.github/instructions/typescript.instructions.md
+++ b/.github/instructions/typescript.instructions.md
@@ -49,4 +49,4 @@ Use these TypeScript conventions.
1. Do not suppress lint or type errors with inline disable comments unless there is a documented, task-specific reason.
-
+
diff --git a/.github/skills/adr/SKILL.md b/.github/skills/adr/SKILL.md
index 194f4718..46671667 100644
--- a/.github/skills/adr/SKILL.md
+++ b/.github/skills/adr/SKILL.md
@@ -180,4 +180,4 @@ is a kebab-case title.
After writing, state the file path and summary so the architect or product role can review.
-
+
diff --git a/.github/skills/advise/SKILL.md b/.github/skills/advise/SKILL.md
index 58045ced..350d96e1 100644
--- a/.github/skills/advise/SKILL.md
+++ b/.github/skills/advise/SKILL.md
@@ -86,4 +86,4 @@ Always consider:
**Related:** See `skill/reasoning` for the underlying reasoning framework.
-
+
diff --git a/.github/skills/analyse/SKILL.md b/.github/skills/analyse/SKILL.md
index 323f1f77..07050298 100644
--- a/.github/skills/analyse/SKILL.md
+++ b/.github/skills/analyse/SKILL.md
@@ -214,4 +214,4 @@ State conclusions with confidence level:
```
-
+
diff --git a/.github/skills/architecture/SKILL.md b/.github/skills/architecture/SKILL.md
index 54300fe7..77975ce4 100644
--- a/.github/skills/architecture/SKILL.md
+++ b/.github/skills/architecture/SKILL.md
@@ -278,4 +278,4 @@ For each significant structural decision made during this review (technology cho
- Update `docs/architecture/overview.md` to reflect the final decisions.
-
+
diff --git a/.github/skills/artifact-integrity/SKILL.md b/.github/skills/artifact-integrity/SKILL.md
index 4456d206..8e19d7f3 100644
--- a/.github/skills/artifact-integrity/SKILL.md
+++ b/.github/skills/artifact-integrity/SKILL.md
@@ -1,6 +1,6 @@
---
name: artifact-integrity
-description: 'Check source templates against generated artifacts and identify drift or missing regeneration.'
+description: 'Audit source templates and generated artifacts in the vstack source repository only.'
allowed-tools: 'read search'
argument-hint: '[artifact type, path, or full repo]'
user-invocable: true
@@ -8,7 +8,8 @@ disable-model-invocation: true
---
## Skill Context
-This skill is part of **vstack** — a VS Code-native AI engineering workflow system.
+This hand-authored skill maintains the **vstack source repository** only.
+It is not a distributable template and is not installed by `vstack install`.
### AskUserQuestion Format
@@ -35,6 +36,8 @@ Report only; do not regenerate, edit, or delete files.
Compare `src/vstack/_templates/` sources with installed artifacts in `.github/`
and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps.
+Repository-local skills, including this one, intentionally have no source template,
+generation footer, or install-manifest entry. Do not report them as drift.
Output exactly in this format:
@@ -77,6 +80,3 @@ Provide a checklist to confirm the repository is clean after regeneration.
- [ ] `make test-local` passes with 100% coverage
- [ ] `make markdown-format` reports no changes
- [ ] All regenerated files match their source checksums in `.vstack/vstack.json`
-
-
-
diff --git a/.github/skills/ask/SKILL.md b/.github/skills/ask/SKILL.md
index 0d1971dc..29885cd1 100644
--- a/.github/skills/ask/SKILL.md
+++ b/.github/skills/ask/SKILL.md
@@ -124,4 +124,4 @@ Use this format:
- If it requires risk/impact comparison, hand off to `analyse`.
-
+
diff --git a/.github/skills/aws-cli/SKILL.md b/.github/skills/aws-cli/SKILL.md
index 42bcf222..47f50f65 100644
--- a/.github/skills/aws-cli/SKILL.md
+++ b/.github/skills/aws-cli/SKILL.md
@@ -374,4 +374,4 @@ aws ce get-cost-and-usage \
- [AWS CLI named profiles](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)
-
+
diff --git a/.github/skills/changedoc/SKILL.md b/.github/skills/changedoc/SKILL.md
index 861ad169..36dba336 100644
--- a/.github/skills/changedoc/SKILL.md
+++ b/.github/skills/changedoc/SKILL.md
@@ -142,4 +142,4 @@ Escalate before implementation when:
- required stakeholders have not approved transition to `BUILD`
-
+
diff --git a/.github/skills/cicd/SKILL.md b/.github/skills/cicd/SKILL.md
index 5f64356a..f4323d9f 100644
--- a/.github/skills/cicd/SKILL.md
+++ b/.github/skills/cicd/SKILL.md
@@ -221,4 +221,4 @@ Configure these in GitHub → Settings → Branches.
- [GitHub-hosted runners](https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners)
-
+
diff --git a/.github/skills/cloudformation/SKILL.md b/.github/skills/cloudformation/SKILL.md
index 47efafa3..690a9d21 100644
--- a/.github/skills/cloudformation/SKILL.md
+++ b/.github/skills/cloudformation/SKILL.md
@@ -344,4 +344,4 @@ AppSecurityGroup:
- [AWS SAM documentation](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/)
-
+
diff --git a/.github/skills/code-review/SKILL.md b/.github/skills/code-review/SKILL.md
index e5235183..e85eddef 100644
--- a/.github/skills/code-review/SKILL.md
+++ b/.github/skills/code-review/SKILL.md
@@ -218,4 +218,4 @@ Confidence: [HIGH/MEDIUM/LOW — explain if not HIGH]
```
-
+
diff --git a/.github/skills/codeql/SKILL.md b/.github/skills/codeql/SKILL.md
index 883eb4d5..7274e07a 100644
--- a/.github/skills/codeql/SKILL.md
+++ b/.github/skills/codeql/SKILL.md
@@ -251,4 +251,4 @@ GITHUB_TOKEN= codeql github upload-results \
- [Supported languages and frameworks](https://docs.github.com/en/code-security/code-scanning/introduction-to-code-scanning/codeql-code-scanning-for-compiled-languages)
-
+
diff --git a/.github/skills/concise/SKILL.md b/.github/skills/concise/SKILL.md
index c7c3eb06..82242a53 100644
--- a/.github/skills/concise/SKILL.md
+++ b/.github/skills/concise/SKILL.md
@@ -147,4 +147,4 @@ Current mode unchanged:
- [ ] User confirmation/status returned in deterministic format
-
+
diff --git a/.github/skills/consult/SKILL.md b/.github/skills/consult/SKILL.md
index a00a8e09..7b869ce5 100644
--- a/.github/skills/consult/SKILL.md
+++ b/.github/skills/consult/SKILL.md
@@ -218,4 +218,4 @@ reason: [one sentence]
```
-
+
diff --git a/.github/skills/container/SKILL.md b/.github/skills/container/SKILL.md
index 84c2f035..43ca1791 100644
--- a/.github/skills/container/SKILL.md
+++ b/.github/skills/container/SKILL.md
@@ -153,4 +153,4 @@ For production-like local testing, write a separate `docker-compose.prod.yml` wi
- [Docker official images](https://hub.docker.com/search?image_filter=official)
-
+
diff --git a/.github/skills/conventional-commit/SKILL.md b/.github/skills/conventional-commit/SKILL.md
index 00fed9f6..89986ecc 100644
--- a/.github/skills/conventional-commit/SKILL.md
+++ b/.github/skills/conventional-commit/SKILL.md
@@ -155,4 +155,4 @@ Remaining changes:
If commit is blocked, report exact reason and proposed fix.
-
+
diff --git a/.github/skills/copilot-ops/SKILL.md b/.github/skills/copilot-ops/SKILL.md
index 1c5a881d..578dbac4 100644
--- a/.github/skills/copilot-ops/SKILL.md
+++ b/.github/skills/copilot-ops/SKILL.md
@@ -87,4 +87,4 @@ Provide this structure:
Escalate when permissions are insufficient, settings conflict across scopes, or policy intent is ambiguous.
-
+
diff --git a/.github/skills/debug/SKILL.md b/.github/skills/debug/SKILL.md
index b71e773d..2c0fd88f 100644
--- a/.github/skills/debug/SKILL.md
+++ b/.github/skills/debug/SKILL.md
@@ -258,4 +258,4 @@ Prevention: [any follow-up items]
```
-
+
diff --git a/.github/skills/dependabot/SKILL.md b/.github/skills/dependabot/SKILL.md
index f235f21a..61cce513 100644
--- a/.github/skills/dependabot/SKILL.md
+++ b/.github/skills/dependabot/SKILL.md
@@ -320,4 +320,4 @@ updates:
- [Dependabot security updates](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates)
-
+
diff --git a/.github/skills/dependency/SKILL.md b/.github/skills/dependency/SKILL.md
index 5ffc887c..032fa9d2 100644
--- a/.github/skills/dependency/SKILL.md
+++ b/.github/skills/dependency/SKILL.md
@@ -318,4 +318,4 @@ Action items (priority order):
- [PyPI / npm / crates.io / Maven Central](https://pypi.org) (replace with the relevant registry)
-
+
diff --git a/.github/skills/design/SKILL.md b/.github/skills/design/SKILL.md
index 6e172371..e5dae070 100644
--- a/.github/skills/design/SKILL.md
+++ b/.github/skills/design/SKILL.md
@@ -243,4 +243,4 @@ Output a complete design document to `docs/design/overview.md` or `openapi.yaml`
```
-
+
diff --git a/.github/skills/docs/SKILL.md b/.github/skills/docs/SKILL.md
index e04bd4bb..2adbfe9a 100644
--- a/.github/skills/docs/SKILL.md
+++ b/.github/skills/docs/SKILL.md
@@ -151,4 +151,4 @@ Skipped (n/a):
```
-
+
diff --git a/.github/skills/explore/SKILL.md b/.github/skills/explore/SKILL.md
index 05c65005..40072a0f 100644
--- a/.github/skills/explore/SKILL.md
+++ b/.github/skills/explore/SKILL.md
@@ -149,4 +149,4 @@ For `thorough` mode, append:
- main risk hotspots (coupling, missing tests, unclear ownership)
-
+
diff --git a/.github/skills/gdpr/SKILL.md b/.github/skills/gdpr/SKILL.md
index 55c306a8..6a688cd4 100644
--- a/.github/skills/gdpr/SKILL.md
+++ b/.github/skills/gdpr/SKILL.md
@@ -246,4 +246,4 @@ Use `@example.com` for all test email addresses.
- [EDPB guidelines](https://www.edpb.europa.eu/our-work-tools/general-guidance/guidelines-recommendations-best-practices_en)
-
+
diff --git a/.github/skills/gh-issues/SKILL.md b/.github/skills/gh-issues/SKILL.md
index e6006afe..9bc14e63 100644
--- a/.github/skills/gh-issues/SKILL.md
+++ b/.github/skills/gh-issues/SKILL.md
@@ -230,4 +230,4 @@ https://github.com///issues/
- [GitHub Issues documentation](https://docs.github.com/en/issues)
-
+
diff --git a/.github/skills/gh-release/SKILL.md b/.github/skills/gh-release/SKILL.md
index ec01fe60..e961fedd 100644
--- a/.github/skills/gh-release/SKILL.md
+++ b/.github/skills/gh-release/SKILL.md
@@ -214,4 +214,4 @@ If blocked, report exact blocker and required user action.
- [GitHub Releases documentation](https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases)
-
+
diff --git a/.github/skills/guardrails/SKILL.md b/.github/skills/guardrails/SKILL.md
index 9edbb88a..e22c3b75 100644
--- a/.github/skills/guardrails/SKILL.md
+++ b/.github/skills/guardrails/SKILL.md
@@ -72,4 +72,4 @@ Activate careful mode for this session. Two behaviors are now enabled.
Explicitly ask to "disable guardrails".
-
+
diff --git a/.github/skills/helm/SKILL.md b/.github/skills/helm/SKILL.md
index ddf6404c..c13fff72 100644
--- a/.github/skills/helm/SKILL.md
+++ b/.github/skills/helm/SKILL.md
@@ -140,4 +140,4 @@ Practices:
- [Chart best practices](https://helm.sh/docs/chart_best_practices/)
-
+
diff --git a/.github/skills/incident/SKILL.md b/.github/skills/incident/SKILL.md
index a31b35dd..f0b570d6 100644
--- a/.github/skills/incident/SKILL.md
+++ b/.github/skills/incident/SKILL.md
@@ -251,4 +251,4 @@ Next: invoke @#rca and @#postmortem to produce written artifacts.
```
-
+
diff --git a/.github/skills/inspect/SKILL.md b/.github/skills/inspect/SKILL.md
index b4aa2412..34fc9402 100644
--- a/.github/skills/inspect/SKILL.md
+++ b/.github/skills/inspect/SKILL.md
@@ -155,4 +155,4 @@ Confirm for changed paths:
```
-
+
diff --git a/.github/skills/k8s/SKILL.md b/.github/skills/k8s/SKILL.md
index eb87c042..b4fd7108 100644
--- a/.github/skills/k8s/SKILL.md
+++ b/.github/skills/k8s/SKILL.md
@@ -144,4 +144,4 @@ Common failure classes:
- [Kubernetes API reference](https://kubernetes.io/docs/reference/kubernetes-api/)
-
+
diff --git a/.github/skills/lazy/SKILL.md b/.github/skills/lazy/SKILL.md
index 192fe65e..69ab820b 100644
--- a/.github/skills/lazy/SKILL.md
+++ b/.github/skills/lazy/SKILL.md
@@ -160,4 +160,4 @@ Stop and escalate when:
- The task is under-specified and any minimal patch would be guesswork.
-
+
diff --git a/.github/skills/migrate/SKILL.md b/.github/skills/migrate/SKILL.md
index 6fa831c7..3dbad91d 100644
--- a/.github/skills/migrate/SKILL.md
+++ b/.github/skills/migrate/SKILL.md
@@ -320,4 +320,4 @@ Pre-deploy checklist:
```
-
+
diff --git a/.github/skills/migration-plan/SKILL.md b/.github/skills/migration-plan/SKILL.md
index 7f8762c3..4e638532 100644
--- a/.github/skills/migration-plan/SKILL.md
+++ b/.github/skills/migration-plan/SKILL.md
@@ -66,4 +66,4 @@ For each phase:
- success criteria
-
+
diff --git a/.github/skills/onboard/SKILL.md b/.github/skills/onboard/SKILL.md
index e50bb7d8..b46ddc99 100644
--- a/.github/skills/onboard/SKILL.md
+++ b/.github/skills/onboard/SKILL.md
@@ -302,4 +302,4 @@ Gaps remaining (if any):
```
-
+
diff --git a/.github/skills/openapi/SKILL.md b/.github/skills/openapi/SKILL.md
index c3d6e119..96cbb6f4 100644
--- a/.github/skills/openapi/SKILL.md
+++ b/.github/skills/openapi/SKILL.md
@@ -403,4 +403,4 @@ Summary: [N critical, N warnings, N info]
- [Redocly CLI (linting)](https://redocly.com/docs/cli/)
-
+
diff --git a/.github/skills/performance/SKILL.md b/.github/skills/performance/SKILL.md
index 3bb3d03d..72596379 100644
--- a/.github/skills/performance/SKILL.md
+++ b/.github/skills/performance/SKILL.md
@@ -242,4 +242,4 @@ For each bottleneck identified:
```
-
+
diff --git a/.github/skills/postmortem/SKILL.md b/.github/skills/postmortem/SKILL.md
index 15d38b50..461f4de9 100644
--- a/.github/skills/postmortem/SKILL.md
+++ b/.github/skills/postmortem/SKILL.md
@@ -184,4 +184,4 @@ Status: Draft — ready for team review
```
-
+
diff --git a/.github/skills/pr/SKILL.md b/.github/skills/pr/SKILL.md
index cb594b51..bc794a29 100644
--- a/.github/skills/pr/SKILL.md
+++ b/.github/skills/pr/SKILL.md
@@ -151,4 +151,4 @@ Next steps depend on the repository CI/CD configuration:
```
-
+
diff --git a/.github/skills/rancher/SKILL.md b/.github/skills/rancher/SKILL.md
index 7ecef1c5..baae344a 100644
--- a/.github/skills/rancher/SKILL.md
+++ b/.github/skills/rancher/SKILL.md
@@ -113,4 +113,4 @@ Checks:
- [Fleet documentation](https://fleet.rancher.io/)
-
+
diff --git a/.github/skills/rca/SKILL.md b/.github/skills/rca/SKILL.md
index 98f8ecd7..77e26108 100644
--- a/.github/skills/rca/SKILL.md
+++ b/.github/skills/rca/SKILL.md
@@ -207,4 +207,4 @@ Status: Draft — ready for review
```
-
+
diff --git a/.github/skills/reasoning/SKILL.md b/.github/skills/reasoning/SKILL.md
index 5e43075e..8bac8374 100644
--- a/.github/skills/reasoning/SKILL.md
+++ b/.github/skills/reasoning/SKILL.md
@@ -115,4 +115,4 @@ Always ask internally:
**Related:** See `skill/advise` for structured adversarial review workflows.
-
+
diff --git a/.github/skills/release-check/SKILL.md b/.github/skills/release-check/SKILL.md
index c96a6ab6..1716ccf1 100644
--- a/.github/skills/release-check/SKILL.md
+++ b/.github/skills/release-check/SKILL.md
@@ -69,4 +69,4 @@ Ordered actions to reach READY.
- verification step
-
+
diff --git a/.github/skills/release-notes/SKILL.md b/.github/skills/release-notes/SKILL.md
index 6853b2af..76e1aa9a 100644
--- a/.github/skills/release-notes/SKILL.md
+++ b/.github/skills/release-notes/SKILL.md
@@ -147,4 +147,4 @@ Prepend a new entry at the top of `CHANGELOG.md`:
Keep existing entries intact.
-
+
diff --git a/.github/skills/requirements/SKILL.md b/.github/skills/requirements/SKILL.md
index 777a8fa8..b807df24 100644
--- a/.github/skills/requirements/SKILL.md
+++ b/.github/skills/requirements/SKILL.md
@@ -199,4 +199,4 @@ Write all findings to `docs/product/requirements.md`:
After writing, summarize what was decided so the architect role can start.
-
+
diff --git a/.github/skills/secret-scan/SKILL.md b/.github/skills/secret-scan/SKILL.md
index 997e519b..ba811fea 100644
--- a/.github/skills/secret-scan/SKILL.md
+++ b/.github/skills/secret-scan/SKILL.md
@@ -240,4 +240,4 @@ credential formats.
- [Supported secret patterns](https://docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns)
-
+
diff --git a/.github/skills/security/SKILL.md b/.github/skills/security/SKILL.md
index a2d5c120..b460585f 100644
--- a/.github/skills/security/SKILL.md
+++ b/.github/skills/security/SKILL.md
@@ -295,4 +295,4 @@ Scope: [full/diff/dependency/config]
- [STRIDE threat modeling (Microsoft)](https://learn.microsoft.com/en-us/azure/security/develop/threat-modeling-tool-threats)
-
+
diff --git a/.github/skills/simplify/SKILL.md b/.github/skills/simplify/SKILL.md
index 7254d206..d95a34f9 100644
--- a/.github/skills/simplify/SKILL.md
+++ b/.github/skills/simplify/SKILL.md
@@ -155,4 +155,4 @@ Escalate instead of over-simplifying when:
- Required outcomes are underspecified.
-
+
diff --git a/.github/skills/space-setup/SKILL.md b/.github/skills/space-setup/SKILL.md
index 4105521b..acde29c8 100644
--- a/.github/skills/space-setup/SKILL.md
+++ b/.github/skills/space-setup/SKILL.md
@@ -87,4 +87,4 @@ Provide this structure:
Escalate when required docs are missing, stale, or inconsistent across product/architecture/design baselines.
-
+
diff --git a/.github/skills/terraform/SKILL.md b/.github/skills/terraform/SKILL.md
index 0d04b3cb..1a294ce6 100644
--- a/.github/skills/terraform/SKILL.md
+++ b/.github/skills/terraform/SKILL.md
@@ -335,4 +335,4 @@ Run `terraform plan` after every state operation to verify the outcome.
- [tfsec rules](https://aquasecurity.github.io/tfsec/latest/checks/aws/) · [checkov checks](https://www.checkov.io/5.Policy%20Index/terraform.html)
-
+
diff --git a/.github/skills/terragrunt/SKILL.md b/.github/skills/terragrunt/SKILL.md
index d38ee8f6..052994ec 100644
--- a/.github/skills/terragrunt/SKILL.md
+++ b/.github/skills/terragrunt/SKILL.md
@@ -307,4 +307,4 @@ Use `--terragrunt-non-interactive` in CI to prevent hanging on prompts.
- [Gruntwork module registry](https://www.gruntwork.io/)
-
+
diff --git a/.github/skills/threat-model/SKILL.md b/.github/skills/threat-model/SKILL.md
index 23405618..595d9437 100644
--- a/.github/skills/threat-model/SKILL.md
+++ b/.github/skills/threat-model/SKILL.md
@@ -245,4 +245,4 @@ For each high-priority threat include:
- Final report is written to `docs/architecture/threat-model.md`.
-
+
diff --git a/.github/skills/upgrade-plan/SKILL.md b/.github/skills/upgrade-plan/SKILL.md
index e1b6d200..d7b11a50 100644
--- a/.github/skills/upgrade-plan/SKILL.md
+++ b/.github/skills/upgrade-plan/SKILL.md
@@ -66,4 +66,4 @@ For each major step:
- pass criteria
-
+
diff --git a/.github/skills/verify/SKILL.md b/.github/skills/verify/SKILL.md
index 527f438b..88dc94b7 100644
--- a/.github/skills/verify/SKILL.md
+++ b/.github/skills/verify/SKILL.md
@@ -266,4 +266,4 @@ scope: [path/component/full]
```
-
+
diff --git a/.github/skills/vision/SKILL.md b/.github/skills/vision/SKILL.md
index 8f6b47de..2a3cdedc 100644
--- a/.github/skills/vision/SKILL.md
+++ b/.github/skills/vision/SKILL.md
@@ -206,4 +206,4 @@ For each finding: explain the tradeoff, give an opinionated recommendation, ask
Present as: "Overall assessment: [READY/NEEDS REVISION/SCOPE CHANGE] because [1-2 sentence reason]."
-
+
diff --git a/.github/skills/workflow-check/SKILL.md b/.github/skills/workflow-check/SKILL.md
index 8ba71c13..327c04f9 100644
--- a/.github/skills/workflow-check/SKILL.md
+++ b/.github/skills/workflow-check/SKILL.md
@@ -69,4 +69,4 @@ Provide an ordered short list of actions.
- expected result
-
+
diff --git a/.vstack/vstack.json b/.vstack/vstack.json
index 9de3953e..ce497c5a 100644
--- a/.vstack/vstack.json
+++ b/.vstack/vstack.json
@@ -1,302 +1,295 @@
{
"manifest_version": 2,
"hash_algorithm": "sha256",
- "vstack_version": "3.7.4",
- "installed_at": "2026-10-17T13:27:19.161778+00:00",
+ "vstack_version": "3.7.8",
+ "installed_at": "2026-10-17T13:54:40.625936+00:00",
"artifacts": {
"skills": [
{
"name": "adr",
"file": "skills/adr/SKILL.md",
"version": "20260421003",
- "checksum": "c219707f91680f94b72c628918beefc0ee4e4f053ef9baf9b358d87436a5b1a0",
+ "checksum": "72eda96c3453eac00ec5330fae911ee85002e95eff342063c470fd68505df8fb",
"checksum_algorithm": "sha256"
},
{
"name": "advise",
"file": "skills/advise/SKILL.md",
"version": "20261017001",
- "checksum": "9d729523408f01317f96db07e7629987df0b6ba162bc9986ff188b27912fed60",
+ "checksum": "2def57807e24d3bab21019c624dfb4e020ba8890d35fb4fc4f0e312fd52fc7cf",
"checksum_algorithm": "sha256"
},
{
"name": "analyse",
"file": "skills/analyse/SKILL.md",
"version": "20260421004",
- "checksum": "750cabc0fa079b038aa2b8ee1bcb64480701b07d763d2ffd3ac02ea8431ad77f",
+ "checksum": "8bcbeab92d87042b11984d43fdb2e5848b91d7eba2a5b32762f2bb7e38e54eee",
"checksum_algorithm": "sha256"
},
{
"name": "architecture",
"file": "skills/architecture/SKILL.md",
"version": "20260421005",
- "checksum": "ae2bd8daa791fdec2a93253af696f39f59fa308e3b18569d030bed041d915cbc",
- "checksum_algorithm": "sha256"
- },
- {
- "name": "artifact-integrity",
- "file": "skills/artifact-integrity/SKILL.md",
- "version": "20261017001",
- "checksum": "7207f7bf7fb65c00720a726d8da48f56fe8b083dbac11b7f8854dff74c1a6f76",
+ "checksum": "951f1263fa436776c03c600f03b90aa8c5e70f38725eebd208cfa59fd8332835",
"checksum_algorithm": "sha256"
},
{
"name": "ask",
"file": "skills/ask/SKILL.md",
"version": "20260618001",
- "checksum": "19dba0952871993ea8a4a6bb7b8009b097912540664632741fae72bed150d940",
+ "checksum": "d4afd5223334735dc5bf71691c04355d72d58cbf7a48e7357c7ad69204fbb859",
"checksum_algorithm": "sha256"
},
{
"name": "aws-cli",
"file": "skills/aws-cli/SKILL.md",
"version": "20260502033",
- "checksum": "cd2156945d2e57cec860858996d0a90c978d6e4ce72d4b9609dc7778f4e4054f",
+ "checksum": "b82ffa42102b2142d57e66b3c2957d9483d7d33e3e3dfa86ff4980f8f9884a6a",
"checksum_algorithm": "sha256"
},
{
"name": "changedoc",
"file": "skills/changedoc/SKILL.md",
"version": "20260625001",
- "checksum": "c66be47d3e80bfbf368fa1f1e5d3d1c91ecb96c751d86a2423ba76ca74e84c74",
+ "checksum": "e2d5c3f920be7e651d90f6e4092940fd9bcd7444d7814e606f95b10317e1435d",
"checksum_algorithm": "sha256"
},
{
"name": "cicd",
"file": "skills/cicd/SKILL.md",
"version": "20260421006",
- "checksum": "ca030b2e03d4c7f2da503532448218bf42423bfb7767c399a0e06a01e81936a5",
+ "checksum": "b4678e25b122d8cd296427b01ae34879ab6877c2122addd55c4cb5aadd90dcd6",
"checksum_algorithm": "sha256"
},
{
"name": "cloudformation",
"file": "skills/cloudformation/SKILL.md",
"version": "20260502032",
- "checksum": "6ecd6939048f5aa9dbfb521dfcb96338f597e46bf9d1c825409e78b31d78ccd9",
+ "checksum": "78d31157b5f4de679a017372a1fffe41f7a797762832ba5f95b572d0254c7679",
"checksum_algorithm": "sha256"
},
{
"name": "code-review",
"file": "skills/code-review/SKILL.md",
"version": "20260421007",
- "checksum": "ed250caf234745a4e9c75dcd9b7a89030c8fa2b6a1bf00bc449d9a3a58c27918",
+ "checksum": "13338dfae6a5bfd70cb6dd7d3fbe085fa128c0cd8fe16add745614ba160cafd9",
"checksum_algorithm": "sha256"
},
{
"name": "codeql",
"file": "skills/codeql/SKILL.md",
"version": "20260502026",
- "checksum": "66e17e61388e1d0084f25a4921556f00926bb49b220deda6270054b25f96b270",
+ "checksum": "3fff3656238acab6ac67d5af31c9486294efb22cfa02e6f02b845b3dcacda1be",
"checksum_algorithm": "sha256"
},
{
"name": "concise",
"file": "skills/concise/SKILL.md",
"version": "20260421008",
- "checksum": "eaddf3ccc588c7ae4d290132bd10efd5feef97ff282b6e9cc9df884db9097908",
+ "checksum": "b512650d9194412a18ed783f02756b0e1d6d9ea97dcebda75090bffe1109e798",
"checksum_algorithm": "sha256"
},
{
"name": "consult",
"file": "skills/consult/SKILL.md",
"version": "20260421009",
- "checksum": "d5c6c8c23e453d5d8e970c7bab66faf5968379e877b79b0e2e42079f0360e35c",
+ "checksum": "2d19fc019765961b80c32ffdb5dad11f83e394255a7d4954786cecca7767bb0a",
"checksum_algorithm": "sha256"
},
{
"name": "container",
"file": "skills/container/SKILL.md",
"version": "20260421010",
- "checksum": "2f30e154f489ad24a3768521782a3086b71f70b4accbcd1e39fcb186c2201a7b",
+ "checksum": "b4b48e05480bc26519d997ccef254158db48ef209d1b3267da8983162ecc77df",
"checksum_algorithm": "sha256"
},
{
"name": "conventional-commit",
"file": "skills/conventional-commit/SKILL.md",
"version": "20260502024",
- "checksum": "cf665af63b96120991ded48a15fc42d766d767adb7440adeb2a2c69ab1595943",
+ "checksum": "2d92c9c1efb79a7cd15d37cd5d244307693056c78373af94fb8480e10067827b",
"checksum_algorithm": "sha256"
},
{
"name": "copilot-ops",
"file": "skills/copilot-ops/SKILL.md",
"version": "20260513012",
- "checksum": "08c4adc458443a97e5b203088dd20c17d17cab876c6843ee1690c278c4d0ae13",
+ "checksum": "29fa2f9968fe62ed9fb0cd3f104e9f5ab59f648e8b501bdada8ffbd58f878a8d",
"checksum_algorithm": "sha256"
},
{
"name": "debug",
"file": "skills/debug/SKILL.md",
"version": "20260421011",
- "checksum": "2df8852573c45dc0a6c236fd6cd272ff906bc4e09668ac799b44febb594299c3",
+ "checksum": "8be2e80664a06f288703cb4585210482d3151fff7190e6b7a5f9e5cf524acb62",
"checksum_algorithm": "sha256"
},
{
"name": "dependabot",
"file": "skills/dependabot/SKILL.md",
"version": "20260502027",
- "checksum": "62b54ce068b54f478a8b51b0c2639c230d1811b74423f83a98cdcb87b8ef88df",
+ "checksum": "ed8d4e5851a3c3c1a24d8765f1e38a7467e6970508fb878335a3e0d7bb24aa0b",
"checksum_algorithm": "sha256"
},
{
"name": "dependency",
"file": "skills/dependency/SKILL.md",
"version": "20260421012",
- "checksum": "ea46b279415f9faa5de370b9cb6a89e0af109ffe14c999a7d151a51d10fab98d",
+ "checksum": "d8419ccccf92f27fa2f557b2d5aaad1dcf2dd8f07b9b2ae60f323a56adf657cd",
"checksum_algorithm": "sha256"
},
{
"name": "design",
"file": "skills/design/SKILL.md",
"version": "20260421013",
- "checksum": "bf07db5f1aabcfaafdb37c54395ee78839688c40aa6918fa126a247943aadb5d",
+ "checksum": "79db85fea4d04eebe34f7f09664bfc79ecd483bb4040ff0466b2d8252b042aca",
"checksum_algorithm": "sha256"
},
{
"name": "docs",
"file": "skills/docs/SKILL.md",
"version": "20260421014",
- "checksum": "9872dc3ec451609b94481ec9ca4f53fbfceccd9ac94563fd5156ea62d7a54474",
+ "checksum": "3c00ecce65a66f041ad0c10894349a8c8428a59aa31c21795e6895dab2bd2ef1",
"checksum_algorithm": "sha256"
},
{
"name": "explore",
"file": "skills/explore/SKILL.md",
"version": "20260611001",
- "checksum": "68c22251cd3df81f89b07bffaa1395da243a4dfb2c841dddc5c8429882e64453",
+ "checksum": "03d1fb8539e2372c33046c56c90af82b13b43615e71dc9c2d9916c33a7755118",
"checksum_algorithm": "sha256"
},
{
"name": "gdpr",
"file": "skills/gdpr/SKILL.md",
"version": "20260502029",
- "checksum": "ee8dfc6b03ca06899c2bb8cf4b1e3142eafe99cb4d43e77e3832ba4513dd94b2",
+ "checksum": "fdbafa43a37eb6fe9657c08f6a63e97c482763124aec5a5a92a9277300dad767",
"checksum_algorithm": "sha256"
},
{
"name": "gh-issues",
"file": "skills/gh-issues/SKILL.md",
"version": "20260502025",
- "checksum": "f3502e61dbe6e4ee589fb2580e93e35641d1416538974052e603648ec3baf8e1",
+ "checksum": "0766599fb6133caa0628615883ed3f95e41b498c01e7957fd4a44d021651830d",
"checksum_algorithm": "sha256"
},
{
"name": "gh-release",
"file": "skills/gh-release/SKILL.md",
"version": "20260502023",
- "checksum": "cebc3cd7a5ae92875c6f54772eb2a95bfa20c4fb94bbcee9c565ce25a5cb2b16",
+ "checksum": "7382cd0752d617847fb70bdcc77c13a2c23aff609c4e0431e9890aa488c74220",
"checksum_algorithm": "sha256"
},
{
"name": "guardrails",
"file": "skills/guardrails/SKILL.md",
"version": "20260421016",
- "checksum": "6ef63153ba7945841cde8f4700867a5f193fdc1d659ca712eb7ff51f5956e93e",
+ "checksum": "13ff3280958b14b2c0160b33e08b5bd37a474fd5556f211b22e67d2c3cfd6d31",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "skills/helm/SKILL.md",
"version": "20260502037",
- "checksum": "0da07ec13ab699517a5dfef757b483d654083c78956d8071177e9967352a144e",
+ "checksum": "a2abc7e1d1614d55990be395ddf299fc4a0b08d6e51f16495751a244d59912c9",
"checksum_algorithm": "sha256"
},
{
"name": "incident",
"file": "skills/incident/SKILL.md",
"version": "20260503002",
- "checksum": "c7a68e588ae25e60b24218de80c0f0f603ada8dc68a1524296e54345cf86cd77",
+ "checksum": "581de57435857e3b81b740ed43030db99fa6c5604c6880672fa916e01bc1f85f",
"checksum_algorithm": "sha256"
},
{
"name": "inspect",
"file": "skills/inspect/SKILL.md",
"version": "20260421018",
- "checksum": "6fe8f3842251066cea682d088492366aa05cff256930c4f6a06245f81ca1aabf",
+ "checksum": "0d26174e8afadea8b26e5ebf83cf1115d1ab96600c9d03d49ece71d07ada5aa3",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "skills/k8s/SKILL.md",
"version": "20260502036",
- "checksum": "3dbf7ee9f661ae2a6396917363b97ed431fdc21faa7320b74a8e96afc28976bb",
+ "checksum": "536efea082ff4c26dfdf6e22af7504da852447813deb61d1cb99f2b5b0651061",
"checksum_algorithm": "sha256"
},
{
"name": "lazy",
"file": "skills/lazy/SKILL.md",
"version": "20260625001",
- "checksum": "094e3384a72e0b7ca1cc7b574eeba2d5b8a7846476effe52f0af2a48e7e068ce",
+ "checksum": "6e455e539e8534194d9e017ce4bbccc77fb5fa1fd65e41d24b7c40958c1a49a0",
"checksum_algorithm": "sha256"
},
{
"name": "migrate",
"file": "skills/migrate/SKILL.md",
"version": "20260421019",
- "checksum": "68b326b585ffcd62e69dd9d6bf00b7d66dbfdf06035ccee472b87ef212e6898c",
+ "checksum": "f3794467cce63919af9d6595aa17e4c0a9d7246e52373364cc321c109fbf6562",
"checksum_algorithm": "sha256"
},
{
"name": "migration-plan",
"file": "skills/migration-plan/SKILL.md",
"version": "20261017001",
- "checksum": "d84efc52811ab822bc168248e0b227e052f78448c8eeed35cd1587abc6c57df1",
+ "checksum": "36b4591572c18a07f5c6048d180bebca95202c4809c518129a2d509984de3dc1",
"checksum_algorithm": "sha256"
},
{
"name": "onboard",
"file": "skills/onboard/SKILL.md",
"version": "20260421020",
- "checksum": "66498d30b8ed0c77f648c409764ba5b722c3113536b4e51bf14682b9478baa8e",
+ "checksum": "680e5f0031ab810e476f2345a88e92d29896ab5cf0ec85ef69a08b827728faf7",
"checksum_algorithm": "sha256"
},
{
"name": "openapi",
"file": "skills/openapi/SKILL.md",
"version": "20260421021",
- "checksum": "2df37a86e76ce9653aec8242a18da7cdcbdacf472caef15e9fe88a3bcafcd5e9",
+ "checksum": "77a00cc691d80d005206d6386b2b660c310a7cffa427eb8dc6e6390d0984d9f2",
"checksum_algorithm": "sha256"
},
{
"name": "performance",
"file": "skills/performance/SKILL.md",
"version": "20260421022",
- "checksum": "e194acff5d8f662dd14382baa76e3cfc565b19c8999d9cc7496bb5e4b862bb70",
+ "checksum": "e25e3983ce8be1b2218edfab23cae831eea75a675a715bd781123ce0e21005ee",
"checksum_algorithm": "sha256"
},
{
"name": "postmortem",
"file": "skills/postmortem/SKILL.md",
"version": "20260503001",
- "checksum": "0a05235f5c9a690d9e17590cb7c9fa1e37ac0e5e24088f07b6ad5f401699d0e3",
+ "checksum": "5ffcfb1109f517545b4eb8eb994e64b18beaa49e88639ceacf754488067ecb6e",
"checksum_algorithm": "sha256"
},
{
"name": "pr",
"file": "skills/pr/SKILL.md",
"version": "20260502013",
- "checksum": "f8557f0ede29d0361c3c05410e126976acfd532d238545e02b6cebd503537a5c",
+ "checksum": "c78d09eb0f127b68b5e82ef4b678ed5e95edcacfb39b5ddb9a536beb2a5b9dd4",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "skills/rancher/SKILL.md",
"version": "20260502038",
- "checksum": "e2e63f14c59617702f051332f3d8bf69c812a7ae7c7b1d4852e70328cb517cfc",
+ "checksum": "08822bed0bab149168ff63ea3b58363ecec2e88e8b05dcf603e8906945457cb4",
"checksum_algorithm": "sha256"
},
{
"name": "rca",
"file": "skills/rca/SKILL.md",
"version": "20260503001",
- "checksum": "1a231a53a656afb6339a2887a3b95b9799d8d83f94fbbd9299cf41467b503fde",
+ "checksum": "e2922ee44a376117779a6e3d09a1f6c75bd7eff0e8ce34353c319856836cdf55",
"checksum_algorithm": "sha256"
},
{
"name": "reasoning",
"file": "skills/reasoning/SKILL.md",
"version": "20261017001",
- "checksum": "85a1bbc39d49121f3b8a05b3980bb77677b880c8f4ed4890729abd21e3dedf1f",
+ "checksum": "211eba9546932db6636f5158336ed25b9d327117d1a8f0b0f7cd2ef9d070e922",
"checksum_algorithm": "sha256"
},
{
@@ -310,98 +303,98 @@
"name": "release-check",
"file": "skills/release-check/SKILL.md",
"version": "20261017001",
- "checksum": "7ee64d4ea0a2c3c3d2fdce9606b24ad7b164503a53a4aa547d85647f1007171b",
+ "checksum": "fccdb0eee1f9949737a086306e6881b44040406151c9f001cbd60e2275714753",
"checksum_algorithm": "sha256"
},
{
"name": "release-notes",
"file": "skills/release-notes/SKILL.md",
"version": "20260502014",
- "checksum": "a2a0a4c6bc94c1f1da996421c69d34f6de1590749de6c12217cecd605ad94126",
+ "checksum": "fb499779b035a4cb205f2ee8b2d68cb171b6dbd0a77190352faefa1a5b80b5c1",
"checksum_algorithm": "sha256"
},
{
"name": "requirements",
"file": "skills/requirements/SKILL.md",
"version": "20260421024",
- "checksum": "4c4e7196fcb34bfcbab3bb99023acb887c1641d196b12f7e8725e7bdbd525c55",
+ "checksum": "ccc0512888c77f1982420d75f25058d703229c2c8ec20cef6859c1c473b83ac5",
"checksum_algorithm": "sha256"
},
{
"name": "secret-scan",
"file": "skills/secret-scan/SKILL.md",
"version": "20260502028",
- "checksum": "e1f4dd9fe060b9c7d28763c316a9d64bca7647f5bc4fa4a65c18327a7391ccc1",
+ "checksum": "b3c6e70d8b7069b36e38668afb48d55cce542d938bd3b25bced6e9db356c906c",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "skills/security/SKILL.md",
"version": "20260421025",
- "checksum": "7e98a5f86ed6d6adf78db584f2f3a958d2a7e6eaa742ea81f4c5373f2d12f65b",
+ "checksum": "f6f154b990cea5d39d189409801c4478d5351cb5d445f246c07120cbadd24425",
"checksum_algorithm": "sha256"
},
{
"name": "simplify",
"file": "skills/simplify/SKILL.md",
"version": "20260625001",
- "checksum": "0808af6fff589768782cdaf1363ce21d72351777e19f632ec4212c2c1a87142e",
+ "checksum": "6c60f49f9561fe30e699cbfcdab19259c1aa4b34cd917d7bf1ac531adb32ac74",
"checksum_algorithm": "sha256"
},
{
"name": "space-setup",
"file": "skills/space-setup/SKILL.md",
"version": "20260513011",
- "checksum": "753d7e3ad5ac773c21e23d9018719078effb853307bef5870fb4276bd9a53f34",
+ "checksum": "67a5c30d448b7d1a1fd550cc69dc8c7b050af2d836ce1bb67d1d0c84d78ad769",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "skills/terraform/SKILL.md",
"version": "20260502030",
- "checksum": "d88a37c6f6b7ce807f0157c1fc8f1e1b21c281379952d58bc72c3ba6853e7e59",
+ "checksum": "58d82a79f299a6ab227ff36dd0a1cc39c71e51259f1eda78d1adf4917a216946",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "skills/terragrunt/SKILL.md",
"version": "20260502031",
- "checksum": "1fd15a27c8a3a376b9952058c65146256ab20bcce4d1774f93cc4524d087c65f",
+ "checksum": "89910e245a0712b613be361f682b262c1492ef45fb8e6800d159613779a5b987",
"checksum_algorithm": "sha256"
},
{
"name": "threat-model",
"file": "skills/threat-model/SKILL.md",
"version": "20260502021",
- "checksum": "3d1781223e4b2c3be8ff6ad509726d0f2b3b11a7b13ae809fed2449321d63e23",
+ "checksum": "68d2f41fdc7217c0df316f8417fa3f386e0f17562caa09ecd10405f925abd82f",
"checksum_algorithm": "sha256"
},
{
"name": "upgrade-plan",
"file": "skills/upgrade-plan/SKILL.md",
"version": "20261017001",
- "checksum": "cf94923afb5ab2a3a2fc0b798809563260efa277f84ec91a0e0e1e0e3c5b349e",
+ "checksum": "e78c6489648b9574d87f5fb807ce2706f9e03a6f57a890f0ce1a9388a8354edb",
"checksum_algorithm": "sha256"
},
{
"name": "verify",
"file": "skills/verify/SKILL.md",
"version": "20260421026",
- "checksum": "2eb0c9736f53ecfd05151a57675075d8afd65f1188f89aaf3a6b1274a338cfc3",
+ "checksum": "ee676a885b9aa2764078458161160a2e0367174f91c10fcb25aacf659bc8f2f0",
"checksum_algorithm": "sha256"
},
{
"name": "vision",
"file": "skills/vision/SKILL.md",
"version": "20260421027",
- "checksum": "d03fc9b5cc5f41b4028516d9d60b5c7b523f3a8f0f679dd3cbe88e86bff13afc",
+ "checksum": "0b6a83f54c77620f30e2b114869ca4b4964f500cc47af4ed4a468733847fa0a8",
"checksum_algorithm": "sha256"
},
{
"name": "workflow-check",
"file": "skills/workflow-check/SKILL.md",
"version": "20261017001",
- "checksum": "5256914e95af280348654e9e7bbcb9fa1201e849fb08b5191725c7fc0a804317",
+ "checksum": "ba480e7ed2a158bff03e5dbde1f2c25ce26ed8c769bd5e043b0c6994208b5e7c",
"checksum_algorithm": "sha256"
}
],
@@ -410,49 +403,49 @@
"name": "architect",
"file": "agents/architect.agent.md",
"version": "20260514001",
- "checksum": "c0ba7aab6baec8cbcbac379f006cb989c314df6af841aed7e0d5804c360e1fbc",
+ "checksum": "32e78f403e974932d315c8efa4dbfe863e1c4d7e0a546769e63f7cee199f87a1",
"checksum_algorithm": "sha256"
},
{
"name": "designer",
"file": "agents/designer.agent.md",
"version": "20260514001",
- "checksum": "51ed1da4df89d94007a5935f063cd8e119ad2c9a2ca04cd70d752861ec360aaf",
+ "checksum": "b2e3dd6aa205ff11e44dcda1f06b80e01b2b44c1011b0a1cbee8962e79cb4c2b",
"checksum_algorithm": "sha256"
},
{
"name": "engineer",
"file": "agents/engineer.agent.md",
"version": "20260514001",
- "checksum": "472ce9d75457fb9ff93ebb7063b0bc811f5b6d360a4f5ca42006fc56e0efebd1",
+ "checksum": "8239b7e880aa26414aa9e0b3524818e0aad8bb892b7ca0af9af6d1a0f253e5a8",
"checksum_algorithm": "sha256"
},
{
"name": "planner",
"file": "agents/planner.agent.md",
"version": "20260514001",
- "checksum": "09a0243e9c59ee187427c22bdb348fc6c78d68e2320d9f11f790c6ea65a07b65",
+ "checksum": "e648dcc71fea5989c275af5f4bf204a76615e3bd8195d2ab00e81aaa7a741d4c",
"checksum_algorithm": "sha256"
},
{
"name": "product",
"file": "agents/product.agent.md",
"version": "20260514001",
- "checksum": "19ce0a24eefefc83260f049104eb259dd3ae1ee3c7478a28d868a46a395571fa",
+ "checksum": "55b55479eef30115bb00f48a3a1869992f22ba33d1782a096cda059394692bf2",
"checksum_algorithm": "sha256"
},
{
"name": "release",
"file": "agents/release.agent.md",
"version": "20260514001",
- "checksum": "3539f1de734c47d3801a007181c1a6af6227d82d7e9841cfab2da5fd7d3f5da3",
+ "checksum": "a8879577a8fa1f664c9731104775ea463d5a38c7d76c036c1d766a7a11202b7b",
"checksum_algorithm": "sha256"
},
{
"name": "tester",
"file": "agents/tester.agent.md",
"version": "20260514001",
- "checksum": "73c1255d2bf3c0034330e7e4bc0de292a69b176aac020a2d69ae2d765f1e5d5d",
+ "checksum": "2e3dc966d3e78e11a381c01bc331e56107164818cf0aceea3528d3cacce59bb9",
"checksum_algorithm": "sha256"
}
],
@@ -460,49 +453,49 @@
{
"name": "agent-call-audit",
"file": "hooks/agent-call-audit.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "a03cc5df031670dd4902599048a9fc955a852862b2cb73408f5889ee74baa636",
"checksum_algorithm": "sha256"
},
{
"name": "log-retention-cleanup",
"file": "hooks/log-retention-cleanup.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "2c3048637dc0f85b7196934b0f6c5a2ee9a21739b45bc7a529e2f5531f2b2609",
"checksum_algorithm": "sha256"
},
{
"name": "post-commit-security-scan",
"file": "hooks/post-commit-security-scan.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "154305889deb5676a6b7d686400b14b4237687be130438d19843341addbdff8e",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-format",
"file": "hooks/post-edit-format.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "5911a2fc0211b268749e5200db8d43eec953f456294c8cbc5556cea9ab11f875",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-markdown-quality",
"file": "hooks/post-edit-markdown-quality.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "b8ef6b1805492a580902675ccd16564c693ec2ccf30fdb81d6b1d8dce610ab22",
"checksum_algorithm": "sha256"
},
{
"name": "pre-tool-safety-gate",
"file": "hooks/pre-tool-safety-gate.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "1d55d6c9cee6137472e37c9e16febb5a96419fc0813c4c474af5a50ee03ee5a0",
"checksum_algorithm": "sha256"
},
{
"name": "session-audit",
"file": "hooks/session-audit.json",
- "version": "3.7.4",
+ "version": "3.7.8",
"checksum": "0190aa65dfea26b2129ad8a5304377b2d40febf03779f561194e788bb8b27bfa",
"checksum_algorithm": "sha256"
}
@@ -512,84 +505,84 @@
"name": "git",
"file": "instructions/git.instructions.md",
"version": "20260421001",
- "checksum": "357ed856de5e8b9d032453ef2dbc8b2225d02ff2b8b4a0fd912da015253afb10",
+ "checksum": "b41e3da9ce908e6143053832353829be0d0c3a0dae99140fedb7ed83d7189f84",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "instructions/helm.instructions.md",
"version": "20260502040",
- "checksum": "1e42da7a5f74b4dd8f1caa8e7a5edbc77b132d6acf98bc76d124abb13c758025",
+ "checksum": "dd90cca8401be666a8ca7703a6fd0917df546ec9904f142b56e14e851b51a5ac",
"checksum_algorithm": "sha256"
},
{
"name": "java",
"file": "instructions/java.instructions.md",
"version": "20260502001",
- "checksum": "9d35507d6c3a5de3c80529c800f3f47da4f671ef7bbb9d3edbe127602da3af7b",
+ "checksum": "5556bbc815d2406472fb168e143b1df2eabe2d7935e24ac466c1e9802d80ae64",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "instructions/k8s.instructions.md",
"version": "20260502039",
- "checksum": "5d773a2ca7bbcb681bb0f6104a456fc727267f794fd4018e1e9a0cfae08460d8",
+ "checksum": "25f892ec4c459aa9d7c924197d3bd3f094c7f987d586f6b46b54f243329d5d73",
"checksum_algorithm": "sha256"
},
{
"name": "markdown",
"file": "instructions/markdown.instructions.md",
"version": "20260502002",
- "checksum": "fdc14cd47c22b8884706369a300df78c2a5ae55de37ac38fe72b8f0ccc080627",
+ "checksum": "d03f1da80b1a0913231972bbe9dc37833194f96f5dfebefe888e724191734080",
"checksum_algorithm": "sha256"
},
{
"name": "python",
"file": "instructions/python.instructions.md",
"version": "20260421002",
- "checksum": "833808837e48accd049debf3b8a5043f9d5a3c03841123d01e9dd26d9674fdfd",
+ "checksum": "c31f929e489c28c4be92cab4483b13eeb575baf6e4d3995b1c806f81d69800c3",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "instructions/rancher.instructions.md",
"version": "20260502041",
- "checksum": "5dea653927b3d951fb7fa9e8b5944a33330b40800277f36d4f8fc5263cfd0ae2",
+ "checksum": "796d1c16f97b4bbe890293b254949935e1af97eb58ec52c9504d1f5323459628",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "instructions/security.instructions.md",
"version": "20260502003",
- "checksum": "dd2f30b1a9bf9e54223d894ef0a36c924b08510c8f13d601b0c9de8fa5a00ace",
+ "checksum": "001d506762be4e2323cb7c672cd29fdc00cf94a6ef68e08e049cb61690f3e76a",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "instructions/terraform.instructions.md",
"version": "20260502034",
- "checksum": "784bf231d33b2792b365be00af112e7da5370640afce7a655c2381996133d1ab",
+ "checksum": "ecf3257ebae88d937253e25b6a8b2a121ab53d62bf7f70ecbd76d784d01731e0",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "instructions/terragrunt.instructions.md",
"version": "20260502035",
- "checksum": "5db2f90b5fd873cedbc11887ec5745492e78ee300257db17f2e1d719a358e43c",
+ "checksum": "6660677347ba0cb52e858f81f3dcb1177b42dfba02148cddb865dc08a2adb4df",
"checksum_algorithm": "sha256"
},
{
"name": "testing",
"file": "instructions/testing.instructions.md",
"version": "20260502004",
- "checksum": "2e84526ac2c6d2a4309139d6b36463370df2e911e061de4fc536d6ab0a20e74a",
+ "checksum": "417c388a626a7c6dbd9072f5ab8f6ff47e7d2cabe8218cae61aefae415668aed",
"checksum_algorithm": "sha256"
},
{
"name": "typescript",
"file": "instructions/typescript.instructions.md",
"version": "20260502005",
- "checksum": "9399cfdaf8a806cf8c49e3f5d466cc31e8ec947bac923297bbc63578b8059a35",
+ "checksum": "a320659b42fdda47e5548a36b451d907c7c13daf93e4267721cf97a566e51101",
"checksum_algorithm": "sha256"
}
]
diff --git a/docs/architecture/adr/032-skills-replace-prompts.md b/docs/architecture/adr/032-skills-replace-prompts.md
index 0d622d4d..affa8582 100644
--- a/docs/architecture/adr/032-skills-replace-prompts.md
+++ b/docs/architecture/adr/032-skills-replace-prompts.md
@@ -16,6 +16,11 @@ Remove the prompt artifact family in the next major release. Reuse existing
skills where workflows overlap and convert unique prompts to skills with
`disable-model-invocation: true`.
+Distribute only workflows useful to consumer projects. Keep the source-specific
+`artifact-integrity` audit as a hand-authored repository-only skill under
+`.github/skills/`, without a package template, generation footer, or manifest
+ownership. Its old prompt maps to the distributed `inspect` skill.
+
Keep legacy manifest data readable solely for migration. `install` and `init`
automatically retire known prompts when skills are selected, replacement skills
are successfully available, and the old files match their stored checksums.
@@ -29,6 +34,9 @@ Preserve and report unmanaged, modified, unknown, or unsafe files.
discovery and maintenance. Rejected.
- Retire prompts with safe migration: one workflow surface with an explicit
breaking-change boundary. Selected.
+- Distribute repository maintenance skills or add a local-template generator:
+ unnecessary consumer coupling and configuration. Rejected in favor of native,
+ hand-authored repository skills.
## Rationale
@@ -47,6 +55,7 @@ model, or tool selection.
For the Option B pipeline, role boundaries and handoff prompt strings remain
unchanged. Stages invoke skills rather than prompt artifacts.
+Repository-only maintenance skills are not dependencies of consumer pipeline stages.
## Related ADRs
diff --git a/docs/architecture/overview.md b/docs/architecture/overview.md
index e3f940c0..9773b96f 100644
--- a/docs/architecture/overview.md
+++ b/docs/architecture/overview.md
@@ -52,7 +52,7 @@ vstack/
│ │ └── session/ ← planner-run cache files (gitignored)
│ ├── vstack.json ← machine-generated manifest (JSON)
│ └── templates/ ← project-owned artifact starter templates (seeded by vstack install)
-├── .github/ ← generated Copilot artifacts (never edit directly)
+├── .github/ ← generated artifacts plus hand-authored repository skills
│ ├── skills//SKILL.md
│ ├── agents/.agent.md
│ ├── hooks/.json
@@ -60,6 +60,11 @@ vstack/
└── README.md
```
+Distributed skills are template-backed and manifest-managed. Repository-only
+skills, such as `.github/skills/artifact-integrity/SKILL.md`, are hand-authored
+in this repository, have no templates or manifest entries, and are not packaged
+or installed for consumers. Generated files remain template-owned.
+
______________________________________________________________________
## components
diff --git a/docs/design/overview.md b/docs/design/overview.md
index d7c49c24..4920a1d7 100644
--- a/docs/design/overview.md
+++ b/docs/design/overview.md
@@ -406,6 +406,13 @@ Converted skills are explicitly invoked (`disable-model-invocation: true`).
Overlapping workflows use existing skills without command aliases. See
[Prompt migration](../user/reference/prompt-migration.md) for the complete mapping.
+Repository-only skills live directly in `.github/skills/`, not in the package's
+template root or canonical skill catalog. They have no generation metadata or
+manifest entry. Existing template discovery and manifest-scoped verification
+therefore ignore them without a new generator mode. The vstack source audit
+`artifact-integrity` is local; its retired prompt maps to distributed `inspect`.
+Previously managed copies use the existing conservative obsolete/prune policy.
+
______________________________________________________________________
## 4. placeholder resolver
diff --git a/docs/design/skills.md b/docs/design/skills.md
index 5b043349..1aafd7b2 100644
--- a/docs/design/skills.md
+++ b/docs/design/skills.md
@@ -25,6 +25,16 @@ Unlike custom instructions that primarily define coding preferences and guardrai
skills package specialized, reusable workflows with optional scripts, examples,
and references.
+### distributed and repository-only skills
+
+Distributed skills have sources under `src/vstack/_templates/skills/` and are
+installed into consumer repositories. Repository-only maintenance skills are
+hand-authored directly in `.github/skills/`, outside the package and install
+manifest. They have no generation footer and are not regenerated.
+
+`artifact-integrity` is repository-only: it audits vstack's own template sources
+and generated output. It is not part of the distributed skill catalog below.
+
Boundary rule:
- Policies belong in instructions.
@@ -52,7 +62,6 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `adr` | Architecture Decision Record writing. Documents a decision with context, alternatives, and rationale. | architect | `docs/architecture/adr/NNN-*.md` |
| `analyse` | Cross-cutting technical analysis. Investigates impact, tradeoffs, root causes, or feasibility without implementing changes. | engineer, architect | analysis report |
| `architecture` | Engineering-lead plan review. Lock in service boundaries, data models, API contracts, test strategy. | architect | `docs/architecture/overview.md` |
-| `artifact-integrity` | Explicit-only vstack source-to-generated-artifact audit. | engineer, tester | drift report |
| `ask` | Read-only technical Q&A. Clarifies ambiguous questions, gathers repository evidence, and returns concise answers with references and confidence. | all roles | referenced answer + next-step guidance |
| `aws-cli` | AWS CLI workflows for IAM, S3, EC2, RDS, ECS, Lambda, CloudWatch, Secrets Manager, and SSM Parameter Store. | engineer, tester | — |
| `cicd` | Write GitHub Actions CI/CD workflow configuration. Covers build, test, lint, security scan, container publish, deploy. | release | GitHub Actions workflow |
diff --git a/docs/design/workflow.md b/docs/design/workflow.md
index 46c75034..3a08f8b7 100644
--- a/docs/design/workflow.md
+++ b/docs/design/workflow.md
@@ -18,11 +18,14 @@ For authoring boundaries between reusable guidance mechanisms:
- [013-instructions-vs-skills-boundary.md](../architecture/adr/013-instructions-vs-skills-boundary.md)
- [028-dag-dependency-semantics.md](../architecture/adr/028-dag-dependency-semantics.md)
-Reusable workflows use skills, not prompt files. The six converted planning and
+Reusable workflows use skills, not prompt files. The five distributed converted planning and
audit skills remain explicitly invoked; overlapping former prompts route users
to existing skills. Role selection, handoff prompt strings, and the Option B
pipeline are unchanged. See [Prompt migration](../user/reference/prompt-migration.md).
+The source-specific `artifact-integrity` audit is a hand-authored repository-only
+skill, not an installed workflow. Consumers use `inspect` for repository audits.
+
______________________________________________________________________
## workflow modes
diff --git a/docs/product/roadmap.md b/docs/product/roadmap.md
index 62c54b29..068b0c0c 100644
--- a/docs/product/roadmap.md
+++ b/docs/product/roadmap.md
@@ -35,7 +35,7 @@ ______________________________________________________________________
| defect-fixture matrix expansion | v3.3.0 | shipped | Expand defect fixtures across artifact types and failure classes with stable expected error assertions. |
| planner routing refinement | v3.4.0 | shipped | Planner/orchestrator routing follow-up to the DAG work |
| Homebrew distribution | v3.5.0 | shipped | Homebrew tap/formula publish flow added for install and upgrade via `brew` |
-| skills replace prompt artifacts | next major | implemented | Retire the prompt family, reuse 11 existing workflows, convert six unique skills, and safely clean tracked prompts during install/init (ADR-032). |
+| skills replace prompt artifacts | next major | implemented | Retire prompts, reuse 12 existing workflows, distribute five converted skills, keep the source audit repository-only, and safely clean tracked prompts (ADR-032). |
| configurable skill output paths | t.b.d. | candidate | Replace hardcoded skill artifact/output paths (for example changedoc location conventions) with project-configurable path settings while preserving safe defaults. |
| docs information architecture (Diataxis) | t.b.d. | candidate | `docs/user/` scaffold and navigation are in place with segmented tutorials/how-to/reference/explanation routes; broader migration and fully realized IA come later |
| team customization layer | t.b.d. | candidate | Deferred major update after VS Code-first model proves itself; custompacks, overlay merge rules, and install profiles all add major maintenance surface |
@@ -557,8 +557,9 @@ guidance on which checks apply after each class of change.
- Add a change-trigger validation matrix to `CONTRIBUTING.md` that maps change types to required
checks (e.g. template change → `python3 -m vstack install` + `make test-local`).
-- Use `inspect` for repository assessment and `artifact-integrity` for explicit
- source-to-generated drift audits. The next major release replaces the old
+- Use distributed `inspect` for repository assessment and repository-only
+ `artifact-integrity` for vstack source-to-generated drift audits.
+ The next major release replaces the old
prompt catalog with skills; see [Prompt migration](../user/reference/prompt-migration.md).
**Phase B — generated-artifact drift guard:**
diff --git a/docs/user/reference/prompt-migration.md b/docs/user/reference/prompt-migration.md
index c57d1404..47328747 100644
--- a/docs/user/reference/prompt-migration.md
+++ b/docs/user/reference/prompt-migration.md
@@ -7,25 +7,25 @@ them. vstack now supplies reusable workflows as skills in
## Replacement Commands
-| Retired prompt | Replacement skill | Change |
-| -------------------- | -------------------- | ------------------------------------------------------------------ |
-| `api-design-review` | `openapi` | Reuse API contract writing and review. |
-| `architecture-risk` | `architecture` | Reuse architecture and execution-plan review. |
-| `artifact-integrity` | `artifact-integrity` | New explicit-only skill; vstack source audit. |
-| `ci-triage` | `debug` | Reuse root-cause investigation for CI failures. |
-| `dependency-audit` | `dependency` | Reuse dependency health auditing. |
-| `incident-timeline` | `postmortem` | Reuse incident timeline and postmortem workflow. |
-| `migration-plan` | `migration-plan` | New explicit-only cross-component planning skill. |
-| `migration-safety` | `migrate` | Reuse database migration review. |
-| `ops-readiness` | `inspect` | Reuse reliability and observability auditing. |
-| `quick-review` | `code-review` | Reuse pre-landing review. |
-| `reasoning` | `reasoning` | New explicit-only reasoning framework. |
-| `release-check` | `release-check` | New explicit-only release evidence audit, not release publication. |
-| `repo-assessment` | `inspect` | Reuse repository verification audit. |
-| `template-impact` | `analyse` | Reuse impact analysis. |
-| `test-gaps` | `inspect` | Reuse test and verification auditing. |
-| `upgrade-plan` | `upgrade-plan` | New explicit-only upgrade planning skill. |
-| `workflow-check` | `workflow-check` | New explicit-only stage, gate, and handoff audit. |
+| Retired prompt | Replacement skill | Change |
+| -------------------- | ----------------- | ------------------------------------------------------------------------ |
+| `api-design-review` | `openapi` | Reuse API contract writing and review. |
+| `architecture-risk` | `architecture` | Reuse architecture and execution-plan review. |
+| `artifact-integrity` | `inspect` | Reuse repository auditing; the source-specific skill is repository-only. |
+| `ci-triage` | `debug` | Reuse root-cause investigation for CI failures. |
+| `dependency-audit` | `dependency` | Reuse dependency health auditing. |
+| `incident-timeline` | `postmortem` | Reuse incident timeline and postmortem workflow. |
+| `migration-plan` | `migration-plan` | New explicit-only cross-component planning skill. |
+| `migration-safety` | `migrate` | Reuse database migration review. |
+| `ops-readiness` | `inspect` | Reuse reliability and observability auditing. |
+| `quick-review` | `code-review` | Reuse pre-landing review. |
+| `reasoning` | `reasoning` | New explicit-only reasoning framework. |
+| `release-check` | `release-check` | New explicit-only release evidence audit, not release publication. |
+| `repo-assessment` | `inspect` | Reuse repository verification audit. |
+| `template-impact` | `analyse` | Reuse impact analysis. |
+| `test-gaps` | `inspect` | Reuse test and verification auditing. |
+| `upgrade-plan` | `upgrade-plan` | New explicit-only upgrade planning skill. |
+| `workflow-check` | `workflow-check` | New explicit-only stage, gate, and handoff audit. |
Invoke skills with `/name`, for example `/code-review`. References such as
`prompt/reasoning` become `skill/reasoning`. Existing replacement skills keep their
@@ -63,6 +63,13 @@ During an install with skills selected:
No `--prune` flag is needed for this targeted retirement. Other obsolete artifact
cleanup still requires `init --prune`.
+`artifact-integrity` is maintained only in the vstack source repository as a
+hand-authored skill. Fresh installations do not receive it. If an earlier build
+installed a managed copy, `init` reports it as obsolete; `init --prune` removes
+it only when its stored checksum still matches. Locally modified copies are
+preserved. Untracked repository-only skills remain untouched, including with
+`--force` and `--prune`.
+
Untracked files are never touched. Modified, unreadable, checksum-less, unknown,
or unsafe-path prompts are preserved, reported, and kept in the manifest for
retry. Missing old files can be cleared from tracking after the replacement is
diff --git a/docs/user/reference/skills-overview.md b/docs/user/reference/skills-overview.md
index 9495fd6f..dc192e8f 100644
--- a/docs/user/reference/skills-overview.md
+++ b/docs/user/reference/skills-overview.md
@@ -8,6 +8,11 @@ Skills provide domain-specific execution playbooks. Agents use them to perform f
In vstack, skills are generated into `.github/skills//SKILL.md`.
+Projects may also hand-author repository-only skills in that directory. These
+have no vstack template or manifest entry and are not distributed by vstack.
+The vstack source repository's `artifact-integrity` maintenance skill is one
+such local skill, not a built-in command for consumer installations.
+
## Built-in Skills
| Skill | What It Helps With |
@@ -15,7 +20,6 @@ In vstack, skills are generated into `.github/skills//SKILL.md`.
| `adr` | Architecture Decision Record writing for significant technical decisions. |
| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. |
| `architecture` | Engineering-lead architecture and execution-plan review. |
-| `artifact-integrity` | Explicit-only audit of vstack source templates, installed artifacts, and manifest drift. |
| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. |
| `aws-cli` | AWS CLI operations across core AWS services. |
| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. |
diff --git a/src/vstack/_templates/skills/artifact-integrity/config.yaml b/src/vstack/_templates/skills/artifact-integrity/config.yaml
deleted file mode 100644
index f729fd6a..00000000
--- a/src/vstack/_templates/skills/artifact-integrity/config.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: artifact-integrity
-description: Check source templates against generated artifacts and identify drift or missing regeneration.
-argument-hint: "[artifact type, path, or full repo]"
-allowed-tools: 'read search'
-user-invocable: true
-disable-model-invocation: true
-version: 20261017001
diff --git a/src/vstack/_templates/skills/artifact-integrity/template.md b/src/vstack/_templates/skills/artifact-integrity/template.md
deleted file mode 100644
index 193453e3..00000000
--- a/src/vstack/_templates/skills/artifact-integrity/template.md
+++ /dev/null
@@ -1,51 +0,0 @@
-{{SKILL_CONTEXT}}
-
-# artifact-integrity - Generated Artifact Audit
-
-Check source templates against generated artifacts and identify drift.
-Report only; do not regenerate, edit, or delete files.
-
-Compare `src/vstack/_templates/` sources with installed artifacts in `.github/`
-and the manifest at `.vstack/vstack.json`. Surface mismatches, stale output, or gaps.
-
-Output exactly in this format:
-
-## Drift Findings
-
-List all source-to-artifact mismatches.
-
-For each item:
-
-- source template: path under `src/vstack/_templates/`
-- generated artifact: expected path under `.github/`
-- drift type: MISSING | STALE | CHECKSUM-MISMATCH | UNTRACKED
-- detail: one sentence describing the discrepancy
-
-## Regeneration Actions
-
-List exact commands needed to bring generated artifacts back into sync.
-
-For each action:
-
-- command: the shell command to run (e.g. `python3 -m vstack install`)
-- scope: which artifact types or names this command covers
-- priority: CRITICAL | HIGH | LOW
-
-## Risk If Unfixed
-
-Describe production risk if drift is left unresolved.
-
-For each drift item from above:
-
-- artifact affected
-- risk: what could fail or mislead if the stale artifact ships
-
-## Verification Steps
-
-Provide a checklist to confirm the repository is clean after regeneration.
-
-- [ ] `python3 -m vstack install` completes without errors
-- [ ] `vstack validate` reports no unresolved template tokens
-- [ ] `make test-local` passes with 100% coverage
-- [ ] `make markdown-format` reports no changes
-- [ ] All regenerated files match their source checksums in `.vstack/vstack.json`
diff --git a/src/vstack/cli/constants.py b/src/vstack/cli/constants.py
index e62919d3..d272bf32 100644
--- a/src/vstack/cli/constants.py
+++ b/src/vstack/cli/constants.py
@@ -11,7 +11,6 @@
"advise",
"analyse",
"architecture",
- "artifact-integrity",
"ask",
"adr",
"aws-cli",
@@ -136,7 +135,7 @@ class ArtifactState:
RETIRED_PROMPT_SKILLS: dict[str, str] = {
"api-design-review": "openapi",
"architecture-risk": "architecture",
- "artifact-integrity": "artifact-integrity",
+ "artifact-integrity": "inspect",
"ci-triage": "debug",
"dependency-audit": "dependency",
"incident-timeline": "postmortem",
diff --git a/tests/vstack/artifacts/test_generator.py b/tests/vstack/artifacts/test_generator.py
index 2c0ee9f4..090e3153 100644
--- a/tests/vstack/artifacts/test_generator.py
+++ b/tests/vstack/artifacts/test_generator.py
@@ -304,7 +304,6 @@ def test_render_agent_product_matches_golden_fixture(
@pytest.mark.parametrize(
"name, heading",
[
- ("artifact-integrity", "## Drift Findings"),
("migration-plan", "## Rollback Plan"),
("reasoning", "## Hallucination Guardrails"),
("release-check", "## Sign-off Gaps"),
diff --git a/tests/vstack/cli/test_constants.py b/tests/vstack/cli/test_constants.py
index 962fd168..ad003a59 100644
--- a/tests/vstack/cli/test_constants.py
+++ b/tests/vstack/cli/test_constants.py
@@ -9,7 +9,6 @@
"advise",
"analyse",
"architecture",
- "artifact-integrity",
"ask",
"adr",
"aws-cli",
diff --git a/tests/vstack/cli/test_prompt_migration.py b/tests/vstack/cli/test_prompt_migration.py
index 87aa3a6b..7a9ae166 100644
--- a/tests/vstack/cli/test_prompt_migration.py
+++ b/tests/vstack/cli/test_prompt_migration.py
@@ -89,6 +89,75 @@ def test_fresh_install_does_not_generate_or_adopt_prompts(
assert prompt.read_text(encoding="utf-8") == "My workflow\n"
+@pytest.mark.parametrize("force", [False, True])
+def test_repository_skill_is_not_installed_or_managed(
+ service: CommandService, tmp_path: Path, force: bool
+) -> None:
+ """Even forced installs with pruning leave repository-owned skills untouched."""
+ install_dir = tmp_path / ".github"
+ local_skill = install_dir / "skills" / "artifact-integrity" / "SKILL.md"
+ local_skill.parent.mkdir(parents=True)
+ content = "---\nname: artifact-integrity\ndescription: Local audit.\n---\nLocal procedure.\n"
+ local_skill.write_text(content, encoding="utf-8")
+
+ assert InitCommand.execute(service, install_dir, only=["skill"], force=force, prune=True) == 0
+ assert local_skill.read_text(encoding="utf-8") == content
+ manifest = service.manifest_for(install_dir).read()
+ assert manifest is not None
+ assert "artifact-integrity" not in manifest.names_for("skills")
+ assert "artifact-integrity" not in {
+ path.name for gen in service.generators for path in gen.find_templates()
+ }
+
+
+def test_fresh_install_omits_repository_skill(service: CommandService, tmp_path: Path) -> None:
+ """Consumer repositories receive product skills, not vstack maintenance skills."""
+ install_dir = tmp_path / ".github"
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 0
+ assert not (install_dir / "skills" / "artifact-integrity").exists()
+ assert RETIRED_PROMPT_SKILLS["artifact-integrity"] == "inspect"
+
+
+@pytest.mark.parametrize("modified", [False, True])
+def test_previously_distributed_repository_skill_uses_safe_obsolete_cleanup(
+ service: CommandService, tmp_path: Path, modified: bool
+) -> None:
+ """Old managed copies require pruning and local edits prevent their removal."""
+ install_dir = tmp_path / ".github"
+ local_skill = install_dir / "skills" / "artifact-integrity" / "SKILL.md"
+ local_skill.parent.mkdir(parents=True)
+ original = "Previously generated audit skill\n"
+ local_skill.write_text(original, encoding="utf-8")
+ manifest = Manifest(
+ vstack_version="3.7.0",
+ installed_at="2026-10-01T00:00:00Z",
+ artifacts={
+ "skills": [
+ ArtifactEntry(
+ name="artifact-integrity",
+ file="skills/artifact-integrity/SKILL.md",
+ version="20261017001",
+ checksum=content_hash(original),
+ checksum_algorithm="sha256",
+ )
+ ]
+ },
+ )
+ service.manifest_for(install_dir).write(manifest)
+ content = "Locally customized audit\n" if modified else original
+ local_skill.write_text(content, encoding="utf-8")
+
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 0
+ assert local_skill.read_text(encoding="utf-8") == content
+ assert InitCommand.execute(service, install_dir, only=["skill"], prune=True) == 0
+ installed_manifest = service.manifest_for(install_dir).read()
+ assert installed_manifest is not None
+ assert ("artifact-integrity" in installed_manifest.names_for("skills")) is modified
+ assert local_skill.exists() is modified
+ if modified:
+ assert local_skill.read_text(encoding="utf-8") == content
+
+
def test_upgrade_dry_run_preserves_files_and_manifest(
service: CommandService, tmp_path: Path, capsys: pytest.CaptureFixture[str]
) -> None:
From 9c515c75ea5f53e48ad01242bdc5b03b24e676e8 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 15:59:31 +0200
Subject: [PATCH 4/9] fix(skills): audit consumer project artifacts in
workflow-check
Clarify that workflow checks use project configuration, installed agents, role documents, and handoff definitions rather than vstack source templates. Bump the skill revision, regenerate artifacts, and align catalog documentation.
Synchronize one stale generated refactor version footer; its procedure is unchanged. Validation: all five converted skill contracts pass and complete source/output verification succeeds.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
.github/skills/refactor/SKILL.md | 2 +-
.github/skills/workflow-check/SKILL.md | 6 +-
.vstack/vstack.json | 8 +-
docs/design/skills.md | 2 +-
docs/user/reference/skills-overview.md | 114 +++++++++---------
.../skills/workflow-check/config.yaml | 2 +-
.../skills/workflow-check/template.md | 4 +-
7 files changed, 71 insertions(+), 67 deletions(-)
diff --git a/.github/skills/refactor/SKILL.md b/.github/skills/refactor/SKILL.md
index 5be78f29..cbb1bff7 100644
--- a/.github/skills/refactor/SKILL.md
+++ b/.github/skills/refactor/SKILL.md
@@ -375,4 +375,4 @@ Behavior changed: No
```
-
+
diff --git a/.github/skills/workflow-check/SKILL.md b/.github/skills/workflow-check/SKILL.md
index 327c04f9..dc7ec077 100644
--- a/.github/skills/workflow-check/SKILL.md
+++ b/.github/skills/workflow-check/SKILL.md
@@ -33,7 +33,9 @@ directory structures and other scan-friendly hierarchies.
Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
Report only; do not change workflow configuration or role artifacts.
-Focus on evidence in workflow config, role templates, and docs.
+Focus on the current project's workflow configuration, installed agent files,
+role documents, and handoff definitions. These are consumer-project artifacts;
+the vstack source repository and its template directories are not required.
Output exactly in this format:
@@ -69,4 +71,4 @@ Provide an ordered short list of actions.
- expected result
-
+
diff --git a/.vstack/vstack.json b/.vstack/vstack.json
index ce497c5a..fddd006c 100644
--- a/.vstack/vstack.json
+++ b/.vstack/vstack.json
@@ -2,7 +2,7 @@
"manifest_version": 2,
"hash_algorithm": "sha256",
"vstack_version": "3.7.8",
- "installed_at": "2026-10-17T13:54:40.625936+00:00",
+ "installed_at": "2026-10-17T13:59:31.708252+00:00",
"artifacts": {
"skills": [
{
@@ -296,7 +296,7 @@
"name": "refactor",
"file": "skills/refactor/SKILL.md",
"version": "20260421023",
- "checksum": "c804552f73f7be6fc6efb0709f4ec993c994bba1e9fdf75f549da275be854fb0",
+ "checksum": "cdc4a2b846353ccb8b5255bab6095477885cd1228cba7815cab3638b6d71f570",
"checksum_algorithm": "sha256"
},
{
@@ -393,8 +393,8 @@
{
"name": "workflow-check",
"file": "skills/workflow-check/SKILL.md",
- "version": "20261017001",
- "checksum": "ba480e7ed2a158bff03e5dbde1f2c25ce26ed8c769bd5e043b0c6994208b5e7c",
+ "version": "20261017002",
+ "checksum": "aa68d768a44fed5e142ddc1d66c8958fdf1636284294ecf93dc255e7011b1428",
"checksum_algorithm": "sha256"
}
],
diff --git a/docs/design/skills.md b/docs/design/skills.md
index 1aafd7b2..4ade7867 100644
--- a/docs/design/skills.md
+++ b/docs/design/skills.md
@@ -113,7 +113,7 @@ List skills in alphabetical order by skill name in every catalog or role skill l
| `upgrade-plan` | Explicit-only upgrade plan with compatibility and rollback checks. | engineer, tester | upgrade plan |
| `verify` | Verification fix-loop with mode routing (quick/standard/exhaustive). Runs targeted checks, fixes by severity, and re-verifies impacted paths. | engineer, tester | fixes + verification report |
| `vision` | CEO/founder-mode plan review. Rethink from first principles, validate ambition, find the 10x solution. | product | `docs/product/vision.md` |
-| `workflow-check` | Explicit-only stage, gate, and handoff integrity audit. | planner, tester | workflow report |
+| `workflow-check` | Explicit-only stage, gate, and handoff audit using project configuration, installed agents, and role documents; no vstack source templates required. | planner, tester | workflow report |
The next major release removes prompt artifacts in favor of skills.
Converted workflows retain their bodies and output sections, but do not select
diff --git a/docs/user/reference/skills-overview.md b/docs/user/reference/skills-overview.md
index dc192e8f..6be9afdc 100644
--- a/docs/user/reference/skills-overview.md
+++ b/docs/user/reference/skills-overview.md
@@ -15,63 +15,63 @@ such local skill, not a built-in command for consumer installations.
## Built-in Skills
-| Skill | What It Helps With |
-| --------------------- | ------------------------------------------------------------------------------------------------------------------- |
-| `adr` | Architecture Decision Record writing for significant technical decisions. |
-| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. |
-| `architecture` | Engineering-lead architecture and execution-plan review. |
-| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. |
-| `aws-cli` | AWS CLI operations across core AWS services. |
-| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. |
-| `changedoc` | Per-change planning docs for existing repositories; product starts it, other roles enrich it, planner orchestrates. |
-| `cloudformation` | CloudFormation template authoring and review. |
-| `code-review` | Pre-merge review for bugs, regressions, and risk gaps. |
-| `codeql` | CodeQL scanning setup and workflow configuration. |
-| `concise` | Runtime response-density control (normal/compact/ultra). |
-| `consult` | DX-focused review with prioritized usability improvements. |
-| `container` | Dockerfile and container runtime setup and hardening. |
-| `conventional-commit` | Conventional Commit message preparation and validation. |
-| `copilot-ops` | Copilot policy/configuration operations and governance. |
-| `debug` | Root-cause-first debugging using scientific investigation flow. |
-| `dependabot` | Dependabot configuration strategy for update hygiene. |
-| `dependency` | Dependency health audit, upgrade strategy, and supply-chain checks. |
-| `design` | API and service interface design standards and contracts. |
-| `docs` | Post-release documentation alignment with shipped behavior. |
-| `explore` | Fast codebase exploration, reuse discovery, and architecture mapping. |
-| `gdpr` | GDPR-compliant engineering review for data handling and flows. |
-| `gh-issues` | GitHub issue lifecycle management via `gh`. |
-| `gh-release` | GitHub Release drafting and publication flow via `gh`. |
-| `guardrails` | Session safety controls for destructive-command confirmation. |
-| `helm` | Helm chart authoring, upgrade, and release troubleshooting. |
-| `incident` | Incident coordination, sequencing, and action definition. |
-| `inspect` | Read-only verification audit with severity-ranked findings. |
-| `k8s` | Kubernetes manifest authoring and operational troubleshooting. |
-| `lazy` | Engineer-first minimal-change implementation with safety guardrails. |
-| `migrate` | Safe database migration planning and review. |
-| `migration-plan` | Explicit-only cross-component migration planning with checkpoints and rollback. |
-| `onboard` | Contributor onboarding guide creation. |
-| `openapi` | OpenAPI 3.1 specification writing and review. |
-| `performance` | Benchmarking, profiling, and performance regression analysis. |
-| `postmortem` | Blameless stakeholder-facing incident postmortem writing. |
-| `pr` | Commit/push and pull-request creation workflow support. |
-| `rancher` | Rancher and Fleet workload/governance operations. |
-| `rca` | Technical root cause analysis for incidents and defects. |
-| `reasoning` | Explicit-only evidence-based critical thinking and evaluation framework. |
-| `refactor` | Behavior-preserving structural refactoring. |
-| `release-check` | Explicit-only release evidence and sign-off audit without publishing. |
-| `release-notes` | Release note artifact and changelog preparation. |
-| `requirements` | Structured requirements gathering and documentation. |
-| `secret-scan` | Secret scanning and push-protection setup and triage. |
-| `security` | OWASP/STRIDE security audit across code and config. |
-| `simplify` | Generic simplification of plans and proposals while preserving outcomes. |
-| `space-setup` | Copilot Space setup and context quality management. |
-| `terraform` | Terraform IaC authoring and review. |
-| `terragrunt` | Terragrunt DRY multi-environment configuration design. |
-| `threat-model` | Threat modeling with STRIDE-first prioritization. |
-| `upgrade-plan` | Explicit-only upgrade planning with compatibility and rollback checks. |
-| `verify` | Verification fix-loop with targeted re-checking. |
-| `vision` | Scope and strategy review from first principles. |
-| `workflow-check` | Explicit-only workflow stage, gate, and handoff integrity review. |
+| Skill | What It Helps With |
+| --------------------- | ---------------------------------------------------------------------------------------------------------------------- |
+| `adr` | Architecture Decision Record writing for significant technical decisions. |
+| `analyse` | Cross-cutting impact, tradeoff, and feasibility analysis. |
+| `architecture` | Engineering-lead architecture and execution-plan review. |
+| `ask` | Read-only technical Q&A with code-backed evidence and clear guidance. |
+| `aws-cli` | AWS CLI operations across core AWS services. |
+| `cicd` | GitHub Actions CI/CD workflow authoring and hardening. |
+| `changedoc` | Per-change planning docs for existing repositories; product starts it, other roles enrich it, planner orchestrates. |
+| `cloudformation` | CloudFormation template authoring and review. |
+| `code-review` | Pre-merge review for bugs, regressions, and risk gaps. |
+| `codeql` | CodeQL scanning setup and workflow configuration. |
+| `concise` | Runtime response-density control (normal/compact/ultra). |
+| `consult` | DX-focused review with prioritized usability improvements. |
+| `container` | Dockerfile and container runtime setup and hardening. |
+| `conventional-commit` | Conventional Commit message preparation and validation. |
+| `copilot-ops` | Copilot policy/configuration operations and governance. |
+| `debug` | Root-cause-first debugging using scientific investigation flow. |
+| `dependabot` | Dependabot configuration strategy for update hygiene. |
+| `dependency` | Dependency health audit, upgrade strategy, and supply-chain checks. |
+| `design` | API and service interface design standards and contracts. |
+| `docs` | Post-release documentation alignment with shipped behavior. |
+| `explore` | Fast codebase exploration, reuse discovery, and architecture mapping. |
+| `gdpr` | GDPR-compliant engineering review for data handling and flows. |
+| `gh-issues` | GitHub issue lifecycle management via `gh`. |
+| `gh-release` | GitHub Release drafting and publication flow via `gh`. |
+| `guardrails` | Session safety controls for destructive-command confirmation. |
+| `helm` | Helm chart authoring, upgrade, and release troubleshooting. |
+| `incident` | Incident coordination, sequencing, and action definition. |
+| `inspect` | Read-only verification audit with severity-ranked findings. |
+| `k8s` | Kubernetes manifest authoring and operational troubleshooting. |
+| `lazy` | Engineer-first minimal-change implementation with safety guardrails. |
+| `migrate` | Safe database migration planning and review. |
+| `migration-plan` | Explicit-only cross-component migration planning with checkpoints and rollback. |
+| `onboard` | Contributor onboarding guide creation. |
+| `openapi` | OpenAPI 3.1 specification writing and review. |
+| `performance` | Benchmarking, profiling, and performance regression analysis. |
+| `postmortem` | Blameless stakeholder-facing incident postmortem writing. |
+| `pr` | Commit/push and pull-request creation workflow support. |
+| `rancher` | Rancher and Fleet workload/governance operations. |
+| `rca` | Technical root cause analysis for incidents and defects. |
+| `reasoning` | Explicit-only evidence-based critical thinking and evaluation framework. |
+| `refactor` | Behavior-preserving structural refactoring. |
+| `release-check` | Explicit-only release evidence and sign-off audit without publishing. |
+| `release-notes` | Release note artifact and changelog preparation. |
+| `requirements` | Structured requirements gathering and documentation. |
+| `secret-scan` | Secret scanning and push-protection setup and triage. |
+| `security` | OWASP/STRIDE security audit across code and config. |
+| `simplify` | Generic simplification of plans and proposals while preserving outcomes. |
+| `space-setup` | Copilot Space setup and context quality management. |
+| `terraform` | Terraform IaC authoring and review. |
+| `terragrunt` | Terragrunt DRY multi-environment configuration design. |
+| `threat-model` | Threat modeling with STRIDE-first prioritization. |
+| `upgrade-plan` | Explicit-only upgrade planning with compatibility and rollback checks. |
+| `verify` | Verification fix-loop with targeted re-checking. |
+| `vision` | Scope and strategy review from first principles. |
+| `workflow-check` | Explicit-only stage, gate, and handoff review using the project's installed agents, configuration, and role documents. |
## Related Docs
diff --git a/src/vstack/_templates/skills/workflow-check/config.yaml b/src/vstack/_templates/skills/workflow-check/config.yaml
index 07deae4c..a5fd77ef 100644
--- a/src/vstack/_templates/skills/workflow-check/config.yaml
+++ b/src/vstack/_templates/skills/workflow-check/config.yaml
@@ -4,4 +4,4 @@ argument-hint: "[workflow scope or stage list]"
allowed-tools: 'read search'
user-invocable: true
disable-model-invocation: true
-version: 20261017001
+version: 20261017002
diff --git a/src/vstack/_templates/skills/workflow-check/template.md b/src/vstack/_templates/skills/workflow-check/template.md
index c6d71ffc..5caf0401 100644
--- a/src/vstack/_templates/skills/workflow-check/template.md
+++ b/src/vstack/_templates/skills/workflow-check/template.md
@@ -5,7 +5,9 @@
Review workflow stage flow, gate usage, and handoff integrity across role artifacts.
Report only; do not change workflow configuration or role artifacts.
-Focus on evidence in workflow config, role templates, and docs.
+Focus on the current project's workflow configuration, installed agent files,
+role documents, and handoff definitions. These are consumer-project artifacts;
+the vstack source repository and its template directories are not required.
Output exactly in this format:
From 681c3d2237404aafa0e9f46cfecbe2c67b6b3170 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 16:01:38 +0200
Subject: [PATCH 5/9] chore(deps): bump types-pyyaml to 6.0.12.20260906
Apply Dependabot PR #109 while preserving the Python 3.11+ support range. Regenerate the lock with Poetry and verify type checking.
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
poetry.lock | 8 ++++----
pyproject.toml | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index 979d2925..d1f7cb26 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -763,14 +763,14 @@ testing = ["devpi-process (>=1.1.1)", "pytest (>=9.0.2)", "pytest-mock (>=3.15.1
[[package]]
name = "types-pyyaml"
-version = "6.0.12.20260815"
+version = "6.0.12.20260906"
description = "Typing stubs for PyYAML"
optional = false
python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "types_pyyaml-6.0.12.20260815-py3-none-any.whl", hash = "sha256:6f332212b7e191f3afd5016a713c510b6340593b7ebec573c7d5d20aa5386d3b"},
- {file = "types_pyyaml-6.0.12.20260815.tar.gz", hash = "sha256:28764110c9cf35846e733da32d8d734df7473c5dde9ef67c3b7332ec0e819858"},
+ {file = "types_pyyaml-6.0.12.20260906-py3-none-any.whl", hash = "sha256:bca893ff0d51df5c9053137d5d0e6ccd36e939a196356f1d5c16372422f5137b"},
+ {file = "types_pyyaml-6.0.12.20260906.tar.gz", hash = "sha256:f59c1cc05010b833d2d72287bbaa72610106b28d42d89a907313117faba85212"},
]
[[package]]
@@ -806,4 +806,4 @@ python-discovery = ">=1.4.2"
[metadata]
lock-version = "2.1"
python-versions = ">=3.11"
-content-hash = "f3c255c6d01cb73602afb27d4d76ee064cd692c6183bb8230292dee6fd25615c"
+content-hash = "421337ee55e216b27ca6e3ee8f0e4023864daf53a3d55db7b9a7dfc319278c1a"
diff --git a/pyproject.toml b/pyproject.toml
index 6bb5632b..3ee2d718 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -84,7 +84,7 @@ ruff = ">=0.16.4"
mypy = ">=2.3.1"
pre-commit = ">=4.6.2"
tox = ">=4.60.0"
-types-PyYAML = ">=6.0.12.20260815"
+types-PyYAML = ">=6.0.12.20260906"
# ---------------------------------------------------------------------------
From 3ba219ede412338821385e6e2db1499dde2026d6 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 16:01:55 +0200
Subject: [PATCH 6/9] chore(ci): bump trufflehog to 3.97.4
Apply Dependabot PR #110 with an immutable action SHA while retaining Python 3.14 CI defaults.
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
.github/workflows/security.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index d2da57ef..fcd211e3 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -60,7 +60,7 @@ jobs:
- name: Secret scan
# Scan only PR diff range to reduce noise and speed up checks.
- uses: trufflesecurity/trufflehog@20652fbbdefffcdaa493a5bf57ab2ac6b1db715b
+ uses: trufflesecurity/trufflehog@363923b901c911a9164f50b6c423f47c15372b1c
with:
path: ./
base: ${{ github.event.pull_request.base.sha }}
From 89b67257b5b888f73bf505d3d0e4bbde74bc921e Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 16:02:33 +0200
Subject: [PATCH 7/9] chore(deps): bump virtualenv to 21.7.13
Apply Dependabot PR #111 with its required python-discovery 1.6.1 update. Preserve current Python support metadata and avoid unrelated newer dependency upgrades.
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
poetry.lock | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index d1f7cb26..442c9793 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -591,23 +591,18 @@ testing = ["process-tests", "pytest-xdist", "virtualenv"]
[[package]]
name = "python-discovery"
-version = "1.4.4"
+version = "1.6.1"
description = "Python interpreter discovery"
optional = false
python-versions = ">=3.8"
groups = ["dev"]
files = [
- {file = "python_discovery-1.4.4-py3-none-any.whl", hash = "sha256:abebe9120b43453b68c908acfb1e72a19d1a959ed2cb620ad38fc57d08056dbe"},
- {file = "python_discovery-1.4.4.tar.gz", hash = "sha256:5cad33982d412c1f3ffb8f9ca4ea292c9680bca3942451d30b69c37fce53a4a3"},
+ {file = "python_discovery-1.6.1-py3-none-any.whl", hash = "sha256:d43fcdef879fe795352bd13ccf8d185ba5a9f86f36cfcd00529f596e737442b3"},
+ {file = "python_discovery-1.6.1.tar.gz", hash = "sha256:cf87d3627dfb4412437fdd5b13eae402607722998d21567993aedbc59b23c15e"},
]
[package.dependencies]
filelock = ">=3.15.4"
-platformdirs = ">=4.3.6,<5"
-
-[package.extras]
-docs = ["furo (>=2025.12.19)", "sphinx (>=9.1)", "sphinx-autodoc-typehints (>=3.6.3)", "sphinxcontrib-mermaid (>=2)", "sphinxcontrib-towncrier (>=0.4)", "towncrier (>=25.8)"]
-testing = ["covdefaults (>=2.3)", "coverage (>=7.5.4)", "pytest (>=8.3.5)", "pytest-mock (>=3.14)", "setuptools (>=75.1)"]
[[package]]
name = "pyyaml"
@@ -787,21 +782,21 @@ files = [
[[package]]
name = "virtualenv"
-version = "21.5.1"
+version = "21.7.13"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "virtualenv-21.5.1-py3-none-any.whl", hash = "sha256:55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783"},
- {file = "virtualenv-21.5.1.tar.gz", hash = "sha256:dca3bf98275a59c652b69d68e73433e597d977c2da9198882479d1a7188009c8"},
+ {file = "virtualenv-21.7.13-py3-none-any.whl", hash = "sha256:1bea5af7463f59c4719db48fe739579a2a4f569c96f26c086edda85c96da9f59"},
+ {file = "virtualenv-21.7.13.tar.gz", hash = "sha256:0355558b6f33619aab31347e43643b0ebc97f61ea3acf617b2b69e1f8a843d11"},
]
[package.dependencies]
distlib = ">=0.3.7,<1"
filelock = {version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""}
platformdirs = ">=3.9.1,<5"
-python-discovery = ">=1.4.2"
+python-discovery = ">=1.6"
[metadata]
lock-version = "2.1"
From 7a1f19e0c71532afaa5550a2e7b39660bb1df704 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 16:04:32 +0200
Subject: [PATCH 8/9] chore(deps): bump ruff mypy and tox development tools
Apply Dependabot PR #112: Ruff 0.16.10, mypy 2.4.0, and tox 4.64.10. Regenerate the lock with required mypy dependency updates while retaining Python 3.11+ compatibility and prior dependency commits.
Validation: install the locked development environment; lint, typecheck, and formatting pass. All five Python 3.11-3.15 test environments pass 702 tests with 100% coverage.
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
poetry.lock | 480 ++++++++++++++++++++++++++++---------------------
pyproject.toml | 6 +-
2 files changed, 277 insertions(+), 209 deletions(-)
diff --git a/poetry.lock b/poetry.lock
index 442c9793..5e57b18c 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -2,46 +2,69 @@
[[package]]
name = "ast-serialize"
-version = "0.6.0"
+version = "0.13.1"
description = "Python bindings for mypy AST serialization"
optional = false
python-versions = ">=3.7"
groups = ["dev"]
files = [
- {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:a7520b672827885bafeae7501f684d14d47d17e5f45256f9df547686cca52264"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a14191beec7e0c078d2fc1f6edc0aee88bcd4db9f18e1bc9f8052b559c22dddc"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32ef62ec34cf6be20ad77d4799556638fbdf187f3ae10698dfb20ef9f2c89516"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13b7769970a39983b0adf2f38917b1cd3b8946f76df045756c3d741bc689f089"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f7a408601bb3edaefb3bc67a4c01f5235e3253653b6a5729a2ee2382b35341c"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8670bfa51208a2c0c8d138928e40e998fab158f9200d53bb80c088b5b8eda7b8"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4826809eb8597a8cd59fd924b6d7c285b8969a1e0007e2cb652cab62376270f"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:577a6c189068686869f5f1ddc38363f3ae1808a4753b577266f9202071a7bb66"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:085de7f62dc9cc247eb01e965a362707d1d90b1d89a82c5bf78301a60a3c417b"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9f8a8b78b13173de6a9ec22111d9be674874cd5bdccda04f14ae5ebc2bef403a"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:f2ff3baffc3a29c1f15bc9098aa0c09763410262d5e6cef42116f7356c184554"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0067b25fce104eaae5b88383de9ab803faeb671831e14ca698b771b356e2600f"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c617417f9cbb0cb144f6283c3cbe0d2e0f01beaf9f608f662b21191058a626ec"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-win32.whl", hash = "sha256:5337cb256dcea3df9288205213d1601581536526b8f4da44b6974f1180f3252a"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d947e45cafc4b09bd7528917fa84c517654a43de173c79785574b7b3068ac24"},
- {file = "ast_serialize-0.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6e15ec740436e1a0d62de848641abe5f3a2f89a7f94907d534795ac91bbacf14"},
- {file = "ast_serialize-0.6.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:093cb8bb91b720d8523580498d031791bb1bbaa048599c3d21085d380e11a596"},
- {file = "ast_serialize-0.6.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:e61580a69faf47e3689795367ed211f2a10fd741478cc0f36a0f128793360aad"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305802f2ce2a7c4e87835078ea85c58b586ddda8095b92fe2ead9364ae19c80a"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c7b8b8f0c42f752ea00b2b7d7c090b3f80d9c1c5c75cadf16423790a0cc74081"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd5b91b9e6f2356ace3a556963b0cd783b395fbbb0bb17b4defc283415466e77"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d6ef91590258ada18909b9caea344dac4de2013906b035473cd674a43f4b790"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcbed41e9386059fc0261d602445ede0976c2ecec2939688bcbcb9ed0b6f28b7"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:cdc4e6f930b9090c2f92c9036ad12ffb8e6e44d4a5ba06f1458a05d60f203f7b"},
- {file = "ast_serialize-0.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:897ac47b5637be41c0c07061c8a912fafa967ef1dc73fa115e4bfa70882a093b"},
- {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c4af9a1386166e40ed01464991806f89038a2d89782576c7774876fa77034e32"},
- {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c901adbd750029b9ac4ad3d6aa56853e0ad4875119fbf52b7b8298afc223828b"},
- {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3ae22a366b752ab4496191525b78b097b5b72d531752e3c1dd7e383a8f2c8a1a"},
- {file = "ast_serialize-0.6.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4ed29121da8b3fdc291002801a1de0f76248fa07dce89157a5f277842cf6126e"},
- {file = "ast_serialize-0.6.0-cp39-abi3-pyemscripten_2026_0_wasm32.whl", hash = "sha256:b1dac4e09d341c1300ba69cdcbe62867b32a8c75d90db9bf4d083bec3b039f0b"},
- {file = "ast_serialize-0.6.0-cp39-abi3-win32.whl", hash = "sha256:82c312a7844d2fdeb4d5c48bd3d215bf940dafd4704e1a9bcf252a99010a99b1"},
- {file = "ast_serialize-0.6.0-cp39-abi3-win_amd64.whl", hash = "sha256:113b58346f9ceb664352032770caca817d4a3c86f611c6088e6ef65ddaa70f0e"},
- {file = "ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e"},
- {file = "ast_serialize-0.6.0.tar.gz", hash = "sha256:aadd3ffcf4858c9726bf3515f7b199c7eadbe504f96028e4a87172c0da65a8fe"},
+ {file = "ast_serialize-0.13.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3e129d44b0cffbea24a7f40117ce49e30993c3d119e584d4817ebd6f87246456"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:523d45bab16ddaf1399c04c4fe81bbf180f81e33c2f7bcbe76be56b0f7311ab4"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:638333fb8ae72c62753f9e794fda20290883ddc65b0d85e26e08f8bb227567ad"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc34c670747d85d4232834665e247009413eaebe47c69eaf60a5c439aaecaed9"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8c8ebd419811c435812d242fb2a173e57dfede198c9ac9a0a584666ebc9b9331"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8899c038b1c15ae8b98e379057fb3ef398ceb0b21d1737a8156dd5a0923b7e51"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e14c4de98f965647a74e6eaf37e20207124e45451ccd36e84a6f6ebab45e0372"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3e8a3eff69af640db985360fef35073fb46956dfc3e5c614cf00920d2746dd"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:75d7750fe98f6f35a96c43aba8d98a2e623e22c778a0c17ab9ede92eb10f5d82"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:43e8ddd63e80fc280c2f790157386f27f9b9f6ccb9c4f8e803b863cbfb085769"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9221e09496fb942901993c1812ee87950cc0ecbb514c7c0f1f5fa6d78f701ed8"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:7a5c38bdb93669c596f94fb7204dd6ebe4fadb19058ac9a2faf2948c2a175f96"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:acf4e9f055d75058ab01536da330648746f2f82b7697a85230547f2d5ebe895c"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:87427913c325adc811e81e7c9a757b061f47ef1e29114ac479aa0953a2687a98"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:ad88921f95b92bc144d9ad059a0e16f8c1ae69f5239f2d3c6536fd2774f73dfe"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f8b17e2921e56621bcb46792bd3e0b82ca3b85de78d5936e7b8174ba1758b0aa"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-win32.whl", hash = "sha256:2f9a9ce8b0994f757b941f7f7fe384a6666b4162b941ebc5c248081baea18e47"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5d99910e6b9a9b9360bcca2ae99aee36cc912ce058df2a57d1c33099b6cb2593"},
+ {file = "ast_serialize-0.13.1-cp314-cp314t-win_arm64.whl", hash = "sha256:a789cbe14d0a0e9ec9b32a456e5abc81ad8799479c3cfd88a29e3442262aebe6"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-macosx_10_12_x86_64.whl", hash = "sha256:23d768369b89d551077dc173da6892fad00443338417523b6732f4e8ba4a7ed5"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-macosx_11_0_arm64.whl", hash = "sha256:68f8829d114dab6c9db4a8bbb8d0e342958faee1b5e15a29022678df639960f8"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e385b17d5bde892a6184003a9aff3518387908b73f8f5ea539313c07c8c0ede"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:02686b281ec9b8e9614f6f0db27e12e4cac515f336c5d05b678bc9eb73ff2af5"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8ab2c2585b2e22e48cd4aff2136fce4eab4ced569b85f150ef9a5a5d6f34d49"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c652d9f5d52d8b81eff3ff2c95c9dd0f281de45f6ad5d3fa95527550c396454a"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:121e1d08d58b75c15491cc3003609cbad71ac2b0016043c36d30a6b2032b6605"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_31_riscv64.whl", hash = "sha256:30cf89b6a6844542d116c758725d13de5b97b9410a51ee577715f761270d0c1c"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:732aaae9e498c973fc63fd7f308009b57c4afa6ff59d0b674d894e57d0bca01a"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl", hash = "sha256:d9c1a920b2aa0c1e016bed7721689717034ca0dba64ac3a3ff243b003d4e8dd8"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_armv7l.whl", hash = "sha256:847cad4c22953823f5e76d0b126c6f9da670cfa45b1df41b9324e22189d77611"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_i686.whl", hash = "sha256:aca07de3ca8e3d9f2b716c3c31f4f384fe4bd2d03e09912417cff7a3e08036f7"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_ppc64le.whl", hash = "sha256:5db12d843d931b9d1f1519ce66b9cbfe72d8563b75c1204d255322254d1964dd"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_riscv64.whl", hash = "sha256:fb8021f4dc3296de18737e3b8b34994411da725374d74a0b9eb32a738f2a23d0"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl", hash = "sha256:0d764913374ba21df8cd618045b371ed104ce55c6276de7c59e554a4f5ba26fd"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win32.whl", hash = "sha256:2bad302ae2427454ef9dab71bd5c3ad67188860c39d36daee38f72031edb39c4"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win_amd64.whl", hash = "sha256:032b09d86c785c3984e975378b7861f2a68ac44e22ba7b07b93a536b2524eeb8"},
+ {file = "ast_serialize-0.13.1-cp315-abi3.abi3t-win_arm64.whl", hash = "sha256:929eda0c419e622ab49df3a4c45f81c57dcc10874bbad55d0470a4a03324dac3"},
+ {file = "ast_serialize-0.13.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:bf53a3ba1cbe45399fc1e4ccd684b8f2a11cca450f89706b79122f478534c6f5"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:4bcf1d5f4eefecaa325a34ecf079b2741189e7d0821523f92cb343a389a67489"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1b158f1c9e3a0d386913924c57995d6df78224868a4d0f215bdd41587c97b34a"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a6201b69ce42e919f2fd9a559138d5410b5d8afff7c3a6b1f500b0481ff7d8"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eb0be64c9b8f1ed26637eef345abe75ea90351c92c85a8aec7838b3af971011"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2427bddfca208e84de700044fadf9aef2769a70bae740a1bdabb89ee9e1117"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88df960e67184a71874e5b2ee014f87d1254a0dbc1f903c7bd7b1ab7733ecaef"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f99786e0d62082a5b121b3437f3167562133711df22128de1e9886f57f0b226"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:a01b515b25a03184eff4acef25b981ae007916379682e908fc8785b342a0bf3e"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:29422d7bcd9e7f39411571c36cec45ce8a7a9b3ad4b2e7aa64497c15a9e397f6"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ffb0f548a7dc126067fdfb7b2325ab5dfcdeecc29faf5e0f0461c96d6ebfa3d"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:2876444a5f87a7c76f371af3c07c2fda563a08bc8af52568df812e8aba4bf568"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:885a62ec6481ce58ab24c6357360d7a82023b62dd7e5e7ceccf59e9662a3272b"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:2015fd0165e463aac3b1aadc6a1fa1e5820c14ca950821f4fe02f8a3f6a388d6"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:eb41e1906502ac80d24ff343f45008552a3f5b5158607959fe6a07dbfc6eb037"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ca9acc67f796aa2554fa3037dccc022a4b08b38b2ad153edfac9c9bb7cb1f3c6"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-win32.whl", hash = "sha256:4f98da562e5901d69c7dd30885594c5438f859edf354e9ac7517d188fb026c3a"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-win_amd64.whl", hash = "sha256:ddf7cbc9c8abf70102c4a088efe154bb86bfb825b0a10e556d2b15972cf99bd7"},
+ {file = "ast_serialize-0.13.1-cp39-abi3-win_arm64.whl", hash = "sha256:48f11d96c9ec71119612f8e79a8c55c12f2b136716d68347433c561d27a25f43"},
+ {file = "ast_serialize-0.13.1.tar.gz", hash = "sha256:401cc84e8888d4d76f2c8d296fa006ed1a5ff993b6aff90dd777c03973efd025"},
]
[[package]]
@@ -237,172 +260,217 @@ files = [
[[package]]
name = "librt"
-version = "0.13.0"
+version = "0.16.0"
description = "Mypyc runtime library"
optional = false
python-versions = ">=3.9"
groups = ["dev"]
markers = "platform_python_implementation != \"PyPy\""
files = [
- {file = "librt-0.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:34e47058fcc69a313293d6dee94216a4f30c929ae6f2476e58c5ba635aa639d5"},
- {file = "librt-0.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dbdd5b6509d0c2a8fe72cf494c299a61dbd58142a90a4190664ae159e4a7b547"},
- {file = "librt-0.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e56ea4ee4df77585a6b5c138f6538680886024fa559f5b55bd14b12e98e67b2"},
- {file = "librt-0.13.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f1f9cc4d09a46d9cb3c2063ae100629d3f52a6517c3c08c2f4c9828261883929"},
- {file = "librt-0.13.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f125f5d46b20f89dc5587a55cc416b4ba2a5b2ffda36d048ee120e17598a653a"},
- {file = "librt-0.13.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2608d3b39f9e0b4a66a130d9150c615cba40a5090d25eeeaa225e0e46de8c0ac"},
- {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9fd35e95ab5e45c3901d37110263c7db85a961110f5460588fe37f8c131f88a7"},
- {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5f31b0aa13c9b04370d4da6be1ab7779776b3a075cceb6747a39a4be85fe1e40"},
- {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0b795f5fc70fbbb787ceaf79bb3a0d627bcc33c53de51741755263ec406b775a"},
- {file = "librt-0.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36b306a623aaad96fe4b378692b54f9c0789fccd833b9851753d5fbf6138cfde"},
- {file = "librt-0.13.0-cp310-cp310-win32.whl", hash = "sha256:a3762e75fcac8c9e4dacaaf438bffd9003e2ca2c531b756f3c0035deefa674c8"},
- {file = "librt-0.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:d63bae12a8aeb51380be3438e4dc4bd27354d0f8e19166b2f44e3e94d6f552dc"},
- {file = "librt-0.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b5a7bbff495baedbd9b916c367d66854008f8f3b575908ded477c499dc60082"},
- {file = "librt-0.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34bc7938b9fdf14fe32a406c19c71faf894c5cee7e7474bd0be2f17200b82d14"},
- {file = "librt-0.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f40e56b61b41be5f7dec938cfeffd660668cf4b5e72c78e7bd671d66b7bc2c79"},
- {file = "librt-0.13.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:9c5d02b89de5acd0379a51ec44a89476fb03df6145442e1c8ecd6bee2f91b176"},
- {file = "librt-0.13.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7db9a3ff32ef5f7d1703d93831a3316cdf0b537de6a1cc03cc8fdd09b9194e89"},
- {file = "librt-0.13.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3dbb2a31882456cadc7053378e81ad7ed7693db4ac9f98ab5f81ef034aa8ec9f"},
- {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c6014e3c80f9c1fe268ef8b0e0ef113bac672cc032f2f93866e7ddad4f3e663d"},
- {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:091b60a4d2174fc1ec5c34cdc0b72efb6224753d76b7da61ebeab7a191aec8bd"},
- {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:66cb1138f384a191a6d75f986064841fcfdc0cea98f7bd9c9ab9b38049917588"},
- {file = "librt-0.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:17221a7569f8f292aa0014226e48aa25b8c2b08da18088cd230953d0ea0f9cd1"},
- {file = "librt-0.13.0-cp311-cp311-win32.whl", hash = "sha256:fc67741da44c6eaa90e01eafb586bbba9b51eb5b6ed381ee6f5ae72eb3316d21"},
- {file = "librt-0.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:cc99dfb62b23c9207c33d0be8a2e2af7a42e21e6ea388b380a0c948c7b88953b"},
- {file = "librt-0.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:40ccd13c252d3fe473ffc8a57be7565abc8b64cf1b108344c859d5164f7f3e0c"},
- {file = "librt-0.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30536798f4504c0fad0885b1d371b0539abb081e4570c9d7c641cb51141b49f0"},
- {file = "librt-0.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93d24ebb82aa4420b1409c389e7857bc35bd0b668007ac8172427d5c73cc8cc5"},
- {file = "librt-0.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb8a1adce42d8b75485a5d56a9623a50bcab995b6079f1dac59fc44034dd93d9"},
- {file = "librt-0.13.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0763ca2ab66058174f9dee426dc64f5e0a89c24a7df8d3fe3f1836c04e25de4b"},
- {file = "librt-0.13.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b222493da6e7b6199db9bd79502436cf5a27da3c1f7fa83c7e285444fc93fd03"},
- {file = "librt-0.13.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fadc63331f4388c3dc90090448f682a7e9feafc11481391c1e94f2f907a3976e"},
- {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:70d9c62a4cffd9f23396cd5ef93fc5d11b31596b9b7d6306074abe3d5fcf09bd"},
- {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66c0e7e6b02a155576df2c77ec933a70b72da726e248c494abf690923e624348"},
- {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ac04bcd3328eb91d99dfedf6a60d9c1f15d3434e6f6daf922f0420f7d90b85c7"},
- {file = "librt-0.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db327e7271e653c32040b85ae6188059c924b57d7e1e29f935523fa017cd4e82"},
- {file = "librt-0.13.0-cp312-cp312-win32.whl", hash = "sha256:860bd1d8ba48456ce08feaf8d343a8aaeb2fa086f2bcaa2a923fa3f7a3ff9aa3"},
- {file = "librt-0.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:e54a315caf843c8d77e388cadc56ea9ded569935ee2d2347d7ea94992e5aa6fa"},
- {file = "librt-0.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:c718e99a0992127af84385378460db624103b559ab260435abcfe77a4e4ed1c1"},
- {file = "librt-0.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a468951af16155824e88bdd8326ebe5bdb371f3ec0ac04642994b98201d914f3"},
- {file = "librt-0.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ae01d8512cc17079e53425635327dbf3f7ff57a42c00dec348bf79791c56444c"},
- {file = "librt-0.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32c26893cd085c1efe83219e78d866da23fb20a066101b8f68210004361d224c"},
- {file = "librt-0.13.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5929da1981a46bcf4b28b1b9499905f0ff58e2419da402a048234e9783acbc4b"},
- {file = "librt-0.13.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b85d664d777bab6c0d709416cb42938251fda9e221b79e3a2215d85df5f4f9"},
- {file = "librt-0.13.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:531b2df3e9fe96b1fcf73a6d165921e4656be5f58d631d384ebce344298368db"},
- {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:109b84a9edf69ad89dc1f66358659e14a031baca95e3e5b0060bd903ede8efd6"},
- {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1304368a3e7ffc3e9db986796cc5326fdb5943a3567ecc137cff318e4240c0e7"},
- {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e4f9b472e7d308d94b62c801982065661158c6ed02790d6c7ddb4337cea0f9c1"},
- {file = "librt-0.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f836c37478f167a81200d8c8b2c920a22224564bed2c23d7aeec760965c367a"},
- {file = "librt-0.13.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:4000d961ff9598ac6ea603c6c836a5ed49bc205ade5fc378b998dfe1e2c36628"},
- {file = "librt-0.13.0-cp313-cp313-win32.whl", hash = "sha256:79e44cff71750d299d61a678e49995b0d5935a9cda238c2574daeca3ba536927"},
- {file = "librt-0.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:54dab44a847d5ad1acd05c8a83fe518ae685516ecf4d3f7cc6e3df2a66767650"},
- {file = "librt-0.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:d4cb6fbfdf874340ab5e51450753c0f817b6958a3621125ee695bbc3de866566"},
- {file = "librt-0.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:25218d94b1d2cbc0ba1d8a3f9dc9af578d9646e5ed16443a70cde1dfdcce6d71"},
- {file = "librt-0.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f26629539d4893c2957a16c41bb058e1e135c1f150f6a2e25ed047f64cf3f5c6"},
- {file = "librt-0.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4517d47b2b8af26975a406fba7d314de9696d864252e0257c6ea90238cfe27f"},
- {file = "librt-0.13.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f19e181de5b3a1148bb3420b8c4b0b0ea0fce6950099724ad151d6cea5acc180"},
- {file = "librt-0.13.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22034924f5b42d5a56371cf271771bfeaabf235a7a8b6264bef2d20013f786c6"},
- {file = "librt-0.13.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7897db4e95e22468bdda33d8e012ceacd0182abf001e6389d763f0def6286b9"},
- {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ce61b3746545029d4f5c17d6bd74b676254ad98433086c846ffb5e8fa73f007"},
- {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:46c330e82565962c761dbce7941be2cff7db674ee807455a8d0cadc5f9b759b0"},
- {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:375f5af8f99cbaa99dd293af986e3d57caabc9ba81a5d3f021603764854197a1"},
- {file = "librt-0.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9320d34c3376ae204b2cd176e8d4883a013934e0aef822f1aed9c536490c275d"},
- {file = "librt-0.13.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9af313c66157a69dc69ea0059a66961692250e0dc95af9c385a48ffb770a0d16"},
- {file = "librt-0.13.0-cp314-cp314-win32.whl", hash = "sha256:f2a7253458e34f33543551394ae4fe104b497ec2a65ac266074de64c1df82e37"},
- {file = "librt-0.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:a3dfe4edf10e8ed7e55b026a8bfc2c2a8704218b659cd4bffdf604fab966dc39"},
- {file = "librt-0.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:68a5faee4bba381cb93b5961f684a514cf0053cb92308ff9c792c2fea0b174c6"},
- {file = "librt-0.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:a38fb81d8376dfa2f8963b265fec07637802b0d01e2a127c19c66cb070fb24f5"},
- {file = "librt-0.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d4c8d9bd5abce34b2e75edb3bf37ab0f34e49b1f915a40ae8468eb7c85bc5b46"},
- {file = "librt-0.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:387e2f1d27e89bffe0d3f520f0da0662c973fd607ca16c1808f8a5085419485e"},
- {file = "librt-0.13.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:4f6db193d2e5e0ed60359b9a5a682cd67205d0d3b1e459a867dd4b5c4e7eaa7a"},
- {file = "librt-0.13.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d38604854e8d22faadf683ec6c02bb0f886e2ba56ef981a1c36ee275f21ea22"},
- {file = "librt-0.13.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:371f7ce73026815dafd51c50ce38416e91428b28c4b2ec97cd39271164b0045c"},
- {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3aaedf52171bee90860704c560bc798fe83b76247df47568e0197e9b13c735a0"},
- {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:96bad8725a4f196a798366c25ce075d1f7543a4ec045ffc13e6a7ec095cdab04"},
- {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:6bf6a559ffe4a93bbea6cf31ddf01a7fd9ba342ef51f27beb178e318b74acd61"},
- {file = "librt-0.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:301067672387902c55f94b51d5022304b36c966ea9fe1f21caab99a9bef487c9"},
- {file = "librt-0.13.0-cp314-cp314t-win32.whl", hash = "sha256:5fdcf34f86de8fb66d7dc7589f96ba91c4aa46671200d400e6fd6f109a483f18"},
- {file = "librt-0.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:260c33e92263fa629b4f6d3c51967a1c2158fe6c33237aaa3ebeac586b085259"},
- {file = "librt-0.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2f281549a4c52ac7bb97997f14353f8bd0e53a34ca0dad1c905cfd0b4a58ae99"},
- {file = "librt-0.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f442e3954b1addc759faae22a7c9a3f1e16d7d1db3f484279dc27d62e06968fa"},
- {file = "librt-0.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e786428f291dd2d2f1cbfc0e0caa45a2e395fab0ad3e2c9314daa8873414390"},
- {file = "librt-0.13.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21b7ac084f701a9cdff6139745a6620579d65a9379ac2d9d50a86368b109e63c"},
- {file = "librt-0.13.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a6e556d6aba31c93dd97ce661d66614d2429c0a3923f9dc8f0af7e8df10223a4"},
- {file = "librt-0.13.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3657346f867469e962549435aa05fd15330b1d6a92829f8e27988e194382d005"},
- {file = "librt-0.13.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:791aa18a373b90da8ac3c44fc77544f33fdf53ae403acdce9b39f1c26b4a3b94"},
- {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d6fb0eaa108814581c4d3bfbd068c3fb6757812a81415008d1bae08267cca360"},
- {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:a001519c315d5db40710f2665d32c4791f1d4779fc96a9423fd18d92c8b9ac7b"},
- {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:d9188caac26e47671b52836a5e2a49873a7fc11c673b0c122d22515f98bc14e1"},
- {file = "librt-0.13.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:05d96b80b95d3a2721b619f8982b8558848b04875bb4772fd54842b59f61dd97"},
- {file = "librt-0.13.0-cp39-cp39-win32.whl", hash = "sha256:c3cd253cf32fe4f4662960d6bf7d55cb8be0c31a5d644a4d48aeafebaff3409a"},
- {file = "librt-0.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:b15e26cc0fe622d0c67e98bee6ef6bc8f792e20ee3006aa12627a00463d9399f"},
- {file = "librt-0.13.0.tar.gz", hash = "sha256:1d2a610c14ac0d0750ee0a3ab8548e83155258387891caaca04def4bf7289781"},
+ {file = "librt-0.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:96f576f2711f8519152ec76d0e599243555c1f07679fa73606ca8c8c868c0be6"},
+ {file = "librt-0.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bec3818c7da7c96ceae0ef5915a3d16c52dd08f3ea913bf1fe8568c447c7978"},
+ {file = "librt-0.16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c79520414a3fdfc6aabd7593e6169afa14d5f8d9908d4b498db068868b08dd"},
+ {file = "librt-0.16.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f81b5b19ce748ef68d4746656b7929762eb2fe99269b266e4be07e2ee4de7144"},
+ {file = "librt-0.16.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c71d1b76210a36729fedfc5115069b50a3d8619054745f8758fe5d6f19e86671"},
+ {file = "librt-0.16.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:473eebc7866bb0a0c8849a292b5e7157c1aba5d14d0f0f610c52158d6d964262"},
+ {file = "librt-0.16.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4eb1313a19847089ee81e88742abedf285c60538816640b99742d8534b81d26a"},
+ {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ebefd60b42e2a82b32d136bb5f7c94eadfcd29f772b547df6f3291d1ed855a1c"},
+ {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:6c5da27e8056439f927ea896735da60e616c477a8293feaa3233d4e7781a6726"},
+ {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:67e718c7a43f8db325abbbf1404e2d535f12f8f7a1a82259568385cc5274b82a"},
+ {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:314e703f0c19320dc8094e7a784b9cf29e1b67402515abf580069a6363c0b4f1"},
+ {file = "librt-0.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:943c6bbecbdf7fa575a4f2952fcfd848c88ef95507c3fca411e89d4ac3ff8143"},
+ {file = "librt-0.16.0-cp310-cp310-win32.whl", hash = "sha256:7cc365f006891afb006b52d5ee5ee74c09306ffa20e2f8705a32a4450af2f3ba"},
+ {file = "librt-0.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:0314058469f4d2fd279ce7c62ac274ac82c3918ef7db62ef0697c4c359370155"},
+ {file = "librt-0.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fe4372c52d4849096c6cc1cda2817d293ec51440c890474ed59ef38d46556f18"},
+ {file = "librt-0.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c72c5295a84bd249526da9bdca38f2e176d15c31c13bb0063c5053f4ca023421"},
+ {file = "librt-0.16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be56ba9c884143495b517f23fe794ae367d58cd89ea0fdd6d437e3c024a87f9f"},
+ {file = "librt-0.16.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:ef46c1a29ffb8c72e882e22618ec618778eacd0578fb22c6e7cf9c11d15f357b"},
+ {file = "librt-0.16.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d3c94211ee0c4f8d649ec06b7c115c0ec4eadb873a0e3154ca15cef3f814b071"},
+ {file = "librt-0.16.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94aed6a8308818b91677957d1bd03188869cd7aeb23c5dba7912a6c0402f7602"},
+ {file = "librt-0.16.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:349c0bcb87ebd07481b6ff781e25cdc699723dbe2212e57dabb27f7a13b7b87d"},
+ {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:001bfd59a7d45b17e3e75f2a8c6405280b35e7b84471792778e718c4f368950e"},
+ {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:28e038895b998d7a0c7798922ce8a1dc157675df5cf1c9ef0aca809ed804b7a1"},
+ {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0dbe4096a7ecc00fa835d24510ad8545a4efef738dac96e0e63516783ccde905"},
+ {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5cd5b092441053364af968ea12084692cb9d4a22f3ce9524e377880bf028761e"},
+ {file = "librt-0.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3ddeb3c9dedb461bb457c6c7d9aa7fbf35329da313d1a7543d00c8d0f3473c96"},
+ {file = "librt-0.16.0-cp311-cp311-win32.whl", hash = "sha256:e05108e0849966f53a8d2d3112a7af881d0efaa479bc735bba91108f9f2350a7"},
+ {file = "librt-0.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:5f49cff01bd608ef7d97104cb035c75455e79c2d70bf4a506cf773338ac1860d"},
+ {file = "librt-0.16.0-cp311-cp311-win_arm64.whl", hash = "sha256:1d28ae980ae2218f9c5b95d191e947296f918c9bf0b400d467a9430275bbe678"},
+ {file = "librt-0.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe52bf4641069e7978a14253b036cb9002def1926317e710f2e249f8a8c47742"},
+ {file = "librt-0.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5bcc2c4726ced915b00de0c9856a4eeabfb3fddb93e10e0b8f735b7709358b6d"},
+ {file = "librt-0.16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff7baa55f8e7c69851419e50a666015d02a74198716fd45c0125a2112e0a389f"},
+ {file = "librt-0.16.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:b95d5d92ab83d39e760a52091bb1baba664f3a2351e39b1e16801e5747c2f0e9"},
+ {file = "librt-0.16.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b6d085d70bce51d43c5c7c36d63490770180d8779e71c49305c87b4213918de7"},
+ {file = "librt-0.16.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36e53948e99bbe3ffea257124cfcae1cfb01831555c9a9c903c9f9a72db7fd07"},
+ {file = "librt-0.16.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:54d11f726aae9df5a6ffbbf0a03a52449bbac84a53ef03669cb41cdfd4ae41bf"},
+ {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4323193ac0cd025f85af531df8ba91bf24d1973b401697347a6282e8fd3fcf5e"},
+ {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e42f8e098b9c5396fefa05fb1cc7e33b0e08fc51da106b5de4a45fd22aac6743"},
+ {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:39ec1d5a14e37baf1450a6cabf03fe552340808bf1ad9d71824ab90117716459"},
+ {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d1aabe3925cbb4a08d15b7b20ba4011b53019da0c4173a25155139b7b1baed65"},
+ {file = "librt-0.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:300c3ffdc459f4a779a8411ecb188e3ac0b1ff3a3a7b099642555dedae06c69b"},
+ {file = "librt-0.16.0-cp312-cp312-win32.whl", hash = "sha256:c17194318e4c0c0348b36f36c2ec7534436fe0a4c15582403162a4f08c80797a"},
+ {file = "librt-0.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:25a58a19ea8d83b68209f04912df765e9260635ef77646542ed4b4abe6bc7940"},
+ {file = "librt-0.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7be7cf555bc30ec12622e9447299cc4a9b8ff307548b634794353db0c2065dc"},
+ {file = "librt-0.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c5e6144e68b577f157519f2ba88ca20e3ed61c29b00e5cdfa76cd2d45acf059a"},
+ {file = "librt-0.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:33f41443a1f4e1f099331b3d8120e409fbff84b9760bc1cc9ea496f37ddaa5cc"},
+ {file = "librt-0.16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e510b7770bee609617a3374a96548eb114cae048023e3f049ee449e7ff2db32"},
+ {file = "librt-0.16.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:efc49c462d4516b8a58b00b490078fa64689fd1fe66970cc190131d7afb8027e"},
+ {file = "librt-0.16.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:92caf82ebef5e12d21c72242b70d1e92536f1711cf2a727a4c276de4b4469087"},
+ {file = "librt-0.16.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17bac7f7a16b328fff77e440287693eb017abde913595b5827ebccbc21ecd8a6"},
+ {file = "librt-0.16.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5b976054553670829985ed767feb78fb6bcede0175327c4844dd5c281c1be659"},
+ {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0058f9d68721094105917254c72ac0569117bb7b13b9769cf45d26d89f9d21cd"},
+ {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b7beaf3f4487b7d8adef1f158b49067cb4d5a19fa7a3bf31a4e7a820e435c5"},
+ {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:468df902df016a06eb0e40b0747dc8d14e47d7a38b18b63b1fb167d85cb94d63"},
+ {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:aea7b1f2b125dad5de85f049136651bff256c883c65e6b9209b2da0a1ac3cdef"},
+ {file = "librt-0.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a8afb6557920860b7a3a596eb804cf37e09e7cf8a803db2478c202acc72d8c2e"},
+ {file = "librt-0.16.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:77c7a2b4fe2c1369e0d5aa1cade26740a7b14be32fbc9a5535d617d20065c39d"},
+ {file = "librt-0.16.0-cp313-cp313-win32.whl", hash = "sha256:02d89c813d5ff74b17df72d3a34819d132cd168e56b81bf755b809bd9e46b8c4"},
+ {file = "librt-0.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:14ed6ebe3e4f85f326d7920011ad30ff49ed9334e62cf88caef9ba973d9e3a92"},
+ {file = "librt-0.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:83d4041a3d9b2fd053a8a4e1f22878b3e5833e2712956382d5c048d791454e91"},
+ {file = "librt-0.16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:931a0bb0fcac88f263e269e46eb30ba8e21402cd3c62ca40cb97034c0693fab1"},
+ {file = "librt-0.16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1bc17e54e5305f8d40b7ca203671ff5a9e59c1d0f8ea0f625dcca53a3984de11"},
+ {file = "librt-0.16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:877698bf6bca5721d8be345f2fe09778e40ecadea8b58c73075f2b1a53666bf2"},
+ {file = "librt-0.16.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5981c011b306781ce561e18e14230a14524a3d8109b97553666c942c18f31a96"},
+ {file = "librt-0.16.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:afced3dfc17cd805ecf7a3d77996a71cf5f2c75aa66eb0c21a9930f4fc992f86"},
+ {file = "librt-0.16.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca8052401c55d7511dda6760719fda7618067e83535d7d0010096d216c34b667"},
+ {file = "librt-0.16.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1e511762a074005bb0aa569166779834e75e438370226930d0ce1866d4b6a33b"},
+ {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f1e8591bd8a5a628cd7f07954c6a1592359a878bf032957a8e9057a41d644311"},
+ {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4aaefb4ba6c07e1aeebb2795c8958148f1d6f9af3b555b53d23d766edb6d67a"},
+ {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:d92db7a0f6aee44f1baee94750457e8d2d1c6ccea41842de6268d34e8dc7eddd"},
+ {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:378dfaffb38e59c24a87cde5713cd865d51ff7383fa12947f3907f306ea1ca55"},
+ {file = "librt-0.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3e0c39bdc85370422e8b637be76eb1fd07d30967551b03e62267dd156f553152"},
+ {file = "librt-0.16.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:1b384b90ab79a7bc30b566895809a636e0666f21f3cf12b54823d025b7e83839"},
+ {file = "librt-0.16.0-cp314-cp314-win32.whl", hash = "sha256:52327da75a94012e7f932f913d20d3876bed3c102be00e6c3e8600ff7bdd58a7"},
+ {file = "librt-0.16.0-cp314-cp314-win_amd64.whl", hash = "sha256:3f0b8114c44b2ac06ff5dacd08e07e8e807ff4f46083f2a1602685122559be41"},
+ {file = "librt-0.16.0-cp314-cp314-win_arm64.whl", hash = "sha256:8caf96a4ef8fb27d0ac0d1ad8337d26a240acd4a02fe4345d0a8f264753e8f99"},
+ {file = "librt-0.16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:953107e2f68d0f3512c48f898b0dbf0ce5cc52bba0f318d847c985dc555ee4cc"},
+ {file = "librt-0.16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad37d5b9abd49c9a655dcda7ea52a8a752884062ef1ee71ae17c2f2a0f81fe6a"},
+ {file = "librt-0.16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c4aa329c17bd1aaea4f6e89335d8ccd494b3a5830b6654462273e50e11023f0"},
+ {file = "librt-0.16.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0ead24d2562a49473dddd9efef8581f020007eb0054389c3ee3ffad38b1ca4c9"},
+ {file = "librt-0.16.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02118f56a9c36ddd07dfd9b919d9ecc117ba20a90987d56aa4c429fa34509188"},
+ {file = "librt-0.16.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4e29522c62e28595ff7e324c6834ade51127707f0e255b18d1c1cf03d39c1048"},
+ {file = "librt-0.16.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ff4b2367926b69c6215635902cccb04048e73094e9862900d27cb2c6bbff143"},
+ {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c6f1b27bf1632a7e016af9f145f82be95e1edd7721a646505c21059257cb5a04"},
+ {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5696d7f52e7b37217cb3a8f92c744fe835942602fdd4c1a8bc4741d3bfdce15e"},
+ {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:6072e92dd876ff6ceeb6cf371e35e51f479349837391341f479b08df4564242b"},
+ {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:39ca4f2f2fe05de8e63493da592d84311adabe5bef52b193851981da9816b302"},
+ {file = "librt-0.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9807485a908f00355820f18e91e045ffdcdc5adb68aaec40a1e2b88c5f7bba1"},
+ {file = "librt-0.16.0-cp314-cp314t-win32.whl", hash = "sha256:94be5cb7bca4df6201f4183e9e4fa2086c655283d20b38cd84500a69057575a7"},
+ {file = "librt-0.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d46ca272b251d033dd4527b0dec5f261a28a52bd5fa0f99c117b0a1f8588cc2d"},
+ {file = "librt-0.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b9d6d4b14e92d876f8026b54c20c445f36425214c1081dc76f74e40db386b82b"},
+ {file = "librt-0.16.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:6fe436af2eaf630474f491af5d032cbe45f93fcff5c3b9fe4ab194a7255b20ff"},
+ {file = "librt-0.16.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:8ff5d26c529336be9bd7ae04483235d77778ee7d6444a95353102b542601ce81"},
+ {file = "librt-0.16.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:909d8e3c1faee44cb762b1c519ff8613dcc5ceae5c99987a00917b5a31fd1d6a"},
+ {file = "librt-0.16.0-cp315-cp315-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:6d4a64283ee61824b5790de882bc68e2d9d7a5143537cb7a966f7354f71646d4"},
+ {file = "librt-0.16.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5810ba811297fdf37a1531a57667cb8ace0842013ca8606bf9eb7c24cf4be154"},
+ {file = "librt-0.16.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e56aaf8c167548dc8e5d6f3bd0f48dcdd299a23c73be3f744aab79d99e9c7f5d"},
+ {file = "librt-0.16.0-cp315-cp315-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f36c58e33b304b525c6c9c5076399c6ebf1109e17b9051a05a407b091b9215b"},
+ {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:242e00b3d4fa37c3d3c1ca5f5c9adb7d909ddb1eac9c41f2787320d00caa0af2"},
+ {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:0253721561787b8df8443eb347b7a6461015354e5bdd37ee38a41fef220d2bb0"},
+ {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_ppc64le.whl", hash = "sha256:3e483a8d69ede8067db70c0e83007423b6925de6fd53afed01d66160f2e9398c"},
+ {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:69ba927445cfaaffb4081003ef5224c55a5c2ab67ef956f416ef744916e44121"},
+ {file = "librt-0.16.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:d6a365f2ab45a984d0e00eee0dd17f599ceab8cadab6ea07b6111c8132fc0e42"},
+ {file = "librt-0.16.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f01f3805f2dae4781c0c34b440e31740d082950bdaf89a6f601ad589a28af57a"},
+ {file = "librt-0.16.0-cp315-cp315-win32.whl", hash = "sha256:b0e3e721c75d2e79a76d4422c79d7ba705fe1bbafec907037fe7a657a480a0e3"},
+ {file = "librt-0.16.0-cp315-cp315-win_amd64.whl", hash = "sha256:bc02954b1295de798bbdb0b4e2d8a28c2117de8b5c73dcbeb27dc32572dfb971"},
+ {file = "librt-0.16.0-cp315-cp315-win_arm64.whl", hash = "sha256:c5db585d43449a5f54303d4b2774e45e1babd975cfe1630a3d708c0b80c3e560"},
+ {file = "librt-0.16.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:f06c689cb14afd9b612727553a5ec5a40febf113ca41c4413a2b0b334285884b"},
+ {file = "librt-0.16.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:13b4e8aba90b0b1c82474e9844aa9ffe7ad3faa484350e1da64cb8188d903134"},
+ {file = "librt-0.16.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a269c46ae327d8e6f8c1f85f7516cb52c0fa48127565a1105a4f4a05ff2a0b4"},
+ {file = "librt-0.16.0-cp315-cp315t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a33e0dae1f8592146a4764d54ce842b278732d21a84e17c3bbe6b1bc158a2248"},
+ {file = "librt-0.16.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:47ada6ea32636492c61aa8ad27ae3b9404bfe7a97e3ba946d1984236cc741da0"},
+ {file = "librt-0.16.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43bd6e642d8a248c114327f98dd25ac5a7cb5aa168ef02f0559b91874df16b8"},
+ {file = "librt-0.16.0-cp315-cp315t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c3d1bb7841a816ace6449bb26d3f9560dbfa20e71c568d23f0f62bf1e68f50b1"},
+ {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:3931f7a3db322e7f44e02a280e3949326ce9579ad388ee8d691dc7c76da9fb70"},
+ {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:f4462528b6000afe8f16907b5c7c2553abf1df005ba5140e6eb394541c3624c3"},
+ {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_ppc64le.whl", hash = "sha256:80039ba9b6a7d5f1a0175a4cca6bbefead87bd854c80abad1cb30afe47a830db"},
+ {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:7a1d272724b581bb6bc769dfdafed6da2ecc9886ba2450311de55a4ac2e1e9cd"},
+ {file = "librt-0.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:fbe4fb8c5445f7496d7f7f6bb0807875d09d47e6771ffa175fb2df2895fb86ba"},
+ {file = "librt-0.16.0-cp315-cp315t-win32.whl", hash = "sha256:375bfe6b572a8f6cfc398709356046173bf27e64c4c5edaf5f7062f051fb4bf9"},
+ {file = "librt-0.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:bd3150023d3dc2bc70f3784e59ffa1140d56ddba3d8125b3d6f9f85221279bfc"},
+ {file = "librt-0.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:8ceafb70f2a4f0826f11031942e59c0728fd98da112dc346d4352bde1e486866"},
+ {file = "librt-0.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e1967e36ac4cae0c7e9615ad32e1a513cdacff79f9e8afb28bedc91caf48b4f3"},
+ {file = "librt-0.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:20fe0bf9053885e21c62b3e091fb5e73e1c54d1daf2e70eb388d70763bcd4220"},
+ {file = "librt-0.16.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a63610fa76524edfa605b5b259a603915c7a6e10e54f003e5503030506e81de"},
+ {file = "librt-0.16.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:845a511b60ca43b9880dcc84a9784c891d6a2098c829130b320846c69c9c0c68"},
+ {file = "librt-0.16.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d608f0bf3b8cbddd0067fe02cb8cab7d13e8eb9386b23a1843d4363044fd9e22"},
+ {file = "librt-0.16.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df183721229ae51eef90108c115b43e98cb169b6155d34480338e5fc6616df00"},
+ {file = "librt-0.16.0-cp39-cp39-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b6183e2e2e0ee00aac2ec07c7f7d151c97e85666b304f574b71cff0f9fccc4e"},
+ {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:273d00be33792a15189331df10f1f1331621b043881e66c6c4377f7f776e1291"},
+ {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aa9357a1b4d4fc787bb718a59cb1112c28c8a976d6bfa268b71cc0a4ab8f3a94"},
+ {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:e9ce0bc440e7fd09b5f51f372f0f6640658f854b8fb05260f819cc669c93c42d"},
+ {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:6c8893eae2fd13c5488d94056f3e6e5cf3142bfb1c4acaf136cb33d760c5964b"},
+ {file = "librt-0.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7393c9a48dcce4817dbd4b0d8ff6237efe9b0a0609f5b0adaef315f8541726b5"},
+ {file = "librt-0.16.0-cp39-cp39-win32.whl", hash = "sha256:71b93b42784e25b975079573c642a8fedb049a7bb31d70a51721b1666b3b2ced"},
+ {file = "librt-0.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:5750a105b42a416f930edc59054927a406effb2550cd5bab92ad7a5842ed5d05"},
+ {file = "librt-0.16.0.tar.gz", hash = "sha256:ac38d6d8d66bf3d744148dbbc0b8e193e195a51e364ed55e224631f5721891fc"},
]
[[package]]
name = "mypy"
-version = "2.3.1"
+version = "2.4.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "mypy-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:57a936373fc690c43a8cd7e7e12a35148e4ec5aa7698ad7fc0a9f918bdc5be41"},
- {file = "mypy-2.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d00d769056bde2f4e69c175071eba45cfb44fa1ed92bdfbfe64a93e0543b0cf0"},
- {file = "mypy-2.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2166b29228835e1f88ff411e96639e6ca3c7fdde84b62ec211f70f86b4051167"},
- {file = "mypy-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83d36c2924df7426333abe7faf4724a7e1aab0d9fd41625e81b4683034b80c13"},
- {file = "mypy-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:f12fdb70459d0060dea40b29e52163a961b156106d68d57882a6a9f648983a53"},
- {file = "mypy-2.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:e099200a1b1b1223a4951f0a90cbff1b8c91b250ba599dab1f7217a628144d90"},
- {file = "mypy-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94f04929f1c44c35fb0061e912087edaf504acede963a4a7d00680bd089d8531"},
- {file = "mypy-2.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5d716048611e85ca9eefb2e1baa5d73ede389b5820ded260ea27c757d667af8"},
- {file = "mypy-2.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b091a455111214cb5c9d54a57b9618e9a49f9fe2a42e4e1ac86e9d104ed96ce8"},
- {file = "mypy-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df12e20c9efd614738c71b390007ecd0181125afc4ccafca04d78a1d2eed2c01"},
- {file = "mypy-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:52eaf3a155f35cf80b40220288c861eb45f14a2340c1f6cbfbdb0feff32879d1"},
- {file = "mypy-2.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9b4eacbee8a69836c06eff6d0dd4e134a07c2b047755b30c08625fe214f322c6"},
- {file = "mypy-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a32bbbb940af990d3be0b8af321c7b6815bb1b3b48142fe7459b9cc5f58959ff"},
- {file = "mypy-2.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff715e45b2231a8e85de1d163d1b42791e4d7aab8f5145f85fee1b710b735aff"},
- {file = "mypy-2.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:858fc57d3d91fa728e33e7ad71def60fc6272694607b306cd3292db53ae39080"},
- {file = "mypy-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:851833db876e7b650f93719c74b7879a08e338979c96054fdfc3bfd90a486355"},
- {file = "mypy-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:4c5095a327483591c94e0c8d3ef9e50d4ab1369b541eae007c1f23bc2a41f6bb"},
- {file = "mypy-2.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bbfe022634a2a195406bd469e888d2eaf193b02ba7e607391cd7640374aaae3b"},
- {file = "mypy-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:114dff494000f18bd10d5d95d84b8567b26da60279ecbe838131841df20e635d"},
- {file = "mypy-2.3.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8637731bb5eee3671eb2c3200827aa3564ed8a9309ecee4d1afe77e6d031bdb"},
- {file = "mypy-2.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c80fbc405ed8020f5ff3802dc18cf060197bcdd3fbdd6a26ef2fd34dfdd5226"},
- {file = "mypy-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:84081f538ce27375045c02e3d7f81bd11d853400621ae245d87ce7b6c420ec74"},
- {file = "mypy-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:e9144ac16fde007096f9563eb2041b4433c2d705c4218edeb79e7e9d01035ee6"},
- {file = "mypy-2.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:77ad9529e67dca28e511f5cd5671436584ce91f6d3bac159a353158187b986ac"},
- {file = "mypy-2.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:192abaedf75da1bc0b1cef104927e70ec49c1ef0031cc4825c7ee10a438ed24d"},
- {file = "mypy-2.3.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf678dffd16efcda2c15cbd30e9ecc0081388e29ea23687a88e686ed92638dc3"},
- {file = "mypy-2.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e036f06b41630f4c8a1d48f9ac6aa26acc65f8be089973f5519da643318f03f"},
- {file = "mypy-2.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71af9c8a894e862b58e92abb08e53b05a384a1e5e5d6dc7cda59126211a53d82"},
- {file = "mypy-2.3.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:3c80cd23d85368bdd9f37d5231dfd97d35bcbf5bf41af96ef3a9b078ad1957f9"},
- {file = "mypy-2.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:4956f34d145e145562a0a0bf367f642bbc85c04ec2baf47ae015947c3169a85d"},
- {file = "mypy-2.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:cfb12e360242d23d91f5e978d94f58ea66acf5804c4fb6f2f794a20d4cb1b595"},
- {file = "mypy-2.3.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e5f1c50bb05b64e2026b52867e8d21106f01313c744a2c4ecc34c90d12e8d6e2"},
- {file = "mypy-2.3.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:667196b352f4cf304ded4c10f90cfc179263a1acfb3cdcfa984bdfd340d498bc"},
- {file = "mypy-2.3.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b9c53e395c12cad2c6d4b67d5da7c6057638a132d85c08b73646b18f802a0045"},
- {file = "mypy-2.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:18162b128c3f9c703cd35f5537446900b0d21a2549aa7a95d21380d2ef643fb0"},
- {file = "mypy-2.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:30c0477d4aab7b7f39c8397dc877f2c96b9fe5588ec379f372c56eb63d599f63"},
- {file = "mypy-2.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6941ab3619377bc3f32ca02876b07d27f216f5201604b664d3937ea0fdd23bb4"},
- {file = "mypy-2.3.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:6f041a6de52c9217ca125e78ba0a335cb7fd98a1c0580978e49ab2b126f70b57"},
- {file = "mypy-2.3.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5159ae60f5dbc3a498af5ba8365505808ac8031bc63f9e00304ad545d40bdd9b"},
- {file = "mypy-2.3.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47a8a7a0a7f6f6e63995c0ac36fa0c07b127413fdc81f0439b7f3dccafd33561"},
- {file = "mypy-2.3.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:2329c0501293d4e1f33bc15d04d6304d65a1cdda967ee93a05c1e681a3923133"},
- {file = "mypy-2.3.1-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:bb26deed807bdb0457cf3e3f1cd7c4a1cf9d66864eaf1b4a61e06805d4c6b1f9"},
- {file = "mypy-2.3.1-cp315-cp315-win_amd64.whl", hash = "sha256:375d7013876a8233b2d05be185bfa09f689696cd999ce8b1cfe6acac5c80e8a3"},
- {file = "mypy-2.3.1-cp315-cp315-win_arm64.whl", hash = "sha256:586b3612214cceabb3c0f588c97e7d1e535393f06a60e912e994f6b3ace97523"},
- {file = "mypy-2.3.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:ef0c6335cda9d807f8193d8ff6204a72bc909fa9882aacbca14f43cdb7188306"},
- {file = "mypy-2.3.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e598c8c66401d26b150872154a286e6d484cf2789c3bb28a7556806298423021"},
- {file = "mypy-2.3.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eda22fd4efa9dcd39331d1dede9b5b8b8a7fd69af07592e778433da98610d29e"},
- {file = "mypy-2.3.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:2a0ba2e57847849fb0d1fcdabb32786d223095ed8bc121dfe322bcdb3d9c46bc"},
- {file = "mypy-2.3.1-cp315-cp315t-win_amd64.whl", hash = "sha256:3f7e865dd51f235f60a2dbcd8728a1c095f5ca28f095d48a725b84cd935735c4"},
- {file = "mypy-2.3.1-cp315-cp315t-win_arm64.whl", hash = "sha256:8ad80807dc3ab8ea978b1b2b6e4a657194ace1d4ef03e0e731aff1abd517da29"},
- {file = "mypy-2.3.1-py3-none-any.whl", hash = "sha256:6ed5c7e3419083268e5c9258bd1c1ef91af44a9e89374dbcaf37b775716e72eb"},
- {file = "mypy-2.3.1.tar.gz", hash = "sha256:47c1b1207258513a9d93495f69c8be9de73916186f0e52703e8c461b7a623419"},
+ {file = "mypy-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffda5244fd1ad71a1e54405e35f50d09b80c3978efa120f58bd1252ae32c62d2"},
+ {file = "mypy-2.4.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:615b03922d40e186fd1df73156473db0ba525c639bb4fd1cf28e1694879c9b23"},
+ {file = "mypy-2.4.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13fa24f439c0e48a290a3922fa14ccd22f2762bae99d2142931b3e40a9055080"},
+ {file = "mypy-2.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3adef556a19eb3b630bf86a79c29d7da3d61e541472d0d897ca01b171c0abf8f"},
+ {file = "mypy-2.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:1dc0f64b0a92ae27a49d2175f0bacfa56e15bdc5b420cf92e0c1f79292219cbb"},
+ {file = "mypy-2.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a378fc15fb33e321f04652c166ce73eeb8833a97c3d218132844e938cd93220"},
+ {file = "mypy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5d20e6c7c35fcbf2a0ebdd0eaeacfbc243009dfd33ab7822d54e213912e6dbbd"},
+ {file = "mypy-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3011537be6cf1de4511c0255a324362a812b58184bbe61e15f59c8b31033bd74"},
+ {file = "mypy-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a96b07a49b7b1d025ce59c1b3acbcf24bead9a83da4523c4a6bde1bb94e7a0e1"},
+ {file = "mypy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7c4f8f8d1d1c0e2832d8ee7113dd08f6df6c7aad9e863fcbed9f25832be0b8c4"},
+ {file = "mypy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba05652540bf12828e52abae807b024b09ca144ff4f75e2450a81d69c376425b"},
+ {file = "mypy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:6306086b87cf7f8a29aa618d9fd9bffb56c59247166b9660fdb54d86d7714ecd"},
+ {file = "mypy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e05ff2925d8b37ad26c80c1b9dc43ae5d455da2df1e23c24c095a6425917c57e"},
+ {file = "mypy-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29243242cf72582b65f9582ad9e56e8cb281566ed3519f4cd70bb8b9f2977e90"},
+ {file = "mypy-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29eb0b9427a6b11b992e452f6cceb8af724f4dceb47e779d0b35e405e996ea5e"},
+ {file = "mypy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e3ebe2f72a2a1156065a9851570ffbf50c0a93cdccadef9c6e05c508a4fd10b1"},
+ {file = "mypy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:236e0d68f6941992b0811128e652590f590db444ab29ad8f1324765b9298b946"},
+ {file = "mypy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:82d0f94c8587ccb472622ee7795280aaa38a06640d5f45b3f16909d6dd86a989"},
+ {file = "mypy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7da85fbcff6dac1abcc636707bed38b45598131fb7a605d9719c70b5cc733af8"},
+ {file = "mypy-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4209da39d85cf240f762af622d8180fcdfcb4727d021f44ade62d613a1a43324"},
+ {file = "mypy-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be721bd4bd57576193653b75b4af3461c9d0bf7dd8b528f782e9be210dc75bb"},
+ {file = "mypy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1fde197ae65be856a034a91b70ed747a16562ca69577785f06c661548424bf1"},
+ {file = "mypy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:295ecf2e57542cd836ca537486951289678c8c7d1ee6ad74ebe29b2168a003cf"},
+ {file = "mypy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc378bdad4e9f12b5bd96466083d1e71acf00594ec9c7b2bdb5e02816f77f303"},
+ {file = "mypy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:058165f564ccf559c68c70fec2091fca5891110480210c22594635e3f6683437"},
+ {file = "mypy-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9fa247e02b505a45a2775f69df38d360d197e3790bc60f717595db9eda358b6e"},
+ {file = "mypy-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20e9a5cd875837520c43db98dea0b6d0c2197833d95c30127d8f570fb9b1f00b"},
+ {file = "mypy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9f03a7828cca2b0adcd6662aee8f2711ff8830e1027641fdea3ab0b787483566"},
+ {file = "mypy-2.4.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:9279488933040b638c0ab739084c0ca100efeea6db581bf5d7628d8e89de53fe"},
+ {file = "mypy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:2106b55105ba5ea9be4f53a24517fc5fa927ff1585edc9bc1a975abb72caef89"},
+ {file = "mypy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:528c8744b8b5e3ecb8774f86af38d2376216816e9908317ad055f3c9c2d74799"},
+ {file = "mypy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0bb95cf34899e4619c61ab0a8667804e139e580b30d5df12af2102dfe44d0c97"},
+ {file = "mypy-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86d616fe84c6eab8026f8c50ab5bcb90db780d2ccd233d971e34e92bede9b359"},
+ {file = "mypy-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3f86fd1313dd69d013e265f1fdcd12ea7a9d606f9875b2a3db946cd334555f3"},
+ {file = "mypy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:720434d48542ecfe84d32d287b727569d3fc8f5769acd39051130e490a5c295c"},
+ {file = "mypy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:a6e851b82c0661f69f1630fc16172c68787a6a9cf0991e7c6437d60976cdcd76"},
+ {file = "mypy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:3bd0e340f0ebe65c548210f53be3fd8192e83964760caf0c28bef368e68b0d37"},
+ {file = "mypy-2.4.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:afa89837d9be67e0cadfa33bca3bb7efdda98c3b07e74dc3b635ebfb1c8a926a"},
+ {file = "mypy-2.4.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb443e81057896132d3642d6be219e6efd158691ac7883e3ba8fcb469865f05d"},
+ {file = "mypy-2.4.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7f38f57d344f8b6accb40e01c3d83cfc590498231724d16c07ffb7940f157818"},
+ {file = "mypy-2.4.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e76172710bd4e5eeae061abfd68347e5264632e02778be61784671ae3a2132f5"},
+ {file = "mypy-2.4.0-cp315-cp315-pyemscripten_2026_5_wasm32.whl", hash = "sha256:f83353e47ab520bf6fd4df8f5897d9fe081211f2fbc4b7d37736a3e3c166cbcf"},
+ {file = "mypy-2.4.0-cp315-cp315-win_amd64.whl", hash = "sha256:970b221ed5842213d98e3c480c08f795ace4b1f81fb21e1b126bd0476bce1c34"},
+ {file = "mypy-2.4.0-cp315-cp315-win_arm64.whl", hash = "sha256:502b94b0b331f7dafe32fd6b151797ddbb4f32385b362e722c783a025e5954a3"},
+ {file = "mypy-2.4.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:c9de622fd397495695d0598ddc789222bfcfec9d7c9ec3a1e385c855e3bc5e01"},
+ {file = "mypy-2.4.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f459f0b4f0596d9d51fe7716b404b35287b99e77da98a7af90a65dd5fd61141"},
+ {file = "mypy-2.4.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9b028548b3af480e2b1ed8df14ccaac86f99c9f600d1580770ab7ba3dcd40f0"},
+ {file = "mypy-2.4.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:cb734b2668c1f40d07ce093bbeb4407e9527c67901627b0e1679825be3f09975"},
+ {file = "mypy-2.4.0-cp315-cp315t-win_amd64.whl", hash = "sha256:172e30b8fea631fe310f0c665477f52d9ea40bb4e99e0c81dc30118563b13710"},
+ {file = "mypy-2.4.0-cp315-cp315t-win_arm64.whl", hash = "sha256:5786ef987b3767e51aaa53f20aec104c0252b42ecda7aef8e8b4cbae279b05c5"},
+ {file = "mypy-2.4.0-py3-none-any.whl", hash = "sha256:d01c5d26a352acc6d5cf3128225477e1e8465e8d3029d4c345807fbf7f3cf093"},
+ {file = "mypy-2.4.0.tar.gz", hash = "sha256:77bdaebd452f43fcfc4cc3ba94352a3ea537cd01e3f2d0879f48673d2ec00d6e"},
]
[package.dependencies]
-ast-serialize = ">=0.6.0,<1.0.0"
-librt = {version = ">=0.13.0", markers = "platform_python_implementation != \"PyPy\""}
+ast-serialize = ">=0.11.2,<1.0.0"
+librt = {version = ">=0.16.0", markers = "platform_python_implementation != \"PyPy\""}
mypy_extensions = ">=1.0.0"
pathspec = ">=1.0.0"
typing_extensions = [
@@ -689,30 +757,30 @@ files = [
[[package]]
name = "ruff"
-version = "0.16.4"
+version = "0.16.10"
description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false
python-versions = ">=3.7"
groups = ["dev"]
files = [
- {file = "ruff-0.16.4-py3-none-linux_armv6l.whl", hash = "sha256:df4075f71ddac40b9934af60c3ec8a53047dd5a5fdc43224e6e4e8e9a27cb6f7"},
- {file = "ruff-0.16.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0c95538517af68004306b0fb3214ff2f2af67a65092aee77cd9eb86db6656604"},
- {file = "ruff-0.16.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:963f83df8e69e575b64d67dd447ebbc917db41a14bf38d4593a4183e7aaa8255"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a5057c7ff3f6e6480a48fccfb3a412a690f48a3d03ac5cf08177d6c2da3ade"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3dce8d9b0c57c265b91885a66a567d8ea1372e8eb4e250fa8e5e3f579e99cff"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7dc651db49283c69f8e72c834eec4fe5573e4c646856aebece0ce385dceb2a80"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3817b87dbcabc92f13b05019257c5b89b5b4d51b5fb20f56fb5235ceb723cd07"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9fce1499134b2c8c68e5166f95705a5812062bb93aacc5f9873bb1a27084bc7"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d812e482f5a7e02eee26cd73d2a37ebbdf47d795ea63ba1b89110ae93e9fb3"},
- {file = "ruff-0.16.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6baaf984aa7976edf93d3b627fe2d1d22ee94bbca05fa6f90fc76d73924e3454"},
- {file = "ruff-0.16.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bdfcf0b28662eb890372d50f92c283bb94e67e7635ed93c7fd533970acff7b2b"},
- {file = "ruff-0.16.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b66b02cb9b04f537643cadf5768e5f98dc461890d530cb67113d71c8c76e605d"},
- {file = "ruff-0.16.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8528bf9a4b291a60bf02ea453511e8ce6215bd2b982ee80405b66b008b6c30a0"},
- {file = "ruff-0.16.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fbd85d2875fdd67e833213a651f613bbf25303abf6aa822a5121f4531195678d"},
- {file = "ruff-0.16.4-py3-none-win32.whl", hash = "sha256:312769988007aaeb8e189b443ccdd03c0e6374489e053467be6d96518ebff76e"},
- {file = "ruff-0.16.4-py3-none-win_amd64.whl", hash = "sha256:05d9d27a18c4bcbefada602480ec9e01e0bc949d432e0ced5df77edac195919c"},
- {file = "ruff-0.16.4-py3-none-win_arm64.whl", hash = "sha256:a3a61621c9b6f6a89573e938a080e648f1695baa3f58570a3a707bc51ff65a21"},
- {file = "ruff-0.16.4.tar.gz", hash = "sha256:13171aa9d9af2240ee3504e639de73122c67e74036de5ba2e1d01422cd17e3dc"},
+ {file = "ruff-0.16.10-py3-none-linux_armv6l.whl", hash = "sha256:488b0fe3f3574210e5cf80d9f59b9e3ab17a127a8155de3f307b392589cfb511"},
+ {file = "ruff-0.16.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e748ff95c934c4e978783b8e687bc174e7bd84e8ad24e3243e1ecfcda5e0282d"},
+ {file = "ruff-0.16.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3031a4a2e8e7b8a46f70be45f198c35a11ece509a94b80334d8d397a33c67550"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:494401c86df4c4c25f69b9419605d944467ee98c42fb6ad405ef4fa40b8fb67d"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d203abc0ff2b773ee33d00ab8df0bb67046fbc7c07b119332f08b9b345cf8221"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd83d1235a5258d318477bc5b576303974cbdef5df0c01a1bff14efcc23bd12a"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc2610fb269fa56dd8a68669ae470fa6272902668c0fc2ebc3aa112b2633d5b8"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e70175e29cc94c26ea296c80e470180b744b7419026898e58f520c6ab32578e"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f33f43a864a8483eebd160e713336c8bab02c934feaff0a33cf5ccb41546d09a"},
+ {file = "ruff-0.16.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1dfc6f0088149fb6a362c1c446bcbb3fd2157b3852fe2fa68409276eab9ad9b3"},
+ {file = "ruff-0.16.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6553498afc35f580f036030795810b9e6bcea31604b0fd9e8d352795473042e3"},
+ {file = "ruff-0.16.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a3b8471dea115d37f123882be852bed13403746d3a76c11de4a19ec5f9ff5a03"},
+ {file = "ruff-0.16.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:92e59a70bcbd9d3a5483656da906ec28edfdacfce00afd99edb8b4e9d15644be"},
+ {file = "ruff-0.16.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7ae7375f803b5520dc9f546bed7e3a0acb70b91812e9bb4b19927de22f25b77d"},
+ {file = "ruff-0.16.10-py3-none-win32.whl", hash = "sha256:2a12e01cb9156c10c466f63b46eaae5ecea28dfbd21b5836353ae498e7d1349a"},
+ {file = "ruff-0.16.10-py3-none-win_amd64.whl", hash = "sha256:97f2015c92aa97105b0eab19eb5d224884399281cfc5da86a92db4ab5e7fb2ca"},
+ {file = "ruff-0.16.10-py3-none-win_arm64.whl", hash = "sha256:25a65fe998c4e6861ec079ada5826a2fc605e6cbccbe9dcd7fac1f54e791621b"},
+ {file = "ruff-0.16.10.tar.gz", hash = "sha256:eff4728c4eaae93f0955cd264d24b2ab348e74bf59986ccf282ba6dc16b3b017"},
]
[[package]]
@@ -729,14 +797,14 @@ files = [
[[package]]
name = "tox"
-version = "4.60.0"
+version = "4.64.10"
description = "tox is a generic virtualenv management and test command line tool"
optional = false
python-versions = ">=3.10"
groups = ["dev"]
files = [
- {file = "tox-4.60.0-py3-none-any.whl", hash = "sha256:175abbc4cdef615d66874c0843be4f44c353c14aab6d89939bb22246f84122bd"},
- {file = "tox-4.60.0.tar.gz", hash = "sha256:6f93bb580d35e00fc69cfec1116eecbe21155f747753ca5019374f7c69b2eac9"},
+ {file = "tox-4.64.10-py3-none-any.whl", hash = "sha256:9f0bd51c4fe770b682d0c9540842efc07bd98c302cc327986201169e319de669"},
+ {file = "tox-4.64.10.tar.gz", hash = "sha256:7482b96fefe1e4b49e406a9a62b25b415690bec2cebe9cc0cd59e38af88ce671"},
]
[package.dependencies]
@@ -801,4 +869,4 @@ python-discovery = ">=1.6"
[metadata]
lock-version = "2.1"
python-versions = ">=3.11"
-content-hash = "421337ee55e216b27ca6e3ee8f0e4023864daf53a3d55db7b9a7dfc319278c1a"
+content-hash = "202896408cc529c760b2878348fcf34b40c6e38718db7948f52e5f6ebea0db7e"
diff --git a/pyproject.toml b/pyproject.toml
index 3ee2d718..d36e462d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -80,10 +80,10 @@ poetry-dynamic-versioning = { version = ">=1.10.0,<2.0.0", extras = ["plugin"] }
[tool.poetry.group.dev.dependencies]
pytest = ">=9.1.1"
pytest-cov = ">=7.1.0"
-ruff = ">=0.16.4"
-mypy = ">=2.3.1"
+ruff = ">=0.16.10"
+mypy = ">=2.4.0"
pre-commit = ">=4.6.2"
-tox = ">=4.60.0"
+tox = ">=4.64.10"
types-PyYAML = ">=6.0.12.20260906"
From de6186c9e0e41fb5ffb8c32f90800b720fb41180 Mon Sep 17 00:00:00 2001
From: Erik Schaareman
Date: Sat, 17 Oct 2026 16:37:08 +0200
Subject: [PATCH 9/9] fix(migration): preserve prompts until replacement skills
fully resolve
Reject unresolved rendered replacements and inspect installed content when an unchanged skill is skipped. Preserve legacy prompts and manifest ownership until regeneration produces a usable replacement.
Add six missing-partial regressions covering install, update, skip, dry-run, and repair retries. Full quality gate passes on Python 3.11-3.15 with 708 tests and 100% coverage per interpreter.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---
...retire-prompts_skill_migration_20261017.md | 5 +-
docs/user/reference/prompt-migration.md | 11 ++-
src/vstack/cli/init.py | 19 +++--
tests/vstack/cli/test_prompt_migration.py | 74 +++++++++++++++++++
4 files changed, 101 insertions(+), 8 deletions(-)
diff --git a/docs/changes/retire-prompts_skill_migration_20261017.md b/docs/changes/retire-prompts_skill_migration_20261017.md
index 0f2a1aa5..3b223fde 100644
--- a/docs/changes/retire-prompts_skill_migration_20261017.md
+++ b/docs/changes/retire-prompts_skill_migration_20261017.md
@@ -28,7 +28,8 @@ their manifest entries behind.
- Reuse existing skills for overlapping workflows.
- Convert unique workflows to manually invoked skills.
- During `install` and `init` with skills selected, remove unchanged legacy prompts
- only after their replacement skills are successfully available.
+ only after their replacement skills are successfully available with no unresolved
+ template placeholders.
- Preserve unmanaged, modified, checksum-less, unsafe-path, and unknown prompts.
Report why migration was deferred and retain manifest tracking for retry.
- Keep legacy manifest parsing, dry-run behavior, and scoped installs intact.
@@ -62,6 +63,8 @@ their manifest entries behind.
- Reject unsafe manifest paths without accessing files outside the install root.
- Retry a partially completed migration and clear entries for already missing files.
- Confirm dry-run leaves files and manifest bytes unchanged.
+- Preserve prompts when a replacement partial is missing, including install,
+ update, unchanged, and dry-run paths; retry retirement after repairing the partial.
- Confirm CLI rejection of removed selectors and valid output for all four families.
- Run lint, type checking, tests with 100% coverage, and source validation.
diff --git a/docs/user/reference/prompt-migration.md b/docs/user/reference/prompt-migration.md
index 47328747..26d9039a 100644
--- a/docs/user/reference/prompt-migration.md
+++ b/docs/user/reference/prompt-migration.md
@@ -57,7 +57,8 @@ During an install with skills selected:
1. Generate and install replacement skills using conservative install rules.
1. Inspect legacy `prompts` entries in the install manifest.
1. Remove only known, canonical, non-symlinked prompt files matching their stored
- checksum and whose replacement skill was installed or verified unchanged.
+ checksum and whose fully resolved replacement skill was installed or verified
+ unchanged.
1. Remove their manifest entries and empty prompt directories.
No `--prune` flag is needed for this targeted retirement. Other obsolete artifact
@@ -80,6 +81,14 @@ untracked, or merely adopted, migration is deferred. Resolve the reported confli
and rerun `vstack init`. Review and migrate preserved custom workflows manually;
vstack does not delete unknown custom prompts or scan directories for ownership.
+An unresolved replacement template also defers retirement, even when the skill
+was installed, updated, or unchanged. For example, a missing partial can leave
+`{{SKILL_CONTEXT}}` in its output. The unresolved-token warning and deferred
+migration are reported; the legacy prompt and its manifest entry remain intact.
+Restore the missing template input and rerun `vstack init` to regenerate tracked
+skills. `--update` can skip an existing skill at the same template version;
+such a skill does not permit retirement if its installed content is unresolved.
+
Deletion errors are reported with a nonzero exit code. The prompt's manifest entry
is retained, so you can resolve the filesystem error and retry without losing
ownership information.
diff --git a/src/vstack/cli/init.py b/src/vstack/cli/init.py
index 53ad6ebe..544bf3fe 100644
--- a/src/vstack/cli/init.py
+++ b/src/vstack/cli/init.py
@@ -7,6 +7,7 @@
from pathlib import Path
from typing import TYPE_CHECKING
+from vstack.artifacts.generator import GenericArtifactGenerator
from vstack.cli.base import BaseCommand, CommandContext
from vstack.cli.constants import RETIRED_PROMPT_SKILLS, Colors
from vstack.constants import VERSION
@@ -817,12 +818,18 @@ def execute(
action_counts[artifact_action] = action_counts.get(artifact_action, 0) + 1
if artifact_action == "preserve":
preserved_selectors.add(f"{gen.config.type_name}/{artifact.name}")
- elif gen.config.type_name == "skill" and artifact_action in {
- "install",
- "update",
- "skip",
- }:
- available_skills.add(artifact.name)
+ elif (
+ gen.config.type_name == "skill"
+ and artifact_action in {"install", "update", "skip"}
+ and not artifact.unresolved
+ ):
+ installed_content = (
+ (out_dir / gen.output_path(artifact.name)).read_text(encoding="utf-8")
+ if artifact_action == "skip"
+ else artifact.content
+ )
+ if not GenericArtifactGenerator.find_unresolved(installed_content):
+ available_skills.add(artifact.name)
InitCommand._prune_planner_when_manual_mode(
install_dir=install_dir,
diff --git a/tests/vstack/cli/test_prompt_migration.py b/tests/vstack/cli/test_prompt_migration.py
index 7a9ae166..a9dfbcf8 100644
--- a/tests/vstack/cli/test_prompt_migration.py
+++ b/tests/vstack/cli/test_prompt_migration.py
@@ -2,6 +2,7 @@
from argparse import Namespace
from pathlib import Path
+from shutil import copytree
import pytest
@@ -385,6 +386,79 @@ def test_source_validation_failure_does_not_retire_prompts(
assert manifest.names_for("prompts") == ["quick-review"]
+@pytest.mark.parametrize("action", ["install", "update", "skip"])
+@pytest.mark.parametrize("dry_run", [False, True])
+def test_unresolved_replacement_preserves_prompt_until_repaired(
+ tmp_path: Path,
+ capsys: pytest.CaptureFixture[str],
+ action: str,
+ dry_run: bool,
+) -> None:
+ """Missing partials defer retirement for new, updated, and unchanged replacements."""
+ templates = tmp_path / "templates"
+ copytree(TEMPLATES_ROOT / "skills", templates / "skills")
+ service = CommandService(templates)
+ install_dir = tmp_path / ".github"
+ partial = templates / "skills" / "_partials" / "skill-context.md"
+ partial_content = partial.read_text(encoding="utf-8")
+ if action == "skip":
+ partial.unlink()
+ if action != "install":
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 0
+ installed = service.manifest_for(install_dir).read()
+ manifest = track_prompts(service, install_dir, ["quick-review"])
+ if installed is not None:
+ manifest.artifacts["skills"] = installed.entries_for("skills")
+ if action == "update":
+ for entry in manifest.artifacts["skills"]:
+ entry.version = "1"
+ service.manifest_for(install_dir).write(manifest)
+ if action != "skip":
+ partial.unlink()
+ service = CommandService(templates)
+ gen = service.gen_for("skill")
+ assert gen is not None
+ assert gen.verify_input().ok
+ replacement = next(artifact for artifact in gen.render_all() if artifact.name == "code-review")
+ assert "SKILL_CONTEXT" in replacement.unresolved
+ prompt = install_dir / "prompts" / "quick-review.prompt.md"
+ original_prompt = prompt.read_bytes()
+ original_manifest = service.manifest_for(install_dir).path.read_bytes()
+ capsys.readouterr()
+
+ assert (
+ InitCommand.execute(
+ service, install_dir, only=["skill"], update=action != "install", dry_run=dry_run
+ )
+ == 0
+ )
+ assert prompt.read_bytes() == original_prompt
+ current = service.manifest_for(install_dir).read()
+ assert current is not None
+ assert current.names_for("prompts") == ["quick-review"]
+ output = capsys.readouterr()
+ assert "replacement skill/code-review is unavailable" in output.out
+ assert "SKILL_CONTEXT" in output.err
+ if dry_run:
+ assert service.manifest_for(install_dir).path.read_bytes() == original_manifest
+
+ partial.write_text(partial_content, encoding="utf-8")
+ service = CommandService(templates)
+ if not dry_run or action == "skip":
+ assert InitCommand.execute(service, install_dir, only=["skill"], update=True) == 0
+ assert prompt.read_bytes() == original_prompt
+ current = service.manifest_for(install_dir).read()
+ assert current is not None
+ assert current.names_for("prompts") == ["quick-review"]
+ assert InitCommand.execute(service, install_dir, only=["skill"]) == 0
+ assert not prompt.exists()
+ repaired = install_dir / "skills" / "code-review" / "SKILL.md"
+ assert "{{SKILL_CONTEXT}}" not in repaired.read_text(encoding="utf-8")
+ current = service.manifest_for(install_dir).read()
+ assert current is not None
+ assert not current.entries_for("prompts")
+
+
def test_retired_prompt_exclusions_warn_instead_of_blocking_upgrade(
tmp_path: Path, capsys: pytest.CaptureFixture[str]
) -> None: