Stack Profile
Every other skill in this library deliberately names patterns rather than libraries: "circuit
breaker", not a specific implementation. That keeps the guidance portable, and it makes the advice
vague until someone says what this project actually uses.
This skill closes that gap once. It writes .msskills/stack.md, which every principle reads in
step 5 of its Config Resolution, and a starter .msskills/config.yaml pointing at any house
standards the team already has.
Workflow
Step 1 — Detect what you can
Read the repository before asking anything. A question whose answer is sitting in a manifest file
wastes the user's time and signals you did not look.
Look for, in this order:
- Build and dependency manifests —
pom.xml, build.gradle*, package.json, go.mod,
*.csproj, Cargo.toml, pyproject.toml, requirements.txt, Gemfile. These give the
language, the framework, and most libraries.
- Lockfiles — confirm actual versions rather than declared ranges.
- Container and deployment files —
Dockerfile, docker-compose*, *.yaml under k8s/,
helm/, .github/workflows/, Terraform. These give the platform, the datastore, and the broker.
- Configuration —
application*.yml, appsettings*.json, .env.example, config packages.
These give the config mechanism and often the secret manager.
- Existing tests — the framework, the assertion style, whether containers or contract tooling
are already in use, and the naming convention.
- Existing architecture — the package or module layout, any architecture tests, any
specification files (
openapi.*, asyncapi.*, *.proto).
- Existing standards — a
CONTRIBUTING.md, ARCHITECTURE.md, docs/, or an ADR directory.
If the team already has written standards, they outrank this library's defaults, and
config.yaml should point at them.
An empty or greenfield repository is a valid answer. Say so and move to the interview.
Step 2 — Present what you found, then ask only for the gaps
Show the detected profile as a compact table with a confidence marker, then ask about what is
genuinely missing or ambiguous. Batch the questions into one message — see
collaborative-judgment on batching.
Detected from the repository:
| Aspect | Value | Source |
|---|---|---|
| Language | Java 21 | pom.xml |
| Framework | Spring Boot 3.4 | pom.xml |
| Datastore | PostgreSQL 16 | docker-compose.yml, Flyway migrations |
| Test framework | JUnit 5 + AssertJ + Testcontainers | pom.xml, src/test |
| Resilience | Resilience4j | pom.xml |
Not found — could you confirm?
1. Message broker: none detected. Is this service synchronous only, or is a broker planned?
2. Contract testing: nothing detected. Is there a broker for contracts, or is this the first?
3. Secret management: where do credentials come from in production?
4. Do you already have written architecture or testing standards I should point the skills at?
Ask no more than six questions. If the user does not know an answer, record it as unknown and
move on — an incomplete profile is far better than an interview nobody finishes.
Step 3 — Cover the aspects that matter
The profile is only useful for what other skills actually consult. Aim to fill these; leave the
rest blank rather than padding.
| Aspect |
Read by |
| Language, version, idiom notes |
every skill |
| Framework and DI style |
clean-architecture |
| Module and package layout, architecture-test tool |
clean-architecture, service-boundaries |
| Datastore, ORM/query style, migration tool |
data-access |
| CQRS level, read models, consistency |
cqrs-and-consistency |
| Type-system idiom for domain types |
domain-modelling, idempotency-and-immutability |
| API style: REST, GraphQL, gRPC, push |
api-protocols |
| Broker, schema registry and compatibility mode |
api-contracts, resilience-patterns |
| Specification format, error contract, event schemas |
api-contracts |
| Port and adapter conventions, service mesh |
infrastructure-adapters |
| Resilience library |
resilience-patterns |
| Test framework, assertions, container and stub tooling |
test-strategy |
| Contract tooling and broker |
contract-testing |
| Config mechanism, secret manager, flag system |
config-and-dependencies, secure-service |
| Auth model between services |
secure-service |
| Package manager, lockfile, update automation |
config-and-dependencies |
| CI platform, deployment target |
workflows |
Step 4 — Write the files
Write .msskills/stack.md using the template. Keep it factual: what
is used, not what is recommended. Mark anything inferred rather than confirmed.
Then write .msskills/config.yaml if it does not exist:
# Points skills at this project's own standards. Delete any key you have no document for —
# a key with no file produces a warning on every run.
paths:
architecture: docs/standards/architecture.md # clean-architecture
testing: docs/standards/testing.md # test-strategy
# api: # api-contracts
# protocols: # api-protocols
# security: # secure-service
# boundaries: # service-boundaries
# domain: # domain-modelling
# persistence: # data-access
# consistency: # cqrs-and-consistency
# adapters: # infrastructure-adapters
# resilience: # resilience-patterns
# idempotency: # idempotency-and-immutability
# contracts: # contract-testing
# config: # config-and-dependencies
# judgment: # collaborative-judgment
# design: # design-first
Only include keys for documents that exist. A custom document needs mode: overlay (add to the
defaults) or mode: override (replace them) in its own frontmatter.
Step 5 — Confirm and hand off
Show the written profile, say which skills it will change the behaviour of, and name the concrete
difference:
Written .msskills/stack.md. resilience-patterns will now say Resilience4j rather than
"a circuit breaker library", and test-strategy will assume Testcontainers for component tests.
Contract testing is recorded as none — when you adopt a tool, rerun this skill.
Rules
- Detect before asking. Anything discoverable from the repository must not be a question.
- Record, do not recommend. This skill captures what the project uses. If something is missing
— no contract testing, no secret manager — note it as absent. Suggesting a tool here would put a
recommendation into a file that ten other skills treat as fact.
- Mark confidence. Distinguish confirmed by the user, read from a file, and inferred.
- Never invent. If a library was not found and the user did not name one, write
unknown. A
guessed library name propagates into generated code.
- Re-running is normal. Read the existing profile, show what changed, and preserve anything the
user typed by hand.
- Keep it short. This file is read by every skill. Facts and versions, not prose.
1---2name: stack-profile3description: Record this project's technology choices once, so every other skill speaks the team's actual language instead of generic pattern names. Detects the language, framework, datastore, broker, test tooling, contract tooling, secret manager, and deployment platform from the repository, confirms the gaps by interview, and writes .msskills/stack.md plus a starter .msskills/config.yaml. Use on first setup in a repository, after adopting a new framework or broker, when guidance from other skills feels generic, or when the user says 'set up', 'stack profile', 'configure the skills', or 'onboard this repo'. Run this before the workflows — it is what turns 'add a circuit breaker' into the project's own library and idiom.4license: MIT5---67# Stack Profile89Every other skill in this library deliberately names patterns rather than libraries: "circuit10breaker", not a specific implementation. That keeps the guidance portable, and it makes the advice11vague until someone says what this project actually uses.1213This skill closes that gap once. It writes `.msskills/stack.md`, which every principle reads in14step 5 of its Config Resolution, and a starter `.msskills/config.yaml` pointing at any house15standards the team already has.1617## Workflow1819### Step 1 — Detect what you can2021Read the repository before asking anything. A question whose answer is sitting in a manifest file22wastes the user's time and signals you did not look.2324Look for, in this order:25261. **Build and dependency manifests** — `pom.xml`, `build.gradle*`, `package.json`, `go.mod`,27 `*.csproj`, `Cargo.toml`, `pyproject.toml`, `requirements.txt`, `Gemfile`. These give the28 language, the framework, and most libraries.292. **Lockfiles** — confirm actual versions rather than declared ranges.303. **Container and deployment files** — `Dockerfile`, `docker-compose*`, `*.yaml` under `k8s/`,31 `helm/`, `.github/workflows/`, Terraform. These give the platform, the datastore, and the broker.324. **Configuration** — `application*.yml`, `appsettings*.json`, `.env.example`, config packages.33 These give the config mechanism and often the secret manager.345. **Existing tests** — the framework, the assertion style, whether containers or contract tooling35 are already in use, and the naming convention.366. **Existing architecture** — the package or module layout, any architecture tests, any37 specification files (`openapi.*`, `asyncapi.*`, `*.proto`).387. **Existing standards** — a `CONTRIBUTING.md`, `ARCHITECTURE.md`, `docs/`, or an ADR directory.39 If the team already has written standards, they outrank this library's defaults, and40 `config.yaml` should point at them.4142An empty or greenfield repository is a valid answer. Say so and move to the interview.4344### Step 2 — Present what you found, then ask only for the gaps4546Show the detected profile as a compact table with a confidence marker, then ask about what is47genuinely missing or ambiguous. Batch the questions into one message — see48`collaborative-judgment` on batching.4950```markdown51Detected from the repository:5253| Aspect | Value | Source |54|---|---|---|55| Language | Java 21 | pom.xml |56| Framework | Spring Boot 3.4 | pom.xml |57| Datastore | PostgreSQL 16 | docker-compose.yml, Flyway migrations |58| Test framework | JUnit 5 + AssertJ + Testcontainers | pom.xml, src/test |59| Resilience | Resilience4j | pom.xml |6061Not found — could you confirm?621. Message broker: none detected. Is this service synchronous only, or is a broker planned?632. Contract testing: nothing detected. Is there a broker for contracts, or is this the first?643. Secret management: where do credentials come from in production?654. Do you already have written architecture or testing standards I should point the skills at?66```6768Ask no more than six questions. If the user does not know an answer, record it as `unknown` and69move on — an incomplete profile is far better than an interview nobody finishes.7071### Step 3 — Cover the aspects that matter7273The profile is only useful for what other skills actually consult. Aim to fill these; leave the74rest blank rather than padding.7576| Aspect | Read by |77|---|---|78| Language, version, idiom notes | every skill |79| Framework and DI style | `clean-architecture` |80| Module and package layout, architecture-test tool | `clean-architecture`, `service-boundaries` |81| Datastore, ORM/query style, migration tool | `data-access` |82| CQRS level, read models, consistency | `cqrs-and-consistency` |83| Type-system idiom for domain types | `domain-modelling`, `idempotency-and-immutability` |84| API style: REST, GraphQL, gRPC, push | `api-protocols` |85| Broker, schema registry and compatibility mode | `api-contracts`, `resilience-patterns` |86| Specification format, error contract, event schemas | `api-contracts` |87| Port and adapter conventions, service mesh | `infrastructure-adapters` |88| Resilience library | `resilience-patterns` |89| Test framework, assertions, container and stub tooling | `test-strategy` |90| Contract tooling and broker | `contract-testing` |91| Config mechanism, secret manager, flag system | `config-and-dependencies`, `secure-service` |92| Auth model between services | `secure-service` |93| Package manager, lockfile, update automation | `config-and-dependencies` |94| CI platform, deployment target | workflows |9596### Step 4 — Write the files9798Write `.msskills/stack.md` using [the template](./assets/stack-template.md). Keep it factual: what99is used, not what is recommended. Mark anything inferred rather than confirmed.100101Then write `.msskills/config.yaml` if it does not exist:102103```yaml104# Points skills at this project's own standards. Delete any key you have no document for —105# a key with no file produces a warning on every run.106paths:107 architecture: docs/standards/architecture.md # clean-architecture108 testing: docs/standards/testing.md # test-strategy109 # api: # api-contracts110 # protocols: # api-protocols111 # security: # secure-service112 # boundaries: # service-boundaries113 # domain: # domain-modelling114 # persistence: # data-access115 # consistency: # cqrs-and-consistency116 # adapters: # infrastructure-adapters117 # resilience: # resilience-patterns118 # idempotency: # idempotency-and-immutability119 # contracts: # contract-testing120 # config: # config-and-dependencies121 # judgment: # collaborative-judgment122 # design: # design-first123```124125Only include keys for documents that exist. A custom document needs `mode: overlay` (add to the126defaults) or `mode: override` (replace them) in its own frontmatter.127128### Step 5 — Confirm and hand off129130Show the written profile, say which skills it will change the behaviour of, and name the concrete131difference:132133> Written `.msskills/stack.md`. `resilience-patterns` will now say Resilience4j rather than134> "a circuit breaker library", and `test-strategy` will assume Testcontainers for component tests.135> Contract testing is recorded as `none` — when you adopt a tool, rerun this skill.136137## Rules138139- **Detect before asking.** Anything discoverable from the repository must not be a question.140- **Record, do not recommend.** This skill captures what the project uses. If something is missing141 — no contract testing, no secret manager — note it as absent. Suggesting a tool here would put a142 recommendation into a file that ten other skills treat as fact.143- **Mark confidence.** Distinguish confirmed by the user, read from a file, and inferred.144- **Never invent.** If a library was not found and the user did not name one, write `unknown`. A145 guessed library name propagates into generated code.146- **Re-running is normal.** Read the existing profile, show what changed, and preserve anything the147 user typed by hand.148- **Keep it short.** This file is read by every skill. Facts and versions, not prose.