@cratis/pi 7.105.1 → 7.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/package/corpus/harnesses/copilot/instructions/profiles.instructions.md +1 -0
  2. package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +6 -5
  3. package/package/corpus/harnesses/copilot/instructions/review-reports.instructions.md +6 -0
  4. package/package/corpus/prompts/ship-changes.prompt.md +16 -3
  5. package/package/corpus/rules/issue-assignment.md +1 -0
  6. package/package/corpus/rules/profiles.md +1 -0
  7. package/package/corpus/rules/pull-requests.md +6 -5
  8. package/package/corpus/rules/review-reports.md +6 -0
  9. package/package/corpus/skills/cratis-ci-pipeline-performance/SKILL.md +1 -1
  10. package/package/corpus/skills/cratis-ci-pipeline-performance/references/flaky-and-hung-jobs.md +4 -2
  11. package/package/corpus/skills/cratis-code-review/SKILL.md +3 -0
  12. package/package/corpus/skills/cratis-code-review/verification.json +2 -1
  13. package/package/corpus/skills/cratis-engineering-ci-gates/LICENSE +2 -0
  14. package/package/corpus/skills/cratis-engineering-ci-gates/SKILL.md +172 -0
  15. package/package/corpus/skills/cratis-engineering-issue-hygiene/LICENSE +2 -0
  16. package/package/corpus/skills/cratis-engineering-issue-hygiene/SKILL.md +184 -0
  17. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/SKILL.md +3 -1
  18. package/package/corpus/skills/cratis-engineering-release-trains/LICENSE +2 -0
  19. package/package/corpus/skills/cratis-engineering-release-trains/SKILL.md +191 -0
  20. package/package/corpus/skills/cratis-engineering-release-trains/verification.json +20 -0
  21. package/package/corpus/skills/cratis-engineering-review-rounds/LICENSE +2 -0
  22. package/package/corpus/skills/cratis-engineering-review-rounds/SKILL.md +120 -0
  23. package/package/corpus/skills/cratis-engineering-review-rounds/verification.json +16 -0
  24. package/package/corpus/skills/run-tests/NOTICE +1 -0
  25. package/package/corpus/skills/run-tests/SKILL.md +5 -3
  26. package/package/profile-catalog.json +4 -0
  27. package/package.json +1 -1
@@ -87,6 +87,7 @@ profile includes neither Screenplay nor Stage.
87
87
  | Profile ID | Description | Automatically Includes |
88
88
  |---|---|---|
89
89
  | `cratis/engineering` | Engineering conventions and workflows | `cratis/engineering/core`, `cratis/engineering/csharp`, `cratis/engineering/elixir`, `cratis/engineering/go`, `cratis/engineering/kotlin`, `cratis/engineering/react`, `cratis/engineering/typescript` |
90
+ | `cratis/engineering/core` | Shared engineering method skills: `cratis-ci-pipeline-performance`, `cratis-documentation-writing`, `cratis-engineering-ci-gates`, `cratis-engineering-consolidation-guard`, `cratis-engineering-decision-record`, `cratis-engineering-docs-authoring`, `cratis-engineering-effect-boundaries`, `cratis-engineering-issue-hygiene`, `cratis-engineering-local-cross-repo-verification`, `cratis-engineering-regression-cluster`, `cratis-engineering-release-trains`, `cratis-engineering-review-rounds`, `cratis-release-notes`, `cratis-technical-examples` | (no child profiles) |
90
91
  | `cratis/engineering/csharp` | C# engineering conventions, .NET engineering skills, and framework Orleans jobs (`cratis-orleans-jobs`, alongside `orleans.md`) | `cratis/engineering/core`, `cratis/engineering/dotnet` |
91
92
  | `cratis/engineering/dotnet` | Upstream .NET engineering workflows | `cratis/engineering/dotnet/performance`, `cratis/engineering/dotnet/diagnostics`, `cratis/engineering/dotnet/msbuild`, `cratis/engineering/dotnet/orleans`, `cratis/engineering/dotnet/testing`, `cratis/engineering/dotnet/refactoring` |
92
93
  | `cratis/engineering/dotnet/performance` | Microbenchmarking, performance patterns, SIMD, and profiling | (no child profiles) |
@@ -126,9 +126,10 @@ intents do not.
126
126
  name the exact breaking change(s), who is affected and how, and the
127
127
  resulting version number. A generic "ready to ship?" is not this checkpoint —
128
128
  say plainly that this release breaks compatibility and needs a yes.
129
- - Proceed to merge only on an explicit, affirmative answer to that question.
130
- A prior general instruction to "ship" or "land this" does not answer it,
131
- even when it named `major` as the intended label.
129
+ - A human merges a `major` PR, after answering that question with an explicit
130
+ yes. An agent never merges it, even after the confirmation. A prior general
131
+ instruction to "ship" or "land this" does not answer it, even when it named
132
+ `major` as the intended label.
132
133
  - This checkpoint is per release, not per conversation — a human confirming
133
134
  one major release does not pre-authorize the next one.
134
135
 
@@ -156,7 +157,7 @@ A non-release pull request must satisfy the relevant required checks like any ot
156
157
 
157
158
  ### Group small related changes into one pull request
158
159
 
159
- Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change.
160
+ Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change. Joining an open candidate, folding superseded PRs and the cut are in `cratis-engineering-release-trains`.
160
161
 
161
162
  **Before consolidating open PRs, review each PR’s release intent and workflow effects.** Integration may trigger completion/publication behavior on an absorbed PR. Use supported non-release intent where appropriate. A direct request to consolidate the named pull requests authorizes the necessary relabeling and merge; it does not authorize unrelated notifications.
162
163
 
@@ -177,4 +178,4 @@ Before marking code/automation work ready, select the affected-project gates tha
177
178
  - `yarn lint` — zero errors
178
179
  - `npx tsc -b` — zero TypeScript errors
179
180
  - Code follows all project coding standards and conventions
180
- - **Required CI checks pass.** After an authorized push, inspect checks and failure logs. Diagnose within a bounded attempt, fix in-scope causes, and re-run relevant gates after each fix. Report unrelated/environmental failures and missing authority as blockers rather than retrying indefinitely or silently waiving required checks. If a release job fails after a concurrent merge (the release for the tag exists for another commit), re-run it: it releases under the next version (release-action v1.4.2 fails the job rather than reporting success).
181
+ - **Required CI checks pass.** After an authorized push, inspect checks and failure logs. Diagnose within a bounded attempt, fix in-scope causes, and re-run relevant gates after each fix. Report unrelated/environmental failures and missing authority as blockers rather than retrying indefinitely or silently waiving required checks. Waiting, cancelling and tiered local gates are in `cratis-engineering-ci-gates`. If a release job fails after a concurrent merge (the release for the tag exists for another commit), re-run it: it releases under the next version (release-action v1.4.2 fails the job rather than reporting success).
@@ -67,6 +67,12 @@ When a workflow requires a typed review envelope, preserve its schema and expres
67
67
  these sections, verdict meanings, and scope limits through its existing fields.
68
68
  Do not append a competing Markdown report or invent envelope fields.
69
69
 
70
+ ## Rounds
71
+
72
+ A follow-up round reviews only the delta since the last reviewed commit and carries prior
73
+ findings forward. Cap the rounds and prefer one structural fix over looping. See
74
+ `cratis-engineering-review-rounds`.
75
+
70
76
  ## Reviewer independence
71
77
 
72
78
  - **[contract]** Run a reviewer on a different provider family than the author's model
@@ -15,7 +15,7 @@ branch → commits → PR → merge → issue disposition → cleanup workflow.
15
15
 
16
16
  - **What changed** — brief description of the work (used for branch name and PR title)
17
17
  - **Label** — exactly one of `no-release`, `patch`, `minor`, or `major`, selected from the repository's release contract and applied in `gh pr create --label <intent>`
