diff --git a/.github/agents/architect.agent.md b/.github/agents/architect.agent.md
index 5148f163..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 40e5cfd8..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 0bf301b1..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 b47ccfc0..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 3b135237..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 9d803278..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 fa6dfc53..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 4785cd29..0866e62c 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,24 +46,26 @@ 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*)
+.github/ ← generated output plus hand-authored exceptions*
├── 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)
```
*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:
@@ -76,14 +77,14 @@ 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 |
|---|---|
| `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 +92,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 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 18590e6c..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 021ea13d..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 f78e6dad..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 169122b8..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 9ab85f0c..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 efa1a430..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 78b94e64..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 6d313413..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 c8d9d7d5..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 d84c5ee2..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 40052f20..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 d45110d9..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/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..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 d76d9ad2..350d96e1 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..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 7ee7b520..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/prompts/artifact-integrity.prompt.md b/.github/skills/artifact-integrity/SKILL.md
similarity index 53%
rename from .github/prompts/artifact-integrity.prompt.md
rename to .github/skills/artifact-integrity/SKILL.md
index b8fe1e53..8e19d7f3 100644
--- a/.github/prompts/artifact-integrity.prompt.md
+++ b/.github/skills/artifact-integrity/SKILL.md
@@ -1,16 +1,43 @@
---
-description: 'Check source templates against generated artifacts and identify drift or missing regeneration.'
name: artifact-integrity
+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]'
-agent: tester
-tools:
- - read
- - search
+user-invocable: true
+disable-model-invocation: true
---
+## Skill Context
+
+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
+
+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.
+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:
@@ -53,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 0be3d25b..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 bf76e9e7..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 9811c2ea..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 fe6d466b..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 3d1b026e..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 045e1154..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 7faacb14..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 6c439267..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 f2c7a420..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 8585679b..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 0c856e8f..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 956b8512..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 6b50ec4c..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 9b8dfcfa..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 58606a84..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 5684aa47..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 855299a2..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 5398f9b8..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 285adadf..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 7fa6d094..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 2ef5510d..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 930eb036..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 d547c78d..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 293543c2..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 00142882..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 a6ef501e..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 22770985..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 dfe93eff..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
new file mode 100644
index 00000000..4e638532
--- /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..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 ebfbd7a4..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 ddcd1db0..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 a8d018f3..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 4372fe98..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 e4c59340..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 b01b4000..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/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..8bac8374 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..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/release-check/SKILL.md b/.github/skills/release-check/SKILL.md
new file mode 100644
index 00000000..1716ccf1
--- /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..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 83cee491..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 0b5bc6af..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 dd9e1c0d..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 c2b9c133..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 3fb527b3..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 12ac7218..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 687d7f79..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 4785498d..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
new file mode 100644
index 00000000..d7b11a50
--- /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..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 c5c1f2d7..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
new file mode 100644
index 00000000..dc7ec077
--- /dev/null
+++ b/.github/skills/workflow-check/SKILL.md
@@ -0,0 +1,74 @@
+---
+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 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:
+
+## 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/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..fcd211e3 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.
@@ -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 }}
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/.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/.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/.vstack/vstack.json b/.vstack/vstack.json
index 925c701c..fddd006c 100644
--- a/.vstack/vstack.json
+++ b/.vstack/vstack.json
@@ -1,365 +1,400 @@
{
"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.8",
+ "installed_at": "2026-10-17T13:59:31.708252+00:00",
"artifacts": {
"skills": [
{
"name": "adr",
"file": "skills/adr/SKILL.md",
"version": "20260421003",
- "checksum": "b6d6c1774467f339cce476f009b130e267d5fdbf217243bfc45b939ee11e9abe",
+ "checksum": "72eda96c3453eac00ec5330fae911ee85002e95eff342063c470fd68505df8fb",
"checksum_algorithm": "sha256"
},
{
"name": "advise",
"file": "skills/advise/SKILL.md",
- "version": "20260626001",
- "checksum": "4d2ca25d75d54d61600c192ee81674144c8dc6d14a49182798f1ae27bd83acef",
+ "version": "20261017001",
+ "checksum": "2def57807e24d3bab21019c624dfb4e020ba8890d35fb4fc4f0e312fd52fc7cf",
"checksum_algorithm": "sha256"
},
{
"name": "analyse",
"file": "skills/analyse/SKILL.md",
"version": "20260421004",
- "checksum": "4071c106b0842b3cd1fc674cb8e144c5598ec046feb85fcb204acca7cac654e3",
+ "checksum": "8bcbeab92d87042b11984d43fdb2e5848b91d7eba2a5b32762f2bb7e38e54eee",
"checksum_algorithm": "sha256"
},
{
"name": "architecture",
"file": "skills/architecture/SKILL.md",
"version": "20260421005",
- "checksum": "c30e38796267ad9e522f9ddbac0cd357c049383314c5bb89a75ffd9ea2859e20",
+ "checksum": "951f1263fa436776c03c600f03b90aa8c5e70f38725eebd208cfa59fd8332835",
"checksum_algorithm": "sha256"
},
{
"name": "ask",
"file": "skills/ask/SKILL.md",
"version": "20260618001",
- "checksum": "2c3311eea1529295c6c4159082c75b4bb859deb8356b63206b83bc8566b349c3",
+ "checksum": "d4afd5223334735dc5bf71691c04355d72d58cbf7a48e7357c7ad69204fbb859",
"checksum_algorithm": "sha256"
},
{
"name": "aws-cli",
"file": "skills/aws-cli/SKILL.md",
"version": "20260502033",
- "checksum": "9a04a1bd230a74847e2ff5c9d9b9c2231fd8ecc14bdc2a063104998cb9f642b6",
+ "checksum": "b82ffa42102b2142d57e66b3c2957d9483d7d33e3e3dfa86ff4980f8f9884a6a",
"checksum_algorithm": "sha256"
},
{
"name": "changedoc",
"file": "skills/changedoc/SKILL.md",
"version": "20260625001",
- "checksum": "0acae9195c58277a7b9a4b19abafefa1d2ec2e1e4c1e5b0efbed1415502d61a0",
+ "checksum": "e2d5c3f920be7e651d90f6e4092940fd9bcd7444d7814e606f95b10317e1435d",
"checksum_algorithm": "sha256"
},
{
"name": "cicd",
"file": "skills/cicd/SKILL.md",
"version": "20260421006",
- "checksum": "b9f90d35d08e2baa45ef6d93c0e97e28751cd8d667114a8533a78c81445e94e8",
+ "checksum": "b4678e25b122d8cd296427b01ae34879ab6877c2122addd55c4cb5aadd90dcd6",
"checksum_algorithm": "sha256"
},
{
"name": "cloudformation",
"file": "skills/cloudformation/SKILL.md",
"version": "20260502032",
- "checksum": "ff5b9f34ce26347e2785d5c88ac549344942c625ededa389f1a902200f90544e",
+ "checksum": "78d31157b5f4de679a017372a1fffe41f7a797762832ba5f95b572d0254c7679",
"checksum_algorithm": "sha256"
},
{
"name": "code-review",
"file": "skills/code-review/SKILL.md",
"version": "20260421007",
- "checksum": "52dcd1c837112205ffb2e6bd12cb4ec02c1150418159727ae32818605e818a63",
+ "checksum": "13338dfae6a5bfd70cb6dd7d3fbe085fa128c0cd8fe16add745614ba160cafd9",
"checksum_algorithm": "sha256"
},
{
"name": "codeql",
"file": "skills/codeql/SKILL.md",
"version": "20260502026",
- "checksum": "ff55a96e69da8649e2474d333311e143649a937e33cab426fce75e085bad2694",
+ "checksum": "3fff3656238acab6ac67d5af31c9486294efb22cfa02e6f02b845b3dcacda1be",
"checksum_algorithm": "sha256"
},
{
"name": "concise",
"file": "skills/concise/SKILL.md",
"version": "20260421008",
- "checksum": "5820b551f432a042cf9b8e61569799130b710ea85d6688749fd6f83518d4fc29",
+ "checksum": "b512650d9194412a18ed783f02756b0e1d6d9ea97dcebda75090bffe1109e798",
"checksum_algorithm": "sha256"
},
{
"name": "consult",
"file": "skills/consult/SKILL.md",
"version": "20260421009",
- "checksum": "bc3a441398d5ef60a63ee3a44d75133f7b52c15ef247280810f165d4dff7f0de",
+ "checksum": "2d19fc019765961b80c32ffdb5dad11f83e394255a7d4954786cecca7767bb0a",
"checksum_algorithm": "sha256"
},
{
"name": "container",
"file": "skills/container/SKILL.md",
"version": "20260421010",
- "checksum": "fa710b8a9aede396e357346a2b4975e63d8bfda6c564a0b0babb6d15495ad856",
+ "checksum": "b4b48e05480bc26519d997ccef254158db48ef209d1b3267da8983162ecc77df",
"checksum_algorithm": "sha256"
},
{
"name": "conventional-commit",
"file": "skills/conventional-commit/SKILL.md",
"version": "20260502024",
- "checksum": "0f9348d4613d0d2aaba4e9803dcc90890bc53cd5e89113aff2f529e1826afe21",
+ "checksum": "2d92c9c1efb79a7cd15d37cd5d244307693056c78373af94fb8480e10067827b",
"checksum_algorithm": "sha256"
},
{
"name": "copilot-ops",
"file": "skills/copilot-ops/SKILL.md",
"version": "20260513012",
- "checksum": "582735a432d636f79a69853e9811b7ef2c23a4d32e00e1c46412a009492527c1",
+ "checksum": "29fa2f9968fe62ed9fb0cd3f104e9f5ab59f648e8b501bdada8ffbd58f878a8d",
"checksum_algorithm": "sha256"
},
{
"name": "debug",
"file": "skills/debug/SKILL.md",
"version": "20260421011",
- "checksum": "f30c6f27f1900d7d60739ba711e46dd7f386c14d0dcebf534b9cea7346d4f3a3",
+ "checksum": "8be2e80664a06f288703cb4585210482d3151fff7190e6b7a5f9e5cf524acb62",
"checksum_algorithm": "sha256"
},
{
"name": "dependabot",
"file": "skills/dependabot/SKILL.md",
"version": "20260502027",
- "checksum": "433d5bbae6f10b21140aa0ad85885085606d588c2854b95d74e75b39845d6c57",
+ "checksum": "ed8d4e5851a3c3c1a24d8765f1e38a7467e6970508fb878335a3e0d7bb24aa0b",
"checksum_algorithm": "sha256"
},
{
"name": "dependency",
"file": "skills/dependency/SKILL.md",
"version": "20260421012",
- "checksum": "7bf1218cd64b5d56e300c5dfc92c2f34712a26fb6dc106ffc3f6ab7c3954c2e4",
+ "checksum": "d8419ccccf92f27fa2f557b2d5aaad1dcf2dd8f07b9b2ae60f323a56adf657cd",
"checksum_algorithm": "sha256"
},
{
"name": "design",
"file": "skills/design/SKILL.md",
"version": "20260421013",
- "checksum": "3d1330bfe022d024e1e6ce0920559d537701928827219fc2fadf6b13b03a2b71",
+ "checksum": "79db85fea4d04eebe34f7f09664bfc79ecd483bb4040ff0466b2d8252b042aca",
"checksum_algorithm": "sha256"
},
{
"name": "docs",
"file": "skills/docs/SKILL.md",
"version": "20260421014",
- "checksum": "ea276109c096130af6730e9b03124ec81ac6b2a338096a0175e0f2c09f83f14b",
+ "checksum": "3c00ecce65a66f041ad0c10894349a8c8428a59aa31c21795e6895dab2bd2ef1",
"checksum_algorithm": "sha256"
},
{
"name": "explore",
"file": "skills/explore/SKILL.md",
"version": "20260611001",
- "checksum": "73ae9db2c19ef0b92e8770d7ca6e742cb5345451c7b7f0170fd89aeeebaa2a68",
+ "checksum": "03d1fb8539e2372c33046c56c90af82b13b43615e71dc9c2d9916c33a7755118",
"checksum_algorithm": "sha256"
},
{
"name": "gdpr",
"file": "skills/gdpr/SKILL.md",
"version": "20260502029",
- "checksum": "c59511181cafdef780a0190d555ca953002d5f194c886ebf0bb1d7cdd3742b60",
+ "checksum": "fdbafa43a37eb6fe9657c08f6a63e97c482763124aec5a5a92a9277300dad767",
"checksum_algorithm": "sha256"
},
{
"name": "gh-issues",
"file": "skills/gh-issues/SKILL.md",
"version": "20260502025",
- "checksum": "cf88898d3cd08483723504f6bd22450a79b03b28c23f3c39efa6380131116601",
+ "checksum": "0766599fb6133caa0628615883ed3f95e41b498c01e7957fd4a44d021651830d",
"checksum_algorithm": "sha256"
},
{
"name": "gh-release",
"file": "skills/gh-release/SKILL.md",
"version": "20260502023",
- "checksum": "7d425d32a35a2ffa6f7dbd3dd6e52ac6d83bf140eca4454f8844d569046906a8",
+ "checksum": "7382cd0752d617847fb70bdcc77c13a2c23aff609c4e0431e9890aa488c74220",
"checksum_algorithm": "sha256"
},
{
"name": "guardrails",
"file": "skills/guardrails/SKILL.md",
"version": "20260421016",
- "checksum": "1fe600ae0a5f5e9fc974d81aca8cb1ffdc50d1b5a7ced9fdd3ec400ddec9db4d",
+ "checksum": "13ff3280958b14b2c0160b33e08b5bd37a474fd5556f211b22e67d2c3cfd6d31",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "skills/helm/SKILL.md",
"version": "20260502037",
- "checksum": "d03178606be8fbc8152b97d95b146ad757061b97ac969207e5d92bda04ee7454",
+ "checksum": "a2abc7e1d1614d55990be395ddf299fc4a0b08d6e51f16495751a244d59912c9",
"checksum_algorithm": "sha256"
},
{
"name": "incident",
"file": "skills/incident/SKILL.md",
"version": "20260503002",
- "checksum": "ef1f63deb5c361d995e41c393ff63c55d1556f3a216515a2afe7dc564a80f561",
+ "checksum": "581de57435857e3b81b740ed43030db99fa6c5604c6880672fa916e01bc1f85f",
"checksum_algorithm": "sha256"
},
{
"name": "inspect",
"file": "skills/inspect/SKILL.md",
"version": "20260421018",
- "checksum": "7bdc6776309a7130fbb47ae8f2be8f07511d4dca67dd3e42c7170b1fb0524d9c",
+ "checksum": "0d26174e8afadea8b26e5ebf83cf1115d1ab96600c9d03d49ece71d07ada5aa3",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "skills/k8s/SKILL.md",
"version": "20260502036",
- "checksum": "d9ab4f7f08b6b1b2083034fcc068826871ad63fdb0d3861189c799e1679ca5b6",
+ "checksum": "536efea082ff4c26dfdf6e22af7504da852447813deb61d1cb99f2b5b0651061",
"checksum_algorithm": "sha256"
},
{
"name": "lazy",
"file": "skills/lazy/SKILL.md",
"version": "20260625001",
- "checksum": "9367ee448e3be8dedf2f361d8d9c37bed08673ced4082d8d38b5facb98195d3b",
+ "checksum": "6e455e539e8534194d9e017ce4bbccc77fb5fa1fd65e41d24b7c40958c1a49a0",
"checksum_algorithm": "sha256"
},
{
"name": "migrate",
"file": "skills/migrate/SKILL.md",
"version": "20260421019",
- "checksum": "eafa22586141e152b686c0148d20af3c482424b79cd1f7195f0fdbe8f1c75928",
+ "checksum": "f3794467cce63919af9d6595aa17e4c0a9d7246e52373364cc321c109fbf6562",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "migration-plan",
+ "file": "skills/migration-plan/SKILL.md",
+ "version": "20261017001",
+ "checksum": "36b4591572c18a07f5c6048d180bebca95202c4809c518129a2d509984de3dc1",
"checksum_algorithm": "sha256"
},
{
"name": "onboard",
"file": "skills/onboard/SKILL.md",
"version": "20260421020",
- "checksum": "67cfa95ebacb72fab6c7289238315cf7d73bdec665f9d9775ba616ecf9827d09",
+ "checksum": "680e5f0031ab810e476f2345a88e92d29896ab5cf0ec85ef69a08b827728faf7",
"checksum_algorithm": "sha256"
},
{
"name": "openapi",
"file": "skills/openapi/SKILL.md",
"version": "20260421021",
- "checksum": "6be2f0350a71826b0c70506331f8236075a767c3a66272d485efbfc31e02116c",
+ "checksum": "77a00cc691d80d005206d6386b2b660c310a7cffa427eb8dc6e6390d0984d9f2",
"checksum_algorithm": "sha256"
},
{
"name": "performance",
"file": "skills/performance/SKILL.md",
"version": "20260421022",
- "checksum": "f1b3de41ddb049e1e6c11fee5305d1ede50fec6d7b8c2fbee424684cdbafbfe1",
+ "checksum": "e25e3983ce8be1b2218edfab23cae831eea75a675a715bd781123ce0e21005ee",
"checksum_algorithm": "sha256"
},
{
"name": "postmortem",
"file": "skills/postmortem/SKILL.md",
"version": "20260503001",
- "checksum": "e66a8637020c5d4f49667d68cb82cb23454f9b8e4bcae0d2306f8a14492d5a35",
+ "checksum": "5ffcfb1109f517545b4eb8eb994e64b18beaa49e88639ceacf754488067ecb6e",
"checksum_algorithm": "sha256"
},
{
"name": "pr",
"file": "skills/pr/SKILL.md",
"version": "20260502013",
- "checksum": "10e21fea3fe695fd8b9375314570caf6d55994a3e92be9a560a8ca84c50b6685",
+ "checksum": "c78d09eb0f127b68b5e82ef4b678ed5e95edcacfb39b5ddb9a536beb2a5b9dd4",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "skills/rancher/SKILL.md",
"version": "20260502038",
- "checksum": "585fca26d9085339c3c4cbb51dae9aca92029cc95819ea645f0f1339a3e408f0",
+ "checksum": "08822bed0bab149168ff63ea3b58363ecec2e88e8b05dcf603e8906945457cb4",
"checksum_algorithm": "sha256"
},
{
"name": "rca",
"file": "skills/rca/SKILL.md",
"version": "20260503001",
- "checksum": "18f67a9fe20eb252ad3552112abe15cdc9b478b893a7f28368a36341a020398a",
+ "checksum": "e2922ee44a376117779a6e3d09a1f6c75bd7eff0e8ce34353c319856836cdf55",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "reasoning",
+ "file": "skills/reasoning/SKILL.md",
+ "version": "20261017001",
+ "checksum": "211eba9546932db6636f5158336ed25b9d327117d1a8f0b0f7cd2ef9d070e922",
"checksum_algorithm": "sha256"
},
{
"name": "refactor",
"file": "skills/refactor/SKILL.md",
"version": "20260421023",
- "checksum": "42fedb61708cb469f8325d738dc5a75688e7c34b981e8cad4abd257015e57520",
+ "checksum": "cdc4a2b846353ccb8b5255bab6095477885cd1228cba7815cab3638b6d71f570",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "release-check",
+ "file": "skills/release-check/SKILL.md",
+ "version": "20261017001",
+ "checksum": "fccdb0eee1f9949737a086306e6881b44040406151c9f001cbd60e2275714753",
"checksum_algorithm": "sha256"
},
{
"name": "release-notes",
"file": "skills/release-notes/SKILL.md",
"version": "20260502014",
- "checksum": "1d7daef61af9010f0afd53daa8d5524d26b71a0ddd5794e5b4fca89dd59d80a2",
+ "checksum": "fb499779b035a4cb205f2ee8b2d68cb171b6dbd0a77190352faefa1a5b80b5c1",
"checksum_algorithm": "sha256"
},
{
"name": "requirements",
"file": "skills/requirements/SKILL.md",
"version": "20260421024",
- "checksum": "87460b5b0dacb0df5a68c36662fab194a666f02cbe140a473b8d418d69421f7f",
+ "checksum": "ccc0512888c77f1982420d75f25058d703229c2c8ec20cef6859c1c473b83ac5",
"checksum_algorithm": "sha256"
},
{
"name": "secret-scan",
"file": "skills/secret-scan/SKILL.md",
"version": "20260502028",
- "checksum": "51bf8cc673fc6984aad45589a54aacbcc7a4cbdb7c3089d47110ef38a3fcbe4d",
+ "checksum": "b3c6e70d8b7069b36e38668afb48d55cce542d938bd3b25bced6e9db356c906c",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "skills/security/SKILL.md",
"version": "20260421025",
- "checksum": "53bca57d167a78c01b0edf1fca3ad6200fe4165fdb27d1cc19722dfee7ba6521",
+ "checksum": "f6f154b990cea5d39d189409801c4478d5351cb5d445f246c07120cbadd24425",
"checksum_algorithm": "sha256"
},
{
"name": "simplify",
"file": "skills/simplify/SKILL.md",
"version": "20260625001",
- "checksum": "146fb31d0945c5e6af086607ff46c11aea5c8e6d8e230076bc083c3574ae18f3",
+ "checksum": "6c60f49f9561fe30e699cbfcdab19259c1aa4b34cd917d7bf1ac531adb32ac74",
"checksum_algorithm": "sha256"
},
{
"name": "space-setup",
"file": "skills/space-setup/SKILL.md",
"version": "20260513011",
- "checksum": "5064b3e7f397fa026bfe10eb9ee7b14545acbab12f4c19b98764256380e50686",
+ "checksum": "67a5c30d448b7d1a1fd550cc69dc8c7b050af2d836ce1bb67d1d0c84d78ad769",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "skills/terraform/SKILL.md",
"version": "20260502030",
- "checksum": "599a1e19f900d98683d710bbecdbe897d0bcf919934419d1bbaf1474914db0c5",
+ "checksum": "58d82a79f299a6ab227ff36dd0a1cc39c71e51259f1eda78d1adf4917a216946",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "skills/terragrunt/SKILL.md",
"version": "20260502031",
- "checksum": "ca39ff5191a5edfa16fd38e6d2d617cfc4288206079698bcbfb30229c50d315a",
+ "checksum": "89910e245a0712b613be361f682b262c1492ef45fb8e6800d159613779a5b987",
"checksum_algorithm": "sha256"
},
{
"name": "threat-model",
"file": "skills/threat-model/SKILL.md",
"version": "20260502021",
- "checksum": "050590189a5d84faed9edc9253fc55297d2b86980c83438aed2b721346fa964a",
+ "checksum": "68d2f41fdc7217c0df316f8417fa3f386e0f17562caa09ecd10405f925abd82f",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "upgrade-plan",
+ "file": "skills/upgrade-plan/SKILL.md",
+ "version": "20261017001",
+ "checksum": "e78c6489648b9574d87f5fb807ce2706f9e03a6f57a890f0ce1a9388a8354edb",
"checksum_algorithm": "sha256"
},
{
"name": "verify",
"file": "skills/verify/SKILL.md",
"version": "20260421026",
- "checksum": "72d2979131d2609ec90e9130b1109ec8c42467e5683493336e81f3b571c65915",
+ "checksum": "ee676a885b9aa2764078458161160a2e0367174f91c10fcb25aacf659bc8f2f0",
"checksum_algorithm": "sha256"
},
{
"name": "vision",
"file": "skills/vision/SKILL.md",
"version": "20260421027",
- "checksum": "8d688153c93138fe7ac97e748c3ee94f86fe8a03c78550d895400ac38303e256",
+ "checksum": "0b6a83f54c77620f30e2b114869ca4b4964f500cc47af4ed4a468733847fa0a8",
+ "checksum_algorithm": "sha256"
+ },
+ {
+ "name": "workflow-check",
+ "file": "skills/workflow-check/SKILL.md",
+ "version": "20261017002",
+ "checksum": "aa68d768a44fed5e142ddc1d66c8958fdf1636284294ecf93dc255e7011b1428",
"checksum_algorithm": "sha256"
}
],
@@ -368,49 +403,49 @@
"name": "architect",
"file": "agents/architect.agent.md",
"version": "20260514001",
- "checksum": "df80bf7a7e63a435866be49a7f0c9222fda5003945b9f7629a03a8d9f74375a3",
+ "checksum": "32e78f403e974932d315c8efa4dbfe863e1c4d7e0a546769e63f7cee199f87a1",
"checksum_algorithm": "sha256"
},
{
"name": "designer",
"file": "agents/designer.agent.md",
"version": "20260514001",
- "checksum": "5c2125fb4ae1fca15d1b4c621c8e6da0a5512bb4c4938a52a36f25534dae78d5",
+ "checksum": "b2e3dd6aa205ff11e44dcda1f06b80e01b2b44c1011b0a1cbee8962e79cb4c2b",
"checksum_algorithm": "sha256"
},
{
"name": "engineer",
"file": "agents/engineer.agent.md",
"version": "20260514001",
- "checksum": "a59ef1d8321c7fbe2e04428409c29354ebf85cc039bc3fe74a0bebcc2b3aa29b",
+ "checksum": "8239b7e880aa26414aa9e0b3524818e0aad8bb892b7ca0af9af6d1a0f253e5a8",
"checksum_algorithm": "sha256"
},
{
"name": "planner",
"file": "agents/planner.agent.md",
"version": "20260514001",
- "checksum": "8a54e9202b9dcb2ca8b479eeae709e7dae4f2f30a9d782bac3aeb463a6dd52af",
+ "checksum": "e648dcc71fea5989c275af5f4bf204a76615e3bd8195d2ab00e81aaa7a741d4c",
"checksum_algorithm": "sha256"
},
{
"name": "product",
"file": "agents/product.agent.md",
"version": "20260514001",
- "checksum": "570272a093eed52edb7918c0ec4f753eb9fdea4372a7886c628e997ba727cd71",
+ "checksum": "55b55479eef30115bb00f48a3a1869992f22ba33d1782a096cda059394692bf2",
"checksum_algorithm": "sha256"
},
{
"name": "release",
"file": "agents/release.agent.md",
"version": "20260514001",
- "checksum": "f96cc7bf9907c68d5da1c65d564de302ab1734fbe549ad52a96adf5f841fc74a",
+ "checksum": "a8879577a8fa1f664c9731104775ea463d5a38c7d76c036c1d766a7a11202b7b",
"checksum_algorithm": "sha256"
},
{
"name": "tester",
"file": "agents/tester.agent.md",
"version": "20260514001",
- "checksum": "4497a4ee20f393101a526e6caeb1c17a64cf3c60aefe638ea5f04655c82a9443",
+ "checksum": "2e3dc966d3e78e11a381c01bc331e56107164818cf0aceea3528d3cacce59bb9",
"checksum_algorithm": "sha256"
}
],
@@ -418,49 +453,49 @@
{
"name": "agent-call-audit",
"file": "hooks/agent-call-audit.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "a03cc5df031670dd4902599048a9fc955a852862b2cb73408f5889ee74baa636",
"checksum_algorithm": "sha256"
},
{
"name": "log-retention-cleanup",
"file": "hooks/log-retention-cleanup.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "2c3048637dc0f85b7196934b0f6c5a2ee9a21739b45bc7a529e2f5531f2b2609",
"checksum_algorithm": "sha256"
},
{
"name": "post-commit-security-scan",
"file": "hooks/post-commit-security-scan.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "154305889deb5676a6b7d686400b14b4237687be130438d19843341addbdff8e",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-format",
"file": "hooks/post-edit-format.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "5911a2fc0211b268749e5200db8d43eec953f456294c8cbc5556cea9ab11f875",
"checksum_algorithm": "sha256"
},
{
"name": "post-edit-markdown-quality",
"file": "hooks/post-edit-markdown-quality.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "b8ef6b1805492a580902675ccd16564c693ec2ccf30fdb81d6b1d8dce610ab22",
"checksum_algorithm": "sha256"
},
{
"name": "pre-tool-safety-gate",
"file": "hooks/pre-tool-safety-gate.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "1d55d6c9cee6137472e37c9e16febb5a96419fc0813c4c474af5a50ee03ee5a0",
"checksum_algorithm": "sha256"
},
{
"name": "session-audit",
"file": "hooks/session-audit.json",
- "version": "3.6.0",
+ "version": "3.7.8",
"checksum": "0190aa65dfea26b2129ad8a5304377b2d40febf03779f561194e788bb8b27bfa",
"checksum_algorithm": "sha256"
}
@@ -470,205 +505,84 @@
"name": "git",
"file": "instructions/git.instructions.md",
"version": "20260421001",
- "checksum": "98b80a1ac1bc6449205bbb47ab55e1883db96408a00b387b13ba89c1bc3e607f",
+ "checksum": "b41e3da9ce908e6143053832353829be0d0c3a0dae99140fedb7ed83d7189f84",
"checksum_algorithm": "sha256"
},
{
"name": "helm",
"file": "instructions/helm.instructions.md",
"version": "20260502040",
- "checksum": "98074afe634848f3746b719785bb6ea193954c8a2d18b5be384a283d5037d1f8",
+ "checksum": "dd90cca8401be666a8ca7703a6fd0917df546ec9904f142b56e14e851b51a5ac",
"checksum_algorithm": "sha256"
},
{
"name": "java",
"file": "instructions/java.instructions.md",
"version": "20260502001",
- "checksum": "898d7bec68b530f4bebdf06b0f5187a723235dcfadbf7b5543458ce8c57d3bbd",
+ "checksum": "5556bbc815d2406472fb168e143b1df2eabe2d7935e24ac466c1e9802d80ae64",
"checksum_algorithm": "sha256"
},
{
"name": "k8s",
"file": "instructions/k8s.instructions.md",
"version": "20260502039",
- "checksum": "988deef8f67a0014fc5048cc1b9176a8fcaa2ddbc31974ee51c69d79e415d942",
+ "checksum": "25f892ec4c459aa9d7c924197d3bd3f094c7f987d586f6b46b54f243329d5d73",
"checksum_algorithm": "sha256"
},
{
"name": "markdown",
"file": "instructions/markdown.instructions.md",
"version": "20260502002",
- "checksum": "7fd126db0f2aee3a85eb77ce93b50bb38d5027acdd4ae7cd5849a92a7b7c6ceb",
+ "checksum": "d03f1da80b1a0913231972bbe9dc37833194f96f5dfebefe888e724191734080",
"checksum_algorithm": "sha256"
},
{
"name": "python",
"file": "instructions/python.instructions.md",
"version": "20260421002",
- "checksum": "b1629161e831aeca03c29b5bc3ff03e1d06d6a90bb6d8f746a1a1a44086f3f2e",
+ "checksum": "c31f929e489c28c4be92cab4483b13eeb575baf6e4d3995b1c806f81d69800c3",
"checksum_algorithm": "sha256"
},
{
"name": "rancher",
"file": "instructions/rancher.instructions.md",
"version": "20260502041",
- "checksum": "3bd18bea97ca1515f6fac7543ddd242181c740ee529494e2f2c7a7801ef04ab5",
+ "checksum": "796d1c16f97b4bbe890293b254949935e1af97eb58ec52c9504d1f5323459628",
"checksum_algorithm": "sha256"
},
{
"name": "security",
"file": "instructions/security.instructions.md",
"version": "20260502003",
- "checksum": "004ca7d875f1d3aa81d25f721db2a5a08429ccad7013ae83b2bb90e5fcdffe1c",
+ "checksum": "001d506762be4e2323cb7c672cd29fdc00cf94a6ef68e08e049cb61690f3e76a",
"checksum_algorithm": "sha256"
},
{
"name": "terraform",
"file": "instructions/terraform.instructions.md",
"version": "20260502034",
- "checksum": "881d4c803a647da37c36b805071343a7d57840e901efc71cb4ec9e160501025a",
+ "checksum": "ecf3257ebae88d937253e25b6a8b2a121ab53d62bf7f70ecbd76d784d01731e0",
"checksum_algorithm": "sha256"
},
{
"name": "terragrunt",
"file": "instructions/terragrunt.instructions.md",
"version": "20260502035",
- "checksum": "7cb98962ba3457d1163c7498efd05240b63d0c3a94d763aeb3527ae4e227e045",
+ "checksum": "6660677347ba0cb52e858f81f3dcb1177b42dfba02148cddb865dc08a2adb4df",
"checksum_algorithm": "sha256"
},
{
"name": "testing",
"file": "instructions/testing.instructions.md",
"version": "20260502004",
- "checksum": "c0652c822f66494b8e1cabbccdacb3197a6bb723f7ac0d33f7d10a2f08d2db07",
+ "checksum": "417c388a626a7c6dbd9072f5ab8f6ff47e7d2cabe8218cae61aefae415668aed",
"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": "a320659b42fdda47e5548a36b451d907c7c13daf93e4267721cf97a566e51101",
"checksum_algorithm": "sha256"
}
]
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 38f59e9c..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
@@ -57,14 +64,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 +122,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/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 ccdfc0b2..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)
@@ -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..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)
@@ -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/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/adr/032-skills-replace-prompts.md b/docs/architecture/adr/032-skills-replace-prompts.md
new file mode 100644
index 00000000..affa8582
--- /dev/null
+++ b/docs/architecture/adr/032-skills-replace-prompts.md
@@ -0,0 +1,66 @@
+# 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`.
+
+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.
+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.
+- 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
+
+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.
+Repository-only maintenance skills are not dependencies of consumer pipeline stages.
+
+## 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/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 ab558ceb..9773b96f 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/
@@ -53,15 +52,19 @@ 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
-│ ├── instructions/.instructions.md
-│ └── prompts/.prompt.md
+│ └── instructions/.instructions.md
└── 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
@@ -117,7 +120,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 +136,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.
@@ -209,7 +218,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/changes/retire-prompts_skill_migration_20261017.md b/docs/changes/retire-prompts_skill_migration_20261017.md
new file mode 100644
index 00000000..3b223fde
--- /dev/null
+++ b/docs/changes/retire-prompts_skill_migration_20261017.md
@@ -0,0 +1,82 @@
+# 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 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.
+- 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.
+- 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.
+
+## 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/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/overview.md b/docs/design/overview.md
index dfc45266..4920a1d7 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,29 @@ 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.
+
+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.
______________________________________________________________________
@@ -439,7 +454,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..4ade7867 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.
@@ -80,6 +90,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 +98,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 +110,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 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
+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..3a08f8b7 100644
--- a/docs/design/workflow.md
+++ b/docs/design/workflow.md
@@ -18,6 +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 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
@@ -233,8 +241,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 6bc77890..e2e037fc 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
@@ -120,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`. |
@@ -153,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/docs/product/roadmap.md b/docs/product/roadmap.md
index 718bea8c..068b0c0c 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 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 |
+| 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,10 @@ 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 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:**
@@ -611,7 +614,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 +650,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..26d9039a
--- /dev/null
+++ b/docs/user/reference/prompt-migration.md
@@ -0,0 +1,114 @@
+# 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` | `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
+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 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
+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
+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.
+
+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.
+
+## 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..6be9afdc 100644
--- a/docs/user/reference/skills-overview.md
+++ b/docs/user/reference/skills-overview.md
@@ -8,63 +8,73 @@ 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 |
-| --------------------- | ------------------------------------------------------------------------------------------------------------------- |
-| `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. |
-| `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. |
-| `refactor` | Behavior-preserving structural refactoring. |
-| `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. |
-| `verify` | Verification fix-loop with targeted re-checking. |
-| `vision` | Scope and strategy review from first principles. |
+| 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
-- [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/poetry.lock b/poetry.lock
index 9e1fba2d..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,175 +260,223 @@ 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 = {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)"]
@@ -588,23 +659,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"
@@ -691,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]]
@@ -731,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]
@@ -760,14 +826,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]]
@@ -784,23 +850,23 @@ 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"
-python-versions = ">=3.11,<3.15"
-content-hash = "289466667e6732d99a4c97d293554faebc87ed1a8bf88b853e984713d93fab78"
+python-versions = ">=3.11"
+content-hash = "202896408cc529c760b2878348fcf34b40c6e38718db7948f52e5f6ebea0db7e"
diff --git a/pyproject.toml b/pyproject.toml
index 6ff41b5b..d36e462d 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",
@@ -79,11 +80,11 @@ 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"
-types-PyYAML = ">=6.0.12.20260815"
+tox = ">=4.64.10"
+types-PyYAML = ">=6.0.12.20260906"
# ---------------------------------------------------------------------------
@@ -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]
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/artifact-integrity/config.yaml b/src/vstack/_templates/prompts/artifact-integrity/config.yaml
deleted file mode 100644
index f646d0c3..00000000
--- a/src/vstack/_templates/prompts/artifact-integrity/config.yaml
+++ /dev/null
@@ -1,8 +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]"
-agent: tester
-tools:
- - read
- - search
-version: 20260513002
diff --git a/src/vstack/_templates/prompts/artifact-integrity/template.md b/src/vstack/_templates/prompts/artifact-integrity/template.md
deleted file mode 100644
index 0d9a00b1..00000000
--- a/src/vstack/_templates/prompts/artifact-integrity/template.md
+++ /dev/null
@@ -1,46 +0,0 @@
-Check source templates against generated artifacts and identify drift.
-
-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/_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/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..a5fd77ef 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: 20261017002
diff --git a/src/vstack/_templates/prompts/workflow-check/template.md b/src/vstack/_templates/skills/workflow-check/template.md
similarity index 61%
rename from src/vstack/_templates/prompts/workflow-check/template.md
rename to src/vstack/_templates/skills/workflow-check/template.md
index 151a770e..5caf0401 100644
--- a/src/vstack/_templates/prompts/workflow-check/template.md
+++ b/src/vstack/_templates/skills/workflow-check/template.md
@@ -1,6 +1,13 @@
+{{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.
+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:
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..d272bf32 100644
--- a/src/vstack/cli/constants.py
+++ b/src/vstack/cli/constants.py
@@ -5,7 +5,6 @@
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 = [
@@ -41,6 +40,7 @@
"k8s",
"lazy",
"migrate",
+ "migration-plan",
"onboard",
"openapi",
"performance",
@@ -48,7 +48,9 @@
"pr",
"rancher",
"rca",
+ "reasoning",
"refactor",
+ "release-check",
"release-notes",
"requirements",
"secret-scan",
@@ -58,8 +60,10 @@
"terraform",
"terragrunt",
"threat-model",
+ "upgrade-plan",
"verify",
"vision",
+ "workflow-check",
]
@@ -76,13 +80,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 +129,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": "inspect",
+ "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..544bf3fe 100644
--- a/src/vstack/cli/init.py
+++ b/src/vstack/cli/init.py
@@ -7,8 +7,9 @@
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 Colors
+from vstack.cli.constants import RETIRED_PROMPT_SKILLS, Colors
from vstack.constants import VERSION
from vstack.manifest import (
CURRENT_HASH_ALGORITHM,
@@ -401,7 +402,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 +471,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 +498,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 +514,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 +540,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 +555,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 +784,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 +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"}
+ 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,
@@ -776,6 +875,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..090e3153 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,32 @@ 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",
+ [
+ ("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..ad003a59 100644
--- a/tests/vstack/cli/test_constants.py
+++ b/tests/vstack/cli/test_constants.py
@@ -38,6 +38,7 @@
"k8s",
"lazy",
"migrate",
+ "migration-plan",
"onboard",
"openapi",
"performance",
@@ -45,7 +46,9 @@
"pr",
"rancher",
"rca",
+ "reasoning",
"refactor",
+ "release-check",
"release-notes",
"requirements",
"secret-scan",
@@ -55,8 +58,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..a9dfbcf8
--- /dev/null
+++ b/tests/vstack/cli/test_prompt_migration.py
@@ -0,0 +1,472 @@
+"""Regression tests for retiring managed prompts during skill installation."""
+
+from argparse import Namespace
+from pathlib import Path
+from shutil import copytree
+
+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"
+
+
+@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:
+ """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"]
+
+
+@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:
+ """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"