From e9a9ff98883371862573c5c9bb96a4fcff722b36 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 1 May 2026 17:19:30 +0000 Subject: [PATCH 01/16] feat: add ways-of-working skill Agent-Logs-Url: https://github.com/devantler-tech/skills/sessions/d2ea36b1-3cc4-4611-9662-a3124f29de62 Co-authored-by: devantler <26203420+devantler@users.noreply.github.com> --- README.md | 1 + ways-of-working/SKILL.md | 90 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 ways-of-working/SKILL.md diff --git a/README.md b/README.md index 024ef56..6b1442b 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ This repo is a **pointer list**, not a publisher. Each row below installs direct |-------|----------|---------| | `refactor` | [`github/awesome-copilot`](https://github.com/github/awesome-copilot/tree/main/skills/refactor) | `gh skill install github/awesome-copilot refactor` | | `test-driven-development` | [`obra/superpowers`](https://github.com/obra/superpowers/tree/main/skills/test-driven-development) | `gh skill install obra/superpowers test-driven-development` | +| `ways-of-working` | [`devantler-tech/skills`](https://github.com/devantler-tech/skills/tree/main/ways-of-working) | `gh skill install devantler-tech/skills ways-of-working` | diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md new file mode 100644 index 0000000..ad6894f --- /dev/null +++ b/ways-of-working/SKILL.md @@ -0,0 +1,90 @@ +--- +name: ways-of-working +description: >- + Codifies devantler-tech engineering practices: TDD, CI/CD pipelines, + GitHub Flow, benchmarking, code quality gates, and Kubernetes workflows + with ksail. Use when setting up new projects, configuring CI/CD, + writing tests, or making architectural decisions. +license: Apache-2.0 +--- + +# Ways of Working + +## Testing + +Follow the [test-driven-development](https://github.com/obra/superpowers/tree/main/skills/test-driven-development) skill rigorously — write the test first, watch it fail, write minimal code to pass. + +### Test Types + +| Type | Where to write | When to run | +|------|---------------|-------------| +| **Unit tests** | SDK test frameworks (e.g. `go test`, `xunit`, `jest`) | CI on every PR | +| **Integration tests** | SDK test frameworks | CI on every PR | +| **E2E / system tests** | GitHub Actions workflows that exercise the app/binary/service as an end user would | CI on every PR; move to `merge_group` if the suite becomes too heavy | +| **Benchmark tests** | SDK benchmark frameworks (e.g. `BenchmarkDotNet`, `go test -bench`) | CI on every PR | + +### Platform Engineering Tests + +For platform engineering work the same categories apply, but the tooling shifts to [ksail](https://github.com/devantler-tech/ksail): + +| Type | ksail equivalent | +|------|-----------------| +| Build / init | `ksail cluster init` | +| Run / test | `ksail cluster create` | +| Publish | `ksail workload push` (OCI artifacts) | + +## Code Quality Gates (CI) + +Every pull request **must** pass: + +- **Strict linting** — language-specific linters with zero-tolerance for warnings. +- **Strict security scanning** — e.g. CodeQL, Trivy, zizmor. +- **Strict code quality scanning** — e.g. SonarQube, MegaLinter. +- **No code coverage regression** — coverage must not decrease compared to the base branch. +- **No benchmark regression** — benchmark results must not regress compared to the base branch. + +## Libraries + +Prefer popular, well-maintained third-party libraries over writing custom implementations. Only roll your own when no suitable library exists or when the dependency would be disproportionately heavy. + +## Refactoring & Design + +Follow guidelines for refactoring techniques and design patterns. + +## Branching & Flow + +Use **GitHub Flow**: + +1. Create a feature branch from `main`. +2. Open a pull request. +3. Pass all CI checks. +4. Merge via merge queue (`merge_group`). + +## CI/CD Pipeline + +### Application / Library Repositories + +| Event | What runs | +|-------|-----------| +| `pull_request` | All tests (unit, integration, E2E, benchmarks), linting, security & quality scanning, coverage & benchmark regression checks. Move E2E to `merge_group` only if the suite becomes too heavy. | +| `merge_group` | CD to **dev** environment. | +| `push` to `main` | **Publish** artifacts (packages, container images, etc.). | +| Semver tag (`vX.X.X`) | CD to **prod** environment. | + +### Kubernetes / Platform Repositories + +| Event | What runs | +|-------|-----------| +| `pull_request` | System test on a local Docker cluster (`ksail cluster create`). Move to `merge_group` if the suite becomes too heavy. | +| `merge_group` | CD to **dev** — deploy to staging infrastructure (e.g. Hetzner). | +| Semver tag (`vX.X.X`) | CD to **prod** — `ksail cluster update`, `ksail workload push`, `ksail workload reconcile`. | + +## Data-Driven Improvement + +- Use **benchmarking data** to guide performance improvements — don't optimise without numbers. +- Use **code coverage data** to guide where to add tests — target uncovered paths, not a vanity percentage. + +## Reference Implementations + +- [devantler-tech/ksail](https://github.com/devantler-tech/ksail) — Go CLI built with TDD, full CI/CD pipeline, benchmarks, and E2E system tests in GitHub Actions. +- [devantler-tech/platform](https://github.com/devantler-tech/platform) — Kubernetes platform using ksail for init → create → push OCI workflow, with progressive CI (Docker → Hetzner staging → Hetzner prod). From 97b7b1aa3d1c8a204295c91507b32baeaf1fb7ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 1 May 2026 17:20:03 +0000 Subject: [PATCH 02/16] docs: clarify ksail workflow stages in ways-of-working skill Agent-Logs-Url: https://github.com/devantler-tech/skills/sessions/d2ea36b1-3cc4-4611-9662-a3124f29de62 Co-authored-by: devantler <26203420+devantler@users.noreply.github.com> --- ways-of-working/SKILL.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index ad6894f..a5a8b8a 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -25,13 +25,13 @@ Follow the [test-driven-development](https://github.com/obra/superpowers/tree/ma ### Platform Engineering Tests -For platform engineering work the same categories apply, but the tooling shifts to [ksail](https://github.com/devantler-tech/ksail): +For platform engineering work the same categories apply, but the tooling shifts to [ksail](https://github.com/devantler-tech/ksail). This lets you develop Kubernetes platforms in the same build → run → publish loop as application code: -| Type | ksail equivalent | -|------|-----------------| -| Build / init | `ksail cluster init` | -| Run / test | `ksail cluster create` | -| Publish | `ksail workload push` (OCI artifacts) | +| Type | ksail equivalent | What it does | +|------|-----------------|--------------| +| Build / init | `ksail cluster init` | Scaffold a new cluster configuration | +| Run / test | `ksail cluster create` | Spin up the cluster locally (Docker) or on real infrastructure and verify workloads reconcile | +| Publish | `ksail workload push` | Push Kubernetes manifests as OCI artifacts to a container registry | ## Code Quality Gates (CI) From 0af04a1a0f1c6344f6c7108686d54f48353649ff Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:27:35 +0200 Subject: [PATCH 03/16] docs: update README to reflect first in-house skill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The repo description said 'not a publisher' and 'until one is added, releases are no-ops' — both stale now that ways-of-working is an in-house skill. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6b1442b..5d0b95e 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A curated index of generic [agent skills](https://agentskills.io) installable with the [`gh skill`](https://github.blog/changelog/2026-04-16-manage-agent-skills-with-github-cli/) CLI (v2.90.0+). -This repo is a **pointer list**, not a publisher. Each row below installs directly from its original upstream so `gh skill` records the true source in the skill's `SKILL.md` frontmatter (`metadata.github-repo`, `github-path`, `github-ref`, `github-tree-sha`) and `gh skill update --all` works natively — no lockfile, no sync bot, no custom metadata. +This repo is a **pointer list** and publisher of in-house skills. Each pointer row below installs directly from its original upstream so `gh skill` records the true source in the skill's `SKILL.md` frontmatter (`metadata.github-repo`, `github-path`, `github-ref`, `github-tree-sha`) and `gh skill update --all` works natively — no lockfile, no sync bot, no custom metadata. ## Skills @@ -98,7 +98,7 @@ All three rely on the `github-*` metadata that `gh skill install` injects into e This repository follows the [`agentskills.io`](https://agentskills.io) spec: skill directories live at the repository root and include a conformant `SKILL.md` at their root. Pull requests are validated by [`gh skill publish --dry-run`](.github/workflows/ci.yaml); releases are cut automatically by [semantic-release](https://semantic-release.gitbook.io/) on every push to `main` — [`release.yaml`](.github/workflows/release.yaml) uses [commit conventions](https://www.conventionalcommits.org/) to determine the next version, and [`cd.yaml`](.github/workflows/cd.yaml) then runs `gh skill publish` against the resulting tag. -The publish pipeline is retained for future in-house skills; until one is added, releases are no-ops. +The publish pipeline publishes in-house skills (e.g. `ways-of-working`) on each release. See the [devantler-tech organization guidelines](https://github.com/devantler-tech/.github) for PR/issue templates and general contribution rules. From fbad3f6aea089f5aca98b18ca3ba8fb28a6a567a Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:31:15 +0200 Subject: [PATCH 04/16] docs: add automated release strategy to ways-of-working skill Explains that release.yaml on push-to-main auto-calculates the next semver from conventional commits and creates the tag + GitHub release, which in turn triggers CD. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index a5a8b8a..4111b2d 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -79,6 +79,10 @@ Use **GitHub Flow**: | `merge_group` | CD to **dev** — deploy to staging infrastructure (e.g. Hetzner). | | Semver tag (`vX.X.X`) | CD to **prod** — `ksail cluster update`, `ksail workload push`, `ksail workload reconcile`. | +### Releases + +Releases are automated via a reusable `release.yaml` workflow triggered on `push` to `main`. The workflow calculates the next semver from [conventional commit](https://www.conventionalcommits.org/) history (`default_bump: none` — no release when commits carry no bump-worthy prefix). When a bump is warranted, the workflow creates the semver tag and GitHub release, which in turn triggers the CD pipeline above. + ## Data-Driven Improvement - Use **benchmarking data** to guide performance improvements — don't optimise without numbers. From 26a9b4653799af132fc0b5c717ab477de186e214 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:33:41 +0200 Subject: [PATCH 05/16] docs: add agent-first development workflow to ways-of-working skill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents the issue → plan → implement flow, referencing the four devantler-tech/.github issue templates (Feature, Bug, Chore, Kata). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 4111b2d..6ef0071 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -10,6 +10,18 @@ license: Apache-2.0 # Ways of Working +## Development Workflow + +Development is agent-first — every change starts as a structured issue and flows through plan → implement → review: + +1. **Create an issue** using the [devantler-tech/.github issue templates](https://github.com/devantler-tech/.github/tree/main/.github/ISSUE_TEMPLATE): + - **Feature** — user story with acceptance criteria. + - **Bug** — expected vs actual behavior with reproduction steps. + - **Chore** — user story with acceptance criteria for general tasks. + - **Kata** — Improvement Kata for continuous improvement (problem → definition of awesome → target condition → actions). +2. **Plan** — create a structured implementation plan from the issue before writing code. +3. **Implement** — execute the plan following the practices in this skill (TDD, quality gates, GitHub Flow, CI/CD). + ## Testing Follow the [test-driven-development](https://github.com/obra/superpowers/tree/main/skills/test-driven-development) skill rigorously — write the test first, watch it fail, write minimal code to pass. From 29b7dbde92f7ad3896c8c6bb2d359c1fcba3a604 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:35:34 +0200 Subject: [PATCH 06/16] docs: add root-cause, upstream-first, and no-permanent-workarounds principles Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 6ef0071..ebc7264 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -55,6 +55,12 @@ Every pull request **must** pass: - **No code coverage regression** — coverage must not decrease compared to the base branch. - **No benchmark regression** — benchmark results must not regress compared to the base branch. +## Problem Solving + +- **Fix at the root cause** — never patch symptoms. Trace every bug or failure to its origin and fix it there. +- **Workarounds are always temporary** — if a workaround is unavoidable, mark it clearly (e.g. `// WORKAROUND:` comment with a linked issue) and schedule its removal. +- **Upstream first** — when a fix belongs in a dependency or upstream project, contribute it there. Only carry a local patch until the upstream change is released. + ## Libraries Prefer popular, well-maintained third-party libraries over writing custom implementations. Only roll your own when no suitable library exists or when the dependency would be disproportionately heavy. From 933ecfd2cdb59b83625f4c55d872934d137e5358 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:36:36 +0200 Subject: [PATCH 07/16] docs: reference reusable create-release workflow in releases section Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index ebc7264..981ce6e 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -99,7 +99,7 @@ Use **GitHub Flow**: ### Releases -Releases are automated via a reusable `release.yaml` workflow triggered on `push` to `main`. The workflow calculates the next semver from [conventional commit](https://www.conventionalcommits.org/) history (`default_bump: none` — no release when commits carry no bump-worthy prefix). When a bump is warranted, the workflow creates the semver tag and GitHub release, which in turn triggers the CD pipeline above. +Releases are automated via the [`devantler-tech/reusable-workflows/.github/workflows/create-release.yaml`](https://github.com/devantler-tech/reusable-workflows/blob/main/.github/workflows/create-release.yaml) reusable workflow. It runs [semantic-release](https://semantic-release.gitbook.io/) on `push` to `main`, calculates the next semver from [conventional commit](https://www.conventionalcommits.org/) history, and creates the tag + GitHub release — which in turn triggers the CD pipeline above. ## Data-Driven Improvement From 551060817ffcfdae4058959939e5e477f3b902eb Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:37:52 +0200 Subject: [PATCH 08/16] docs: add manual testing step to development workflow Every change is validated hands-on before merging, with focus on UX presentation and ensuring all feedback is actionable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 981ce6e..a8f64ad 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -21,6 +21,7 @@ Development is agent-first — every change starts as a structured issue and flo - **Kata** — Improvement Kata for continuous improvement (problem → definition of awesome → target condition → actions). 2. **Plan** — create a structured implementation plan from the issue before writing code. 3. **Implement** — execute the plan following the practices in this skill (TDD, quality gates, GitHub Flow, CI/CD). +4. **Manual test** — validate behavior hands-on before merging. Focus on UX: output must be well-presented and every piece of feedback (errors, warnings, prompts) must be actionable. ## Testing From f971d317fd5fdc673ecdebbcd8f30804ae6a8d19 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 19:41:42 +0200 Subject: [PATCH 09/16] fix: align intro flow summary with actual workflow steps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The intro said 'plan → implement → review' but the numbered steps are issue → plan → implement → test. Updated to match. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index a8f64ad..ea7f995 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -12,7 +12,7 @@ license: Apache-2.0 ## Development Workflow -Development is agent-first — every change starts as a structured issue and flows through plan → implement → review: +Development is agent-first — every change starts as a structured issue and flows through issue → plan → implement → test: 1. **Create an issue** using the [devantler-tech/.github issue templates](https://github.com/devantler-tech/.github/tree/main/.github/ISSUE_TEMPLATE): - **Feature** — user story with acceptance criteria. From 60f6a7ac4249c039181a245a89be89ed72c0e79f Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:11:29 +0200 Subject: [PATCH 10/16] docs: add optional code review step and broaden skill description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Code review is optional — CI's strict gates are the primary feedback loop. Description updated to cover agent-first workflow, issue filing, planning, and debugging so agents activate the skill for those tasks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index ea7f995..3c4f498 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -1,10 +1,11 @@ --- name: ways-of-working description: >- - Codifies devantler-tech engineering practices: TDD, CI/CD pipelines, - GitHub Flow, benchmarking, code quality gates, and Kubernetes workflows - with ksail. Use when setting up new projects, configuring CI/CD, - writing tests, or making architectural decisions. + Codifies devantler-tech engineering practices: agent-first development + workflow, TDD, CI/CD pipelines, GitHub Flow, code quality gates, + and Kubernetes workflows with ksail. Use when filing issues, planning + work, setting up projects, configuring CI/CD, writing tests, debugging, + or making architectural decisions. license: Apache-2.0 --- @@ -12,7 +13,7 @@ license: Apache-2.0 ## Development Workflow -Development is agent-first — every change starts as a structured issue and flows through issue → plan → implement → test: +Development is agent-first — every change starts as a structured issue and flows through issue → plan → implement → test → review: 1. **Create an issue** using the [devantler-tech/.github issue templates](https://github.com/devantler-tech/.github/tree/main/.github/ISSUE_TEMPLATE): - **Feature** — user story with acceptance criteria. @@ -22,6 +23,7 @@ Development is agent-first — every change starts as a structured issue and flo 2. **Plan** — create a structured implementation plan from the issue before writing code. 3. **Implement** — execute the plan following the practices in this skill (TDD, quality gates, GitHub Flow, CI/CD). 4. **Manual test** — validate behavior hands-on before merging. Focus on UX: output must be well-presented and every piece of feedback (errors, warnings, prompts) must be actionable. +5. **Code review** (optional) — CI's strict linting, scanning, and quality gates are the primary feedback loop, so manual review is not always required. ## Testing From 37d0014b3396f856b5421c6438c5a5203bcc3789 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:17:03 +0200 Subject: [PATCH 11/16] docs: add CI/CD workflow structure and action componentization guidance One ci.yaml + one cd.yaml per repo, with local composite actions for simple steps and TypeScript actions for complex logic (locally testable, avoids unreadable bash-in-YAML). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 3c4f498..cb5894c 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -83,6 +83,11 @@ Use **GitHub Flow**: ## CI/CD Pipeline +Each repository has exactly two workflow files — `ci.yaml` and `cd.yaml`. Reusable logic is extracted into local GitHub Actions under `.github/actions/`: + +- **Composite actions** — for simple, self-contained steps. +- **TypeScript actions** — for anything complex, because they are locally testable and avoid hard-to-read bash embedded in YAML. + ### Application / Library Repositories | Event | What runs | From 92e67ddd8f8d8b48dd807e1b1d46b396eb6c0caf Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:21:02 +0200 Subject: [PATCH 12/16] docs: make platform testing explicit with app-repo equivalents and Testkube MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split testing into app/library vs platform/kubernetes subsections. Platform table now explicitly maps linting→unit, ephemeral cluster→integration, and real cluster→E2E, all using Testkube for test execution. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index cb5894c..7943ede 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -29,24 +29,32 @@ Development is agent-first — every change starts as a structured issue and flo Follow the [test-driven-development](https://github.com/obra/superpowers/tree/main/skills/test-driven-development) skill rigorously — write the test first, watch it fail, write minimal code to pass. -### Test Types +### Application / Library Repositories -| Type | Where to write | When to run | -|------|---------------|-------------| +| Type | Tooling | When to run | +|------|---------|-------------| | **Unit tests** | SDK test frameworks (e.g. `go test`, `xunit`, `jest`) | CI on every PR | | **Integration tests** | SDK test frameworks | CI on every PR | | **E2E / system tests** | GitHub Actions workflows that exercise the app/binary/service as an end user would | CI on every PR; move to `merge_group` if the suite becomes too heavy | | **Benchmark tests** | SDK benchmark frameworks (e.g. `BenchmarkDotNet`, `go test -bench`) | CI on every PR | -### Platform Engineering Tests +### Platform / Kubernetes Repositories + +For platform engineering work, [ksail](https://github.com/devantler-tech/ksail) provides the build → run → publish loop and [Testkube](https://testkube.io/) runs the actual test suites inside the cluster: + +| Type | App-repo equivalent | Tooling | What it does | +|------|---------------------|---------|--------------| +| **Linting / scanning** | Unit tests | Standard linters & scanners (e.g. kubeconform, kube-linter, Trivy) | Validate manifests statically — no cluster needed | +| **Integration tests** | Integration tests | Ephemeral local cluster (`ksail cluster create`) + Testkube | Spin up a Docker cluster, deploy workloads, and run Testkube test suites against them | +| **E2E / system tests** | E2E / system tests | Ephemeral or real cluster + Testkube | Deploy to a full environment (local or remote) and run end-to-end Testkube test suites | -For platform engineering work the same categories apply, but the tooling shifts to [ksail](https://github.com/devantler-tech/ksail). This lets you develop Kubernetes platforms in the same build → run → publish loop as application code: +Platform lifecycle commands: -| Type | ksail equivalent | What it does | -|------|-----------------|--------------| -| Build / init | `ksail cluster init` | Scaffold a new cluster configuration | -| Run / test | `ksail cluster create` | Spin up the cluster locally (Docker) or on real infrastructure and verify workloads reconcile | -| Publish | `ksail workload push` | Push Kubernetes manifests as OCI artifacts to a container registry | +| Command | Purpose | +|---------|---------| +| `ksail cluster init` | Scaffold a new cluster configuration | +| `ksail cluster create` | Spin up the cluster locally (Docker) or on real infrastructure and verify workloads reconcile | +| `ksail workload push` | Push Kubernetes manifests as OCI artifacts to a container registry | ## Code Quality Gates (CI) From 705d3863bd5b60d1eed4f090b5f7a5fc997b7dda Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:26:11 +0200 Subject: [PATCH 13/16] fix: align CI/CD section headings and terminology with testing section - Rename 'Kubernetes / Platform' heading to 'Platform / Kubernetes' to match the Testing section. - Change 'exactly two workflow files' to 'two core workflow files' and mention release.yaml as a third file. - Replace 'System test on a local Docker cluster' with 'Integration tests on an ephemeral local cluster' + Testkube to match the testing taxonomy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 7943ede..1d6a0f7 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -91,7 +91,7 @@ Use **GitHub Flow**: ## CI/CD Pipeline -Each repository has exactly two workflow files — `ci.yaml` and `cd.yaml`. Reusable logic is extracted into local GitHub Actions under `.github/actions/`: +Each repository has two core workflow files — `ci.yaml` and `cd.yaml` — plus a thin `release.yaml` that calls a reusable workflow (see [Releases](#releases)). Reusable logic is extracted into local GitHub Actions under `.github/actions/`: - **Composite actions** — for simple, self-contained steps. - **TypeScript actions** — for anything complex, because they are locally testable and avoid hard-to-read bash embedded in YAML. @@ -105,11 +105,11 @@ Each repository has exactly two workflow files — `ci.yaml` and `cd.yaml`. Reus | `push` to `main` | **Publish** artifacts (packages, container images, etc.). | | Semver tag (`vX.X.X`) | CD to **prod** environment. | -### Kubernetes / Platform Repositories +### Platform / Kubernetes Repositories | Event | What runs | |-------|-----------| -| `pull_request` | System test on a local Docker cluster (`ksail cluster create`). Move to `merge_group` if the suite becomes too heavy. | +| `pull_request` | Integration tests on an ephemeral local cluster (`ksail cluster create` + Testkube). Move to `merge_group` if the suite becomes too heavy. | | `merge_group` | CD to **dev** — deploy to staging infrastructure (e.g. Hetzner). | | Semver tag (`vX.X.X`) | CD to **prod** — `ksail cluster update`, `ksail workload push`, `ksail workload reconcile`. | From 604f6ddb79a6e7ef84cb88aedfeb3c7f6c55e3ea Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:27:09 +0200 Subject: [PATCH 14/16] fix: include linting/scanning in platform CI/CD pull_request row The testing section lists linting/scanning as the platform equivalent of unit tests, and the app CI/CD table includes it. The platform table was inconsistently omitting it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 1d6a0f7..f52b6fc 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -109,7 +109,7 @@ Each repository has two core workflow files — `ci.yaml` and `cd.yaml` — plus | Event | What runs | |-------|-----------| -| `pull_request` | Integration tests on an ephemeral local cluster (`ksail cluster create` + Testkube). Move to `merge_group` if the suite becomes too heavy. | +| `pull_request` | Linting & scanning (kubeconform, kube-linter, Trivy, etc.) plus integration tests on an ephemeral local cluster (`ksail cluster create` + Testkube). Move integration tests to `merge_group` if the suite becomes too heavy. | | `merge_group` | CD to **dev** — deploy to staging infrastructure (e.g. Hetzner). | | Semver tag (`vX.X.X`) | CD to **prod** — `ksail cluster update`, `ksail workload push`, `ksail workload reconcile`. | From 9a397421a9a9f52a227de89cdd910e8694fdd32a Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:27:43 +0200 Subject: [PATCH 15/16] docs: add upstream releasers (GoReleaser, dotnet-releaser) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ways-of-working/SKILL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index f52b6fc..95db4cd 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -117,6 +117,8 @@ Each repository has two core workflow files — `ci.yaml` and `cd.yaml` — plus Releases are automated via the [`devantler-tech/reusable-workflows/.github/workflows/create-release.yaml`](https://github.com/devantler-tech/reusable-workflows/blob/main/.github/workflows/create-release.yaml) reusable workflow. It runs [semantic-release](https://semantic-release.gitbook.io/) on `push` to `main`, calculates the next semver from [conventional commit](https://www.conventionalcommits.org/) history, and creates the tag + GitHub release — which in turn triggers the CD pipeline above. +For application publishing, always use upstream releasers — e.g. [GoReleaser](https://goreleaser.com/) for Go or [dotnet-releaser](https://github.com/xoofx/dotnet-releaser) for .NET — rather than hand-rolling publish scripts. + ## Data-Driven Improvement - Use **benchmarking data** to guide performance improvements — don't optimise without numbers. From f75e2218aa944db3348530039468ee817ba42008 Mon Sep 17 00:00:00 2001 From: Nikolai Emil Damm Date: Fri, 1 May 2026 20:57:12 +0200 Subject: [PATCH 16/16] fix: address review comments on README intro and merge queue wording - README: 'Each pointer row' -> 'Each row below is either an in-house skill or installs directly from its original upstream' - SKILL.md: soften merge queue step to handle repos without it configured Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- README.md | 2 +- ways-of-working/SKILL.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5d0b95e..547ac1b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A curated index of generic [agent skills](https://agentskills.io) installable with the [`gh skill`](https://github.blog/changelog/2026-04-16-manage-agent-skills-with-github-cli/) CLI (v2.90.0+). -This repo is a **pointer list** and publisher of in-house skills. Each pointer row below installs directly from its original upstream so `gh skill` records the true source in the skill's `SKILL.md` frontmatter (`metadata.github-repo`, `github-path`, `github-ref`, `github-tree-sha`) and `gh skill update --all` works natively — no lockfile, no sync bot, no custom metadata. +This repo is a **pointer list** and publisher of in-house skills. Each row below is either an in-house skill or installs directly from its original upstream so `gh skill` records the true source in the skill's `SKILL.md` frontmatter (`metadata.github-repo`, `github-path`, `github-ref`, `github-tree-sha`) and `gh skill update --all` works natively — no lockfile, no sync bot, no custom metadata. ## Skills diff --git a/ways-of-working/SKILL.md b/ways-of-working/SKILL.md index 95db4cd..1017285 100644 --- a/ways-of-working/SKILL.md +++ b/ways-of-working/SKILL.md @@ -87,7 +87,7 @@ Use **GitHub Flow**: 1. Create a feature branch from `main`. 2. Open a pull request. 3. Pass all CI checks. -4. Merge via merge queue (`merge_group`). +4. Merge via merge queue (`merge_group`) when the repository is configured for it; otherwise merge the pull request normally. ## CI/CD Pipeline