18
- - **Related issue** — optional exact repository and issue number; if unknown, search read-only first. Comment on or close it only when the user's request includes that effect; otherwise prepare the disposition as a proposal. In repositories released by `cratis/release-action`, a delivered issue is closed by release-action through `(#n)` in the description, but release-action does not run for a `no-release` PR, so `(#n)` closes nothing there; elsewhere follow the repository's own release and issue-closing process.
18
+ - **Related issue** — optional exact repository and issue number; if unknown, search read-only first. Comment on or close it only when the user's request includes that effect; otherwise prepare the disposition as a proposal. In repositories released by `cratis/release-action`, a delivered issue is closed by release-action through `(#n)` in the description, but release-action does not run for a `no-release` PR, so `(#n)` closes nothing there; elsewhere follow the repository's own release and issue-closing process. Keep the issue current and close it with a reason per `cratis-engineering-issue-hygiene`.
19
19
 
20
20
  Invoking this prompt is direct authority for the standard branch, commit, push, pull-request,
21
21
  requested-label, merge, and branch-cleanup effects. Do not pause to ask for separate approval at
@@ -24,8 +24,8 @@ and verify required checks before merging.
24
24
 
25
25
  **Exception: a `major` label does not carry merge authority.** Prepare the branch, commits, push,
26
26
  and PR labeled `major` as usual, then stop before merging. Ask a human to confirm the breaking
27
- change(s), who is affected, and the resulting version number, and merge only on an explicit
28
- affirmative answer to that specific question — see
27
+ change(s), who is affected, and the resulting version number; the human merges it after an
28
+ explicit yes to that specific question, and an agent never does — see
29
29
  [`pull-requests.md`](../rules/pull-requests.md#a-major-release-needs-a-humans-explicit-go-ahead).
30
30
  Every other label proceeds through merge under this prompt's ordinary authority.
31
31
 
@@ -33,6 +33,19 @@ This prompt is for an explicit request to ship or land. If the user asked only t
33
33
  push, or only to open a PR, stop after that step: the narrower request does not become authority
34
34
  for the rest of the chain because this prompt happens to be loaded.
35
35
 
36
+ ## Before you branch
37
+
38
+ Check for an open release candidate or PR in the repository before opening a new branch.
39
+ Group related work onto one branch and one PR, and join an open candidate instead of starting
40
+ another. The method is in the `cratis-engineering-release-trains` skill.
41
+
42
+ ## Waiting on checks and merging
43
+
44
+ Push only when the ship bar is met: root cause understood, specs added, local gate green,
45
+ review passed, issue and PR re-read, and no overlap with main. Then watch the exact run once
46
+ instead of polling it. Merge only after required checks pass. The method is in the
47
+ `cratis-engineering-ci-gates` skill. For review rounds, see `cratis-engineering-review-rounds`.
48
+
36
49
  ## Pull request description
37
50
 
38
51
  The description is published verbatim as the release notes, so it follows the contract in
@@ -29,3 +29,4 @@ up, or it looks abandoned while it is being done.
29
29
  The user's request to work on the issue is the authority for this assignment; do not ask
30
30
  before doing it. It authorizes assigning the issue and nothing else: commenting, labeling
31
31
  or closing still follow [pull-requests.md](./pull-requests.md) and the user's request.
32
+ - **After claiming,** keep the issue current per `cratis-engineering-issue-hygiene`.
@@ -86,6 +86,7 @@ profile includes neither Screenplay nor Stage.
86
86
  | Profile ID | Description | Automatically Includes |
87
87
  |---|---|---|
88
88
  | `cratis/engineering` | Engineering conventions and workflows | `cratis/engineering/core`, `cratis/engineering/csharp`, `cratis/engineering/elixir`, `cratis/engineering/go`, `cratis/engineering/kotlin`, `cratis/engineering/react`, `cratis/engineering/typescript` |
89
+ | `cratis/engineering/core` | Shared engineering method skills: `cratis-ci-pipeline-performance`, `cratis-documentation-writing`, `cratis-engineering-ci-gates`, `cratis-engineering-consolidation-guard`, `cratis-engineering-decision-record`, `cratis-engineering-docs-authoring`, `cratis-engineering-effect-boundaries`, `cratis-engineering-issue-hygiene`, `cratis-engineering-local-cross-repo-verification`, `cratis-engineering-regression-cluster`, `cratis-engineering-release-trains`, `cratis-engineering-review-rounds`, `cratis-release-notes`, `cratis-technical-examples` | (no child profiles) |
89
90
  | `cratis/engineering/csharp` | C# engineering conventions, .NET engineering skills, and framework Orleans jobs (`cratis-orleans-jobs`, alongside `orleans.md`) | `cratis/engineering/core`, `cratis/engineering/dotnet` |
90
91
  | `cratis/engineering/dotnet` | Upstream .NET engineering workflows | `cratis/engineering/dotnet/performance`, `cratis/engineering/dotnet/diagnostics`, `cratis/engineering/dotnet/msbuild`, `cratis/engineering/dotnet/orleans`, `cratis/engineering/dotnet/testing`, `cratis/engineering/dotnet/refactoring` |
91
92
  | `cratis/engineering/dotnet/performance` | Microbenchmarking, performance patterns, SIMD, and profiling | (no child profiles) |
@@ -125,9 +125,10 @@ intents do not.
125
125
  name the exact breaking change(s), who is affected and how, and the
126
126
  resulting version number. A generic "ready to ship?" is not this checkpoint —
127
127
  say plainly that this release breaks compatibility and needs a yes.
128
- - Proceed to merge only on an explicit, affirmative answer to that question.
129
- A prior general instruction to "ship" or "land this" does not answer it,
130
- even when it named `major` as the intended label.
128
+ - A human merges a `major` PR, after answering that question with an explicit
129
+ yes. An agent never merges it, even after the confirmation. A prior general
130
+ instruction to "ship" or "land this" does not answer it, even when it named
131
+ `major` as the intended label.
131
132
  - This checkpoint is per release, not per conversation — a human confirming
132
133
  one major release does not pre-authorize the next one.
133
134
 
@@ -155,7 +156,7 @@ A non-release pull request must satisfy the relevant required checks like any ot
155
156
 
156
157
  ### Group small related changes into one pull request
157
158
 
158
- Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change.
159
+ Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change. Joining an open candidate, folding superseded PRs and the cut are in `cratis-engineering-release-trains`.
159
160
 
160
161
  **Before consolidating open PRs, review each PR’s release intent and workflow effects.** Integration may trigger completion/publication behavior on an absorbed PR. Use supported non-release intent where appropriate. A direct request to consolidate the named pull requests authorizes the necessary relabeling and merge; it does not authorize unrelated notifications.
161
162
 
@@ -176,4 +177,4 @@ Before marking code/automation work ready, select the affected-project gates tha
176
177
  - `yarn lint` — zero errors
177
178
  - `npx tsc -b` — zero TypeScript errors
178
179
  - Code follows all project coding standards and conventions
179
- - **Required CI checks pass.** After an authorized push, inspect checks and failure logs. Diagnose within a bounded attempt, fix in-scope causes, and re-run relevant gates after each fix. Report unrelated/environmental failures and missing authority as blockers rather than retrying indefinitely or silently waiving required checks. If a release job fails after a concurrent merge (the release for the tag exists for another commit), re-run it: it releases under the next version (release-action v1.4.2 fails the job rather than reporting success).
180
+ - **Required CI checks pass.** After an authorized push, inspect checks and failure logs. Diagnose within a bounded attempt, fix in-scope causes, and re-run relevant gates after each fix. Report unrelated/environmental failures and missing authority as blockers rather than retrying indefinitely or silently waiving required checks. Waiting, cancelling and tiered local gates are in `cratis-engineering-ci-gates`. If a release job fails after a concurrent merge (the release for the tag exists for another commit), re-run it: it releases under the next version (release-action v1.4.2 fails the job rather than reporting success).
@@ -66,6 +66,12 @@ When a workflow requires a typed review envelope, preserve its schema and expres
66
66
  these sections, verdict meanings, and scope limits through its existing fields.
67
67
  Do not append a competing Markdown report or invent envelope fields.
68
68
 
69
+ ## Rounds
70
+
71
+ A follow-up round reviews only the delta since the last reviewed commit and carries prior
72
+ findings forward. Cap the rounds and prefer one structural fix over looping. See
73
+ `cratis-engineering-review-rounds`.
74
+
69
75
  ## Reviewer independence
70
76
 
71
77
  - **[contract]** Run a reviewer on a different provider family than the author's model
@@ -134,7 +134,7 @@ OS or framework matrix. Default: full matrix on `schedule` and
134
134
  rule states this). Pitfall: the full matrix needs an owner who reads its failures.
135
135
 
136
136
  **Flaky and hung jobs.** Fits failure-bound workflows. Default: a
137
- `timeout-minutes` on every job, `--blame-hang`, retry only a diagnosed flake, and
137
+ `timeout-minutes` on every job, `--blame-hang` with a mini dump, retry only a diagnosed flake, and
138
138
  quarantine a test with an issue. Pitfall: a blanket rerun hides the defect and
139
139
  doubles minutes. Read `references/flaky-and-hung-jobs.md`.
140
140
 
@@ -25,12 +25,14 @@ cost runner-minutes and developer trust; diagnose before retrying.
25
25
 
26
26
  ```bash
27
27
  dotnet test Repo.slnx --configuration Release --no-build \
28
- --blame-hang --blame-hang-timeout 5m --blame-crash \
28
+ --blame-hang --blame-hang-timeout 5m --blame-hang-dump-type mini \
29
+ --blame-crash --blame-crash-dump-type mini \
29
30
  --results-directory TestResults
30
31
  ```
31
32
 
32
33
  - This is the VSTest form. Microsoft.Testing.Platform projects use their own
33
- crash and hang dump extensions and options; do not mix the two sets of switches.
34
+ crash and hang dump extensions and options (`--hangdump-type Mini`, `--crashdump-type Mini`); do not mix the two sets of switches.
35
+ - Read the stack (for example `dotnet-dump analyze <file>` then `clrstack -all`), keep the text output, and delete the `.dmp` file. Use a full dump only for a named investigation that needs heap contents.
34
36
  - Upload `TestResults` as an artifact with `if: ${{ !cancelled() }}`, so the dump
35
37
  survives the failure.
36
38
 
@@ -177,6 +177,9 @@ correction before merge. Style preferences and maintainability improvements
177
177
  without such a consequence belong in Suggestions. Apply the shared verdict
178
178
  vocabulary to those findings.
179
179
 
180
+ For a follow-up round after blockers were fixed, review only the delta and carry prior
181
+ findings forward; see `cratis-engineering-review-rounds`.
182
+
180
183
  ## What breaks
181
184
 
182
185
  - **The review restates the compiler.** The gates were not run first, so
@@ -5,6 +5,7 @@
5
5
  "assertions": [
6
6
  { "kind": "skill-contains", "value": ".cratis/ai/rules/review-reports.md" },
7
7
  { "kind": "skill-contains", "value": "Correctness regressions, broken contracts" },
8
- { "kind": "skill-contains", "value": "Style preferences and maintainability improvements" }
8
+ { "kind": "skill-contains", "value": "Style preferences and maintainability improvements" },
9
+ { "kind": "skill-contains", "value": "cratis-engineering-review-rounds" }
9
10
  ]
10
11
  }
@@ -0,0 +1,2 @@
1
+ Copyright (c) Cratis. All rights reserved.
2
+ Licensed under the MIT license. See LICENSE file in the canonical Cratis/AI repository for the full license text.
@@ -0,0 +1,172 @@
1
+ ---
2
+ name: cratis-engineering-ci-gates
3
+ description: Run CI-matched local gates and watch exact workflow runs without polling or wasting checks. Use when choosing a local gate or tier, deciding how to wait for CI, starting a blocking watch, or deciding which superseded runs to cancel. Not for grouping deliveries (use cratis-engineering-release-trains), review iterations (use cratis-engineering-review-rounds), or editing workflows for speed (use cratis-ci-pipeline-performance).
4
+ license: LICENSE
5
+ compatibility: Requires git and the GitHub CLI (gh).
6
+ ---
7
+
8
+ <!-- Copyright (c) Cratis. All rights reserved. -->
9
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
10
+
11
+ # Run the gate once, then watch the exact run
12
+
13
+ Operate checks; do not redesign workflows here. Read
14
+ [verification-discipline.md](../../rules/verification-discipline.md) for phase
15
+ budgets and exit-status handling, and
16
+ [pull-requests.md](../../rules/pull-requests.md#quality-gates) for required checks.
17
+ Read [capability-is-not-authority.md](../../rules/capability-is-not-authority.md)
18
+ before an external effect. A request to verify does not authorize a push.
19
+
20
+ ## Derive the local gate
21
+
22
+ 1. Read `.github/workflows/` and the repository's tier policy. Follow reusable
23
+ workflows and invoked scripts. Extract commands, solution and test selection,
24
+ configuration, warning settings, analyzers, lint and formatting checks.
25
+ 2. Prefer the repository's existing gate script. If none exists, keep a small
26
+ local runner under `.ai-work/`, with each phase's real exit status preserved.
27
+ Do not substitute only the touched projects for the final gate.
28
+ 3. **Tier 1** is the whole-solution build with CI's configuration and warning
29
+ settings, lint/format, and every non-integration test project. For example,
30
+ use Release with warnings as errors when that is what CI uses.
31
+ 4. **Tier 2** adds integration tests. The repository's tier policy decides
32
+ whether they run locally. The default is CI-backed integration only if CI
33
+ runs that coverage, it passes before merge, and reviewer notes say it was
34
+ deferred to CI. If CI lacks that coverage, do not claim it is verified.
35
+ 5. Name anything CI runs that cannot run locally: services, platforms, secrets
36
+ or hosted checks. Say what ran instead and what remains unverified before
37
+ pushing. Missing coverage is not a local pass.
38
+
39
+ Use affected-project checks while coding and writing specifications. Build once
40
+ at the end: run the full local gate when the work is believed complete, not after
41
+ every edit. Do not repeat a passing gate on unchanged inputs for reassurance.
42
+ When several deliveries form one candidate, the assembler runs the final gate
43
+ on the assembled state; deliveries bring targeted results. A changed state after
44
+ a failure needs the required gate again.
45
+
46
+ Keep build, lint and test phases separate, each with a deadline. Stop on failure;
47
+ do not run dependent phases or hide a producer's exit status behind a filter.
48
+ Report the exact command and result. Put verification and deferred coverage in
49
+ reviewer comments, not the release-note description.
50
+
51
+ ## Wait without polling
52
+
53
+ After an authorized push, capture the full head SHA and discover the run for the
54
+ intended workflow. For example:
55
+
56
+ ```bash
57
+ head_sha=$(git rev-parse HEAD)
58
+ gh run list --repo OWNER/REPO --workflow ci.yml --commit "$head_sha" \
59
+ --json databaseId,headSha,event,status
60
+ ```
61
+
62
+ Select the exact run ID, not the newest run by time or branch alone. Disambiguate
63
+ multiple events or dispatches for the same SHA. Capture one ID per required
64
+ workflow. If no matching run is visible, report that no run was captured; do not
65
+ start a status-query loop or guess an ID.
66
+
67
+ Start one blocking watch for that run, with a deadline sized to the repository:
68
+
69
+ ```bash
70
+ gh run watch <id> --repo OWNER/REPO --exit-status
71
+ ```
72
+
73
+ A background job, if the harness has one, can hold the same blocking watch.
74
+ Never re-query status by hand. Use the watch's completion and exit status, not
75
+ repeated `gh run list`, `gh run view` or PR-check requests while waiting.
76
+
77
+ Say: "Waiting on CI run <id> for the current PR head." Do independent work while
78
+ it runs. If none remains, end the turn. If the watch cannot finish in the session,
79
+ leave a handoff under `.ai-work/` with the SHA, run ID and outstanding checks;
80
+ report the wait as incomplete, not successful. A watch timeout does not cancel
81
+ the remote run and is not a failed-test diagnosis.
82
+
83
+ ## Diagnose once, fix together
84
+
85
+ After the run completes with a failure:
86
+
87
+ 1. Read the failed logs once, for example
88
+ `gh run view <id> --repo OWNER/REPO --log-failed`.
89
+ 2. Check other jobs in that completed run, for example
90
+ `gh run view <id> --repo OWNER/REPO --json jobs`. Account for every failure,
91
+ including independent failures beyond the first red job.
92
+ 3. Fix all in-scope causes together. Report unrelated or unavailable causes as
93
+ blockers rather than silently waiving them. Re-run the required local gate
94
+ on the fixed state, then push once when the request authorizes it.
95
+ 4. Rerun a job only for a diagnosed flake, including a demonstrated transient
96
+ infrastructure failure, and only after the run completes. For example,
97
+ `gh run rerun <id> --repo OWNER/REPO --failed` retries failed jobs. Watch the
98
+ resulting attempt once. A deterministic failure needs a fix, not a retry.
99
+
100
+ Never put a CI skip token in a title or commit. Do not spend a push on each
101
+ individual fix or use CI to discover whether speculative fixes compile.
102
+
103
+ ## Cancel only owned, superseded work
104
+
105
+ Cancellation needs a reason and an exact target. Within an authorized shipping
106
+ or folding request, cancel only runs started by the session's own superseded or
107
+ folded pushes. Anyone else's run needs the owner's agreement. Merely sharing a
108
+ branch or finding a duplicate run does not establish ownership.
109
+
110
+ Before acting, inspect each candidate, for example:
111
+
112
+ ```bash
113
+ gh run view <id> --repo OWNER/REPO \
114
+ --json workflowName,event,headBranch,headSha,status,createdAt
115
+ ```
116
+
117
+ Confirm the initiating push, workflow and SHA against the superseding head or
118
+ folded PR. Inspect the workflow's jobs if its effects are unclear. Never cancel
119
+ a release, publish or deploy run, regardless of ownership or workflow name.
120
+ Do not cancel a check whose result a queued or running publication needs, or a
121
+ required check about to gate a merge. Another owner's watched merge run needs
122
+ that owner's agreement. Even with agreement, release, publish and deploy runs
123
+ and checks needed by publication remain protected.
124
+
125
+ Re-read immediately before cancelling so drift cannot widen the target. Do not
126
+ cancel by branch, name or age alone, or use a bulk cancellation command. Once
127
+ confirmed, for example:
128
+
129
+ ```bash
130
+ gh run cancel <id> --repo OWNER/REPO
131
+ ```
132
+
133
+ Report one line naming the run ID and superseding or folding reason. If ownership
134
+ or downstream use is uncertain, leave it running and report the uncertainty.
135
+
136
+ ## Integration and containers
137
+
138
+ Run local integration only when the tier policy calls for it or a bounded
139
+ cross-repository proof needs it. Give every container phase and Docker call a
140
+ deadline, including startup, image builds, tests and teardown. A background job
141
+ is not a timeout or a cleanup policy.
142
+
143
+ Keep track of the containers and networks created by the phase. On success,
144
+ failure, timeout or abandonment, stop and remove only those owned resources.
145
+ Use exact IDs or a task-specific Compose project; confirm ownership before
146
+ removal. Do not restart a shared daemon or stop another task's services.
147
+ Never run `docker system prune -a` or `docker image prune -a`.
148
+
149
+ When a test run hangs, ask for a mini hang dump (`--blame-hang-dump-type mini` on VSTest, `--hangdump-type Mini` on Microsoft.Testing.Platform). Read the stack (for example `dotnet-dump analyze <file>` then `clrstack -all`), keep the text output, and delete the `.dmp` file. Use a full dump only for a named investigation that needs heap contents.
150
+
151
+ For a repository's Compose test setup, one scoped teardown example is
152
+ `docker compose -p <task-project> down`, under its own deadline. Do not add
153
+ volume deletion unless those volumes are disposable and owned by this task.
154
+ Keep secrets out of logs and artifacts per
155
+ [secrets.md](../../rules/secrets.md).
156
+
157
+ ## What breaks
158
+
159
+ - An affected-project build presented as Tier 1 leaves other projects unchecked.
160
+ - A green Tier 1 presented as integration proof hides coverage deferred to CI.
161
+ - Watching a branch's newest run can report success for the wrong SHA.
162
+ - Manual polling duplicates the watch and wastes time without improving proof.
163
+ - Blind retries and one push per failure spend checks without fixing the run.
164
+ - Broad container cleanup destroys resources the phase does not own.
165
+
166
+ ## How it is proven
167
+
168
+ The derived local commands exit successfully on the final state. The blocking
169
+ watch for each required run exits successfully for the exact head SHA, including
170
+ integration coverage deferred to CI. A timeout, cancellation, missing check or
171
+ unobserved result stays unverified. Report local results, CI results and omissions
172
+ separately; no inventory or receipt substitutes for running the checks.
@@ -0,0 +1,2 @@
1
+ Copyright (c) Cratis. All rights reserved.
2
+ Licensed under the MIT license. See LICENSE file in the canonical Cratis/AI repository for the full license text.
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: cratis-engineering-issue-hygiene
3
+ description: Keep GitHub issues current and reduce unfinished work with a single-writer status block and reasoned disposition. Use when maintaining an issue status block, deciding who may claim an issue, whether to close completed work, or whether to file a necessary follow-up. Not for grouping deliveries (use cratis-engineering-release-trains), review iterations (use cratis-engineering-review-rounds), workflow optimization (use cratis-ci-pipeline-performance), or CI operations (use cratis-engineering-ci-gates).
4
+ license: LICENSE
5
+ compatibility: Requires git and the GitHub CLI (gh).
6
+ ---
7
+
8
+ <!-- Copyright (c) Cratis. All rights reserved. -->
9
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
10
+
11
+ # Leave fewer issues, with a truthful description
12
+
13
+ An issue must make sense to a reader outside the session. Keep its present state
14
+ in the description and meaningful events in the timeline. Before any mutation,
15
+ read [capability-is-not-authority.md](../../rules/capability-is-not-authority.md).
16
+ The request authorizes its named effects, not arbitrary filing or closing.
17
+
18
+ ## One writer and a clear claim
19
+
20
+ One person or session owns all body edits, comments and disposition for a named
21
+ issue. Delegated workers report findings to that owner. An explicit handoff can
22
+ transfer the named issue, but the previous writer must stop editing it. GitHub
23
+ body edits are not conditional writes; a last-minute reread alone cannot prevent
24
+ two writers from overwriting each other.
25
+
26
+ Before starting, read the issue, comments, assignees and any status block. Follow
27
+ [issue-assignment.md](../../rules/issue-assignment.md) to claim it. Do not replace
28
+ an existing assignment. If another writer is already active, coordinate rather
29
+ than starting a parallel edit. A failed assignment is not a blocker to the work.
30
+
31
+ When the request covers maintaining the issue, set the status block to
32
+ **In progress** before coding. Keep it true as work moves: **In review** for the
33
+ open PR, **Blocked** with the dependency, **Paused** when no active work remains,
34
+ and **Done** only when delivery is confirmed. Never leave In progress behind
35
+ when the writer stops.
36
+
37
+ ## Put the status block in the description
38
+
39
+ Preserve the original problem statement and all text outside the managed block.
40
+ Append the block if absent. Stop for coordination if markers are malformed,
41
+ duplicated or already managed by another active writer. A minimal template is:
42
+
43
+ ```markdown
44
+ <!-- agent-status:start -->
45
+ ## Status
46
+ **State:** In progress
47
+ **Scope:** Deliver the agreed behavior and its regression specification.
48
+ **Approach:** Fix the shared decision and exercise it through the public API.
49
+ **PR:** Not opened.
50
+ **Delivered:** Nothing yet.
51
+ **Remaining:** Implement, verify, review and deliver.
52
+ **Follow-ups:** None.
53
+ <!-- agent-status:end -->
54
+ ```
55
+
56
+ Replace the example with the real scope and remaining work. Use public PR or
57
+ issue URLs when they exist. Summarize a local plan; never link its file path.
58
+ Do not put local paths, harness commands, credentials or private context in
59
+ public issue or PR text. Read [secrets.md](../../rules/secrets.md) before handling
60
+ output, and [local-work-artifacts.md](../../rules/local-work-artifacts.md) before
61
+ creating the private working copy.
62
+
63
+ For example, read the body into an ignored local working file:
64
+
65
+ ```bash
66
+ gh issue view <n> --repo OWNER/REPO --json body --jq .body > .ai-work/issue-body.md
67
+ ```
68
+
69
+ Edit only the managed block in that file. Immediately before writing, re-read
70
+ both the issue and any linked PR. Read the remote body again:
71
+
72
+ ```bash
73
+ gh issue view <n> --repo OWNER/REPO --json body
74
+ ```
75
+
76
+ Compare it with the body used to prepare the edit. If anything changed, preserve
77
+ those changes and recompose from the fresh body. If concurrent edits continue,
78
+ stop and coordinate with the other writer. Do not write a stale whole body.
79
+ After a clean comparison, write the complete preserved body back, for example:
80
+
81
+ ```bash
82
+ gh issue edit <n> --repo OWNER/REPO --body-file .ai-work/issue-body.md
83
+ gh issue view <n> --repo OWNER/REPO --json body
84
+ ```
85
+
86
+ Verify the block changed as intended and the surrounding content stayed intact.
87
+ Do not paste the private working-file path into the issue.
88
+
89
+ ## Description versus comment
90
+
91
+ Edit the status block for current scope, decisions, approach, checklist, linked
92
+ PRs, dependencies and what remains. The description alone should explain the
93
+ present state. Do not rewrite other people's text or replace the original report.
94
+
95
+ Comment only for an event worth notifying readers about: a decision or scope
96
+ change with its reason, a human blocker, a delivery milestone or a closing
97
+ summary. Each comment stands alone: what happened, why it matters, what comes
98
+ next. Use absolute public URLs. Do not repeat the block as a comment or post
99
+ "working on it", tool output, test counts, receipts or model/session chatter.
100
+
101
+ Re-read the issue and PR before every key step: starting, changing scope,
102
+ updating public state, filing follow-ups, merging or disposing of the issue.
103
+ For example, use `gh issue view <n> --repo OWNER/REPO --comments` and
104
+ `gh pr view <pr> --repo OWNER/REPO`. Do not act on an old summary after drift.
105
+
106
+ ## Make the open-issue count go down
107
+
108
+ 1. **Fix before filing.** Fix a small, in-scope finding in the same files and
109
+ risk area as the active change. Do not widen scope to improve the count.
110
+ Review advisories are fixed cheaply inline or dropped, not filed as issues.
111
+ 2. **File only when needed and authorized.** A real defect that cannot be fixed
112
+ now, or a follow-up delivery truly requires, may need an issue. Search open
113
+ and closed issues first, for example
114
+ `gh issue list --repo OWNER/REPO --state all --search "<area> in:title,body"`.
115
+ Reuse an existing issue instead of duplicating it; comment only when that
116
+ effect is authorized and adds necessary context.
117
+ 3. Group related findings into one checklist issue per area. Include concrete,
118
+ testable `## Acceptance criteria`. No speculative hardening, ideas or
119
+ "investigate later" issues. If filing is outside the request, list necessary
120
+ follow-ups in the report instead of creating them.
121
+ 4. **Close what is done**, through the correct delivery mechanism below. Partial
122
+ delivery stays open with exactly what remains. Do not manufacture completion
123
+ or create extra issues merely to move unfinished scope elsewhere.
124
+ 5. Prefer bounded issues that can be finished completely over starting large
125
+ epics. Report completed dispositions, not how many new issues were produced.
126
+
127
+ ## Close with a reason, through the owning mechanism
128
+
129
+ Read [pull-requests.md](../../rules/pull-requests.md#issue-references) before
130
+ changing issue references or disposition. Confirm the actual PR state, release
131
+ intent and repository workflow; a merged PR is not proof of a published release.
132
+
133
+ - **Release-action delivery:** for a fully delivered issue, the delivering
134
+ release-note bullet ends with `(#n)`. Release-action closes it at release;
135
+ do not close it by hand. If release is pending, keep that dependency visible.
136
+ - **Manual completion:** only for a `no-release` PR or a repository without
137
+ release-action, and only when the request includes closing. Confirm all scope
138
+ is delivered and no required PR is open, unmerged, reverted or failing. Set
139
+ Done and close with reason `completed` and a public delivery link.
140
+ - **Duplicate or obsolete:** only with clear evidence and authority. Use reason
141
+ `not planned`, explain why, and link the canonical issue or superseding work.
142
+ If uncertain, leave it open and report the question.
143
+ - **Partial or unauthorized disposition:** leave it open with truthful remaining
144
+ scope or report the proposed disposition. Do not invent follow-up authority.
145
+
146
+ For an authorized manual completion, for example:
147
+
148
+ ```bash
149
+ gh issue close <n> --repo OWNER/REPO --reason completed \
150
+ --comment "Delivered in <public PR URL>. The agreed behavior is available."
151
+ ```
152
+
153
+ A duplicate uses `--reason "not planned"` and a specific canonical public URL.
154
+ No closing keywords are needed in the PR description; follow the owning rule.
155
+
156
+ ## End-of-work audit
157
+
158
+ List issues touched by this work and reconcile each against its PR and release.
159
+ For example, `gh issue list --repo OWNER/REPO --assignee @me --state open` helps
160
+ find assigned work, but does not replace the list of issues actually touched.
161
+ Check merged PRs for completed work still open; distinguish pending release-action
162
+ closure from an authorized manual disposition. Verify closure through the issue's
163
+ actual state, not an assumption about merging.
164
+
165
+ Leave no issue In progress without an active writer. For unfinished work, set
166
+ Paused or Blocked with what remains and what it waits for. Reconcile follow-ups
167
+ with existing issues. Perform only authorized mutations; otherwise report the
168
+ proposed changes and the blocker. Summarize completed issues, pending release
169
+ closures and unfinished scope without publishing local paths or harness details.
170
+
171
+ ## How it is proven
172
+
173
+ Read the final body and state, for example with
174
+ `gh issue view <n> --repo OWNER/REPO --json body,state`. The original report is
175
+ intact, the status block matches the actual PR and release, and any authorized
176
+ closure is observable. Until release-action runs, pending closure is not Done.
177
+
178
+ ## What breaks
179
+
180
+ - Two body writers lose each other's updates even if both reread first.
181
+ - A status comment buries current state and needlessly notifies subscribers.
182
+ - Manual closure before release bypasses release-action's delivery contract.
183
+ - Filing every advisory grows the backlog without a necessary delivery.
184
+ - Stale In progress blocks the next person without anyone doing the work.
@@ -27,7 +27,9 @@ Also use this loop for:
27
27
  Prefer a release/preview for trivial changes, external consumers unable to use
28
28
  the local feed, or CI-only behavior this loop cannot reproduce.
29
29
 
30
- **Local verification replaces waiting, not shipping.** After local proof, release
30
+ **Local verification replaces waiting, not shipping.** Other waits a candidate
31
+ can avoid are in [cratis-engineering-release-trains](../cratis-engineering-release-trains/SKILL.md).
32
+ After local proof, release
31
33
  the producer through the normal authorized workflow and bump the consumer to the
32
34
  released version. Local feeds, pins and images never go into production or a PR.
33
35
  Single-repository work needs its own regression specs, not this overlay. Released
@@ -0,0 +1,2 @@
1
+ Copyright (c) Cratis. All rights reserved.
2
+ Licensed under the MIT license. See LICENSE file in the canonical Cratis/AI repository for the full license text.
@@ -0,0 +1,191 @@
1
+ ---
2
+ name: cratis-engineering-release-trains
3
+ description: Group related deliveries into one release candidate, fold superseded pull requests, and apply a ship bar before publishing the assembled change. Use when asked to group finished branches, join an open PR, fold superseded PRs, size a candidate, or decide whether the ship bar is met. Not for waiting on checks (use cratis-engineering-ci-gates), planning review rounds (use cratis-engineering-review-rounds), or optimizing workflow performance (use cratis-ci-pipeline-performance).
4
+ license: LICENSE
5
+ compatibility: Requires git and the GitHub CLI (gh).
6
+ ---
7
+
8
+ <!-- Copyright (c) Cratis. All rights reserved. -->
9
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
10
+
11
+ # One assembled candidate, one release
12
+
13
+ A **candidate** is the branch assembling deliveries intended to ship together.
14
+ A repository includes its main checkout and all its worktrees. Consider their
15
+ concurrent work together, not as separate releases merely because it has
16
+ separate branches. One person or session assembles the candidate.
17
+
18
+ ## Authority and routing
19
+
20
+ Read [capability-is-not-authority.md](../../rules/capability-is-not-authority.md)
21
+ and the [ship-changes prompt](../../prompts/ship-changes.prompt.md) before any
22
+ external effect. A user's ship request authorizes its ordinary shipping steps;
23
+ loading this skill does not turn an implementation-only request into shipping.
24
+ Without that request, prepare the grouping and report the proposed next action.
25
+
26
+ Read [pull-requests.md](../../rules/pull-requests.md) for release intent, split
27
+ criteria, release notes, issue dispositions, and the human checkpoint for a
28
+ major release. A major release is never merged by an agent: a human confirms
29
+ and merges it. Agent work stops at preparing the PR, even after confirmation.
30
+ Read [git-commits.md](../../rules/git-commits.md) before assembling
31
+ branches. Preserve commits: never squash, rebase, amend, or force-push.
32
+
33
+ Use `cratis-engineering-consolidation-guard` when folding existing PRs to prove
34
+ nothing was dropped. Use `cratis-engineering-ci-gates` for gate selection and
35
+ run handling, and `cratis-engineering-review-rounds` for proportionate review.
36
+
37
+ ## Choose the candidate before creating a PR
38
+
39
+ 1. Inspect the repository's worktrees, finished branches, and open PRs:
40
+
41
+ ```bash
42
+ git worktree list
43
+ gh pr list --state open --json number,headRefName,title,author
44
+ ```
45
+
46
+ 2. Group related, ready deliveries under one candidate and one PR. Check with
47
+ the person assembling an existing candidate before changing it. Independent
48
+ work branches start from `origin/main`; work that depends on an unmerged
49
+ candidate may start from that candidate's latest commit (see Replace waits
50
+ with local work). Ongoing work keeps its branch.
51
+ Do not edit another session's checkout or include its uncommitted work.
52
+ 3. Prefer joining a related open PR that is still accepting deliveries, has no
53
+ checks running, and is not being merged by another session. Agree on its
54
+ writer, merge `origin/main` into its branch, then merge the deliveries and
55
+ extend its release note. Do not open a competing PR while it is being cut.
56
+ 4. If no candidate exists, create a branch from current `origin/main` and merge
57
+ ready delivery branches with merge commits. Keep each logical change in its
58
+ own commits. Return a conflicting or failing delivery for correction rather
59
+ than guessing its intent in the assembled branch.
60
+ 5. Keep one candidate per repository by default. Apply the split criteria in
61
+ `pull-requests.md` for unrelated work, different risk, or an urgent fix. Name
62
+ the exception in the reviewer comment; a major awaiting human confirmation
63
+ must not silently hold unrelated safe work indefinitely.
64
+
65
+ Minimal assembly, after agreeing on the included deliveries:
66
+
67
+ ```bash
68
+ git fetch origin
69
+ git switch -c release-candidate origin/main
70
+ git merge --no-ff delivery-a
71
+ git merge --no-ff delivery-b
72
+ ```
73
+
74
+ Use a new branch name if `release-candidate` already exists. This example does
75
+ not authorize publication. Run the assembled gates before the shipping push.
76
+
77
+ ## Fold superseded PRs promptly
78
+
79
+ Once a fold is decided within the authorized shipping scope, stop pushing to
80
+ its old branch. Close the superseded PR with a one-line reason:
81
+ `Folded into <candidate branch or PR>`; use `Will be folded into <candidate>`
82
+ when assembly is still pending. Do not wait for the candidate's push to retire
83
+ a PR that is already known to be superseded.
84
+
85
+ Move its delivered release-note bullets into the candidate's release note,
86
+ following `pull-requests.md`; retain only issues actually delivered by the diff.
87
+ Before consolidation, check release intent and publication effects and apply
88
+ `cratis-engineering-consolidation-guard`.
89
+
90
+ Identify the exact queued or in-progress runs for the superseded head. Cancel
91
+ only runs started by this session's own superseded pushes. Never cancel a
92
+ release, publish, or deploy run, or another session's watched merge. Leave
93
+ others running and report them. Follow `cratis-engineering-ci-gates` for the
94
+ cancellation checks; folding a PR is not blanket cancellation authority.
95
+
96
+ ## Size by readiness, then freeze
97
+
98
+ Before the final gate, list in-flight deliveries and their expected readiness.
99
+ Hold the cut for work expected ready within about one gate duration, so the
100
+ assembled gate runs once on the larger set. Cut without work further out or
101
+ blocked on a design decision, consumer proof, or another repository.
102
+
103
+ After the cut, nothing joins. Late deliveries go into the next candidate.
104
+ Corrections needed to make the frozen candidate pass are not new deliveries;
105
+ rerun the affected required gates for that changed code state.
106
+
107
+ Record the cut and readiness estimates in one line in the reviewer comment,
108
+ not the release note: `Cut with A and B; C waits for consumer proof.` Keep local
109
+ coordination records under `.ai-work/`, never in public release text.
110
+
111
+ ## Replace waits with local work
112
+
113
+ Most waits are removable. The build queue is the only legitimate one; while
114
+ queued, do the next independent piece of work.
115
+
116
+ - Base work on a committed local candidate instead of waiting for it to reach
117
+ main, and say which candidate commit it is based on when delivering.
118
+ - Prove against locally built packages instead of waiting for a release; see
119
+ [cratis-engineering-local-cross-repo-verification](../cratis-engineering-local-cross-repo-verification/SKILL.md).
120
+ Only the final version pin waits for the release.
121
+ - Drop an item that has been stuck for about two hours rather than holding the
122
+ candidate; it joins the next one.
123
+ - Cut a candidate at least every few hours with whatever is green.
124
+
125
+ ## Apply the ship bar
126
+
127
+ Check these six conditions. If one is missing, stop and report it instead of
128
+ making a speculative shipping push. Recheck the merge conditions after CI.
129
+
130
+ 1. **Cause and design understood.** The change solves the named problem using
131
+ established conventions. Product questions are resolved, not guessed.
132
+ 2. **Behavior proved.** Changed behavior has specifications, or an explicit
133
+ reason why they do not apply. The assembled local gate is green. Required
134
+ integration coverage follows repository policy and must pass before merge;
135
+ name anything that cannot run locally rather than calling it a local pass.
136
+ 3. **Whole change reviewed.** The candidate has a completed review without
137
+ Blockers or missing required evidence. Targeted delivery reviews alone do
138
+ not satisfy this condition.
139
+ 4. **Release decision settled.** Release intent follows `pull-requests.md`.
140
+ For a major release, require explicit human confirmation and human merge.
141
+ An agent never merges it; preparing the PR does not answer that checkpoint.
142
+ 5. **Conversation reread.** Re-read the issues and PR, including comments and
143
+ requested changes, before pushing and again immediately before merging.
144
+ Resolve unanswered objections rather than treating green checks as consent.
145
+ 6. **Main overlap checked.** Fetch main before merging. Inspect changes since
146
+ the tested head on the candidate's changed paths, for example
147
+ `git log <ci-sha>..origin/main -- <changed-paths>`. If main overlaps, merge it
148
+ into the candidate and rerun the required gates and CI before merge.
149
+
150
+ ## Push deliberately and finish
151
+
152
+ Batch local commits and review corrections into one meaningful shipping push.
153
+ After feedback, fix the full set, rerun the required gates, and push once.
154
+ Never push a lone merge of main as a save point or push just to discover whether
155
+ untested code passes.
156
+
157
+ Never put a CI skip token (`[skip ci]`, `[ci skip]`, `[no ci]`, `[skip actions]`)
158
+ in a PR title or commit message. The merge commit inherits the PR title, so a
159
+ skip token can prevent every check from running on main. Remove such tokens
160
+ before creating or editing the PR; never rewrite an existing commit to do it.
161
+ If a committed token cannot be corrected without rewriting history, stop and
162
+ report the unsafe message rather than pushing it.
163
+
164
+ Use the ship-changes prompt for PR creation, notes, merge, issue disposition,
165
+ and cleanup. Non-major releases use a merge commit; never squash or rebase.
166
+ A human confirms and merges every major release. In repositories
167
+ using release-action, delivered `(#n)` references close at release, not by hand;
168
+ follow `pull-requests.md` for other cases rather than inventing a closing step.
169
+
170
+ Do not enable auto-merge. Wait using `cratis-engineering-ci-gates`. If checks
171
+ outlast the session, leave a handoff under `.ai-work/` per
172
+ [local-work-artifacts.md](../../rules/local-work-artifacts.md), with valid
173
+ preconditions, candidate and tested SHAs, PR, exact pending checks, and the next
174
+ steps. The next session must recheck the ship bar, not blindly merge on green.
175
+
176
+ ## What breaks
177
+
178
+ - **One PR per delivery:** duplicate gates and fragmented releases replace an
179
+ assembled check of the actual shipped change.
180
+ - **A growing frozen candidate:** late work invalidates the gate and cut.
181
+ - **Green means permitted:** checks neither resolve objections nor approve a
182
+ major release. The user's request and owning rules still govern effects.
183
+
184
+ ## How it is proven
185
+
186
+ Run the repository's exact assembled gate and inspect its successful exit.
187
+ Run `gh pr checks <pr>` before merge: required checks must pass for the tested
188
+ head. Confirm the whole-change review, fresh discussion, and main-overlap check.
189
+ For release notes, execute the repository's `cratis-check-pr.mjs` command from
190
+ `pull-requests.md`; a zero exit is the pass signal. No checklist replaces those
191
+ behavioral and CI signals.
@@ -0,0 +1,20 @@
1
+ {
2
+ "skill": "cratis-engineering-release-trains",
3
+ "input": "Group related deliveries, freeze the candidate, and apply the ship bar without bypassing human merge or CI.",
4
+ "fixtures": [],
5
+ "assertions": [
6
+ { "kind": "skill-contains", "value": "One assembled candidate, one release" },
7
+ { "kind": "skill-contains", "value": "After the cut, nothing joins." },
8
+ { "kind": "skill-contains", "value": "The build queue is the only legitimate one" },
9
+ { "kind": "skill-contains", "value": "only runs started by this session's own superseded pushes" },
10
+ { "kind": "skill-contains", "value": "A major release is never merged by an agent: a human confirms" },
11
+ { "kind": "skill-contains", "value": "in a PR title or commit message" },
12
+ { "kind": "skill-contains", "value": "[skip ci]" },
13
+ { "kind": "skill-contains", "value": "[ci skip]" },
14
+ { "kind": "skill-contains", "value": "[no ci]" },
15
+ { "kind": "skill-contains", "value": "[skip actions]" },
16
+ { "kind": "skill-contains", "value": "never squash or rebase" },
17
+ { "kind": "skill-contains", "value": "../../rules/pull-requests.md" },
18
+ { "kind": "skill-contains", "value": "../../prompts/ship-changes.prompt.md" }
19
+ ]
20
+ }
@@ -0,0 +1,2 @@
1
+ Copyright (c) Cratis. All rights reserved.
2
+ Licensed under the MIT license. See LICENSE file in the canonical Cratis/AI repository for the full license text.
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: cratis-engineering-review-rounds
3
+ description: Plan proportionate review rounds, distinguish blocking from advisory findings, and carry prior evidence into a delta round with a firm stopping point. Use when choosing a review round, handling blocking or advisory feedback, requesting a delta since the last reviewed SHA, or stopping recurring blockers. Not for review criteria (use cratis-code-review), grouping a release candidate (use cratis-engineering-release-trains), waiting on checks (use cratis-engineering-ci-gates), or a repeated regression class (use cratis-engineering-regression-cluster).
4
+ license: LICENSE
5
+ compatibility: Requires git and the GitHub CLI (gh).
6
+ ---
7
+
8
+ <!-- Copyright (c) Cratis. All rights reserved. -->
9
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
10
+
11
+ # Review the change, then its corrections
12
+
13
+ Read [review-reports.md](../../rules/review-reports.md) before choosing reviewers
14
+ or reporting findings. Its report shape, verdicts, scope limits, and reviewer
15
+ independence apply to every round. This skill schedules reviews; it does not
16
+ replace the criteria in `cratis-code-review` or specialist review skills.
17
+
18
+ **Blocking** means a must-fix finding in **Blockers**, yielding **Changes
19
+ requested**. **Advisory** means a non-blocking finding in **Suggestions**. An
20
+ advisory preference is not a merge gate. Missing required evidence yields
21
+ **Incomplete**, not approval; retain that gap until it is resolved.
22
+
23
+ ## Budget the review
24
+
25
+ - Run one quick round per delivery. A second is warranted only after a blocker,
26
+ not to seek reassurance or eliminate suggestions.
27
+ - Run one whole-change review per PR on the assembled change. Quick delivery
28
+ rounds do not replace it. Start whole-change inspection in parallel with the
29
+ gate when possible, but keep it provisional: required gates must pass before
30
+ an approval report is finalized. Do not launch duplicate gates for review.
31
+ - Use ordinary depth by default. Deep review needs one named risk class:
32
+ **security**, **algorithmic**, **concurrency**, or **cross-cutting**, plus a
33
+ one-line justification tied to the changed behavior. Data-loss exposure or
34
+ irreversible migrations may justify cross-cutting review; merely wanting
35
+ extra confidence does not.
36
+ - Prove migrations and deployment-sensitive behavior by running the migration
37
+ on representative local data and exercising the relevant old/new behavior.
38
+ Deeper inspection is not execution evidence. Follow repository test policy.
39
+
40
+ ## First whole-change round
41
+
42
+ 1. Fix the target scope and committed base and head SHAs. Name changed surfaces,
43
+ expected behavior, required checks, and any specific risk before starting.
44
+ Use `git rev-parse <base>` and `git rev-parse HEAD` to resolve full SHAs.
45
+ 2. Apply reviewer independence from `review-reports.md`: use a different
46
+ provider family where selectable. Where it is not selectable, declare
47
+ `single-provider` in the report header and on the Not examined line. A
48
+ provider/tool error makes the review Incomplete; fall back once as that
49
+ rule directs, rather than manufacturing a verdict.
50
+ 3. Review the whole diff using the applicable criteria and real gate results.
51
+ Record round 1 with its base/head and retain the complete report unchanged.
52
+ Keep local review records under `.ai-work/`; public reviewer notes follow
53
+ [pull-requests.md](../../rules/pull-requests.md), never the release note.
54
+ 4. Fix confirmed Blockers together. Dismiss a candidate only with evidence and
55
+ a reason, not by silently deleting it. Correct required evidence gaps before
56
+ seeking approval. Cheap advisory fixes may join this correction pass.
57
+
58
+ ## Delta rounds
59
+
60
+ A delta round follows a whole-change review and reviews from the last reviewed
61
+ SHA, not from an arbitrary base. Carry the prior Blockers, unresolved evidence
62
+ gaps, Suggestions, and Dismissed findings with their reasons. Supply the round
63
+ number, prior report, original base, last reviewed SHA, and new head explicitly.
64
+
65
+ For example, after correcting a blocker from round 1:
66
+
67
+ ```text
68
+ Round: 2 (delta)
69
+ Original base: <full base SHA>
70
+ Since: <full head SHA reviewed in round 1>
71
+ Head: <full corrected head SHA>
72
+ Prior: <complete round 1 report, including dismissals and scope limits>
73
+ Scope: inspect the correction diff and verify disposition of prior findings
74
+ ```
75
+
76
+ Inspect the correction diff with `git diff <last-reviewed-sha>..<new-head-sha>`.
77
+ Recheck earlier blockers against the correction and its specifications. Preserve
78
+ unresolved findings and limits; a narrow delta cannot certify surfaces that
79
+ were never examined. Reuse earlier approval only for the exact committed SHAs
80
+ and examined scope, never for a dirty tree or a changed head.
81
+
82
+ Do not start a follow-up round for advisory findings alone. Fix them only when
83
+ cheap in an existing correction pass; otherwise leave them as Suggestions.
84
+ Never file an issue merely to dispose of advisory feedback. A distinct defect
85
+ needs its own evidence and the authority rules, not automatic issue creation.
86
+
87
+ ## Stop instead of looping
88
+
89
+ Cap review at **3 rounds per work item**, normally fewer. Keep delivery and
90
+ whole-change round counts explicit; renaming the target does not reset a work
91
+ item's cap. If blockers recur, stop the fix/review loop. Make one structural
92
+ change addressing the failure class or ask the user about the approach. Use
93
+ `cratis-engineering-regression-cluster` when repeated instances share a surface.
94
+ A structural change does not authorize an automatic fourth round or waive any
95
+ required review; report the remaining blocker or required decision.
96
+
97
+ ## What breaks
98
+
99
+ - **A whole-change restart after every correction:** repeats work while losing
100
+ the earlier blocker list and dismissals. Use a delta with the prior report.
101
+ - **Advisory becomes blocking:** a preference causes needless edits, extra
102
+ rounds, or unwanted issues. Preserve the shared report vocabulary.
103
+ - **Deep by habit:** extra review displaces running the behavior without a
104
+ named risk. State the risk or use ordinary depth.
105
+ - **Green by absence:** a reviewer failure or missing required proof is
106
+ Incomplete, not a successful review with no findings.
107
+
108
+ ## How it is proven
109
+
110
+ Run the repository's required gates and behavioral specifications for the
111
+ correction; successful exits are required evidence, not review substitutes.
112
+ Use the delta command above to confirm scope and verify that each earlier
113
+ finding has a disposition with evidence. The report includes Blockers,
114
+ Suggestions, Dismissed (with reason), Verdict, and Not examined, per the shared
115
+ rule. No Blockers and complete required evidence permit approval; suggestions
116
+ alone permit Approved with suggestions.
117
+
118
+ For PR descriptions and release notes, run the deterministic
119
+ `cratis-check-pr.mjs` command from `pull-requests.md` and require a zero exit.
120
+ Do not spend a review round on checks that script owns.
@@ -0,0 +1,16 @@
1
+ {
2
+ "skill": "cratis-engineering-review-rounds",
3
+ "input": "Plan a delta round after a blocker without restarting whole-change review or filing advisory findings.",
4
+ "fixtures": [],
5
+ "assertions": [
6
+ { "kind": "skill-contains", "value": "../../rules/review-reports.md" },
7
+ { "kind": "skill-contains", "value": "Run one quick round per delivery" },
8
+ { "kind": "skill-contains", "value": "Run one whole-change review per PR" },
9
+ { "kind": "skill-contains", "value": "SHA, not from an arbitrary base" },
10
+ { "kind": "skill-contains", "value": "Prior: <complete round 1 report, including dismissals and scope limits>" },
11
+ { "kind": "skill-contains", "value": "3 rounds per work item" },
12
+ { "kind": "skill-contains", "value": "Never file an issue merely to dispose of advisory feedback" },
13
+ { "kind": "skill-contains", "value": "single-provider" },
14
+ { "kind": "skill-contains", "value": "**cross-cutting**" }
15
+ ]
16
+ }
@@ -15,5 +15,6 @@ SKILL.md:
15
15
  - Render unimported mtp-hot-reload routing reference as plain topic text.
16
16
  - Rewrite the description to the Cratis shape (what it does, Use when, Not for) and drop references to skills that are not part of this corpus.
17
17
  - Remove the reference to the mtp-hot-reload skill.
18
+ - Ask for mini dumps in the crash and hang dump options and add the read-then-delete instruction.
18
19
 
19
20
  NOTICE: Add this attribution, change list, and any download/execution disclosure.
@@ -242,8 +242,8 @@ speculative alternative grammars.
242
242
  | TRX | SDK-style: `--logger "trx;LogFileName=<name>.trx"` when an exact output file is requested, otherwise `--logger trx`; standalone `vstest.console.exe`: `/Logger:trx`; `MSTest.exe`: repository-documented results option | `--report-trx` |
243
243
  | Results directory | `--results-directory <dir>` | `--results-directory <dir>` |
244
244
  | Diagnostic log | `--diag <file>` | `--diagnostic --diagnostic-output-directory <dir>` |
245
- | Crash dump | `--blame-crash` | `--crashdump` |
246
- | Hang timeout | `--blame-hang --blame-hang-timeout 5min` | `--hangdump --hangdump-timeout 5min` |
245
+ | Crash dump | `--blame-crash --blame-crash-dump-type mini` | `--crashdump --crashdump-type Mini` |
246
+ | Hang timeout | `--blame-hang --blame-hang-timeout 5min --blame-hang-dump-type mini` | `--hangdump --hangdump-timeout 5min --hangdump-type Mini` |
247
247
  | Code coverage | `--collect "Code Coverage"` | `--coverage` |
248
248
 
249
249
  MTP report, dump, and coverage flags require their corresponding registered
@@ -251,6 +251,8 @@ extensions (`TrxReport`, `CrashDump`, `HangDump`, or `CodeCoverage`). Some
251
251
  framework SDKs bundle common extensions; if a flag is unrecognized, inspect
252
252
  package references before recommending a package change.
253
253
 
254
+ Always ask for a mini dump. Read the stack (for example `dotnet-dump analyze <file>` then `clrstack -all`), keep the text output, and delete the `.dmp` file. Use a full dump only for a named investigation that needs heap contents.
255
+
254
256
  `--verbosity diagnostic` increases dotnet/MSBuild output verbosity; it does not
255
257
  write a VSTest diagnostic log file.
256
258
 
@@ -264,7 +266,7 @@ dotnet test Tests.csproj --logger "trx;LogFileName=TestResults.trx"
264
266
  dotnet test Tests.csproj -- --report-trx
265
267
 
266
268
  # Native MTP TRX and hang detection
267
- dotnet test --project Tests.csproj --report-trx --hangdump --hangdump-timeout 5min
269
+ dotnet test --project Tests.csproj --report-trx --hangdump --hangdump-timeout 5min --hangdump-type Mini
268
270
 
269
271
  # Native MTP diagnostics
270
272
  dotnet test --project Tests.csproj --diagnostic --diagnostic-output-directory artifacts/diagnostics
@@ -992,12 +992,16 @@
992
992
  "availableTargets": [
993
993
  "cratis-ci-pipeline-performance",
994
994
  "cratis-documentation-writing",
995
+ "cratis-engineering-ci-gates",
995
996
  "cratis-engineering-consolidation-guard",
996
997
  "cratis-engineering-decision-record",
997
998
  "cratis-engineering-docs-authoring",
998
999
  "cratis-engineering-effect-boundaries",
1000
+ "cratis-engineering-issue-hygiene",
999
1001
  "cratis-engineering-local-cross-repo-verification",
1000
1002
  "cratis-engineering-regression-cluster",
1003
+ "cratis-engineering-release-trains",
1004
+ "cratis-engineering-review-rounds",
1001
1005
  "cratis-release-notes",
1002
1006
  "cratis-technical-examples"
1003
1007
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.105.1",
3
+ "version": "7.106.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [