@cratis/pi 7.115.0 → 7.116.1

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.
@@ -115,6 +115,9 @@ capacity numbers into workflows or guidance.
115
115
  content the source repository's CI verified before the rollout, may carry
116
116
  `[skip ci]` once the same wrapper content has landed with CI running in one canary
117
117
  repository. Package-update bots, and any commit touching another file, keep normal CI.
118
+ - Never put a skip token in a pull request title or an ordinary commit message: a
119
+ merge commit inherits the pull request title, so GitHub then runs nothing on the
120
+ default branch. See `cratis-engineering-release-trains`.
118
121
  - Comment-triggered agent workflows must gate on the trigger phrase in the job's `if:`
119
122
  (for example `contains(github.event.comment.body, '@claude')`) so a runner only
120
123
  starts when the agent is actually addressed.
@@ -127,3 +130,9 @@ capacity numbers into workflows or guidance.
127
130
  four unintended releases on 2026-08-25.
128
131
  - Every repository's release-intent gate must accept `no-release`; a gate that only
129
132
  accepts `major`/`minor`/`patch` forces exactly that mistake.
133
+ - Do not merge a pull request that changes `.github/workflows/` while a release Publish
134
+ run in the same repository has not created its tag yet. `GITHUB_TOKEN` cannot tag a
135
+ commit whose workflows differ from the default branch, and rerunning fails the same
136
+ way. Recover with the Publish `workflow_dispatch` from current main.
137
+ - A release-verify job asserts that the GitHub release `v<version>` exists. A watch
138
+ picks the exact run by head SHA, never by a time window.
@@ -86,6 +86,10 @@ _service.DidNotReceive().DoSomethingElse(Arg.Any<int>());
86
86
  _handler.Handle(Arg.Any<CommandContext>()).Throws(new Exception("fail"));
87
87
  ```
88
88
 
89
+ A change to a widely substituted interface runs the whole affected spec project,
90
+ not one spec. Grep for `Substitute.For<IThatInterface>` to find every substitute
91
+ that needs updating.
92
+
89
93
  Catch exceptions for a unit under test with `Catch.Exception`:
90
94
 
91
95
  ```csharp
@@ -114,6 +114,9 @@ capacity numbers into workflows or guidance.
114
114
  content the source repository's CI verified before the rollout, may carry
115
115
  `[skip ci]` once the same wrapper content has landed with CI running in one canary
116
116
  repository. Package-update bots, and any commit touching another file, keep normal CI.
117
+ - Never put a skip token in a pull request title or an ordinary commit message: a
118
+ merge commit inherits the pull request title, so GitHub then runs nothing on the
119
+ default branch. See `cratis-engineering-release-trains`.
117
120
  - Comment-triggered agent workflows must gate on the trigger phrase in the job's `if:`
118
121
  (for example `contains(github.event.comment.body, '@claude')`) so a runner only
119
122
  starts when the agent is actually addressed.
@@ -126,3 +129,9 @@ capacity numbers into workflows or guidance.
126
129
  four unintended releases on 2026-08-25.
127
130
  - Every repository's release-intent gate must accept `no-release`; a gate that only
128
131
  accepts `major`/`minor`/`patch` forces exactly that mistake.
132
+ - Do not merge a pull request that changes `.github/workflows/` while a release Publish
133
+ run in the same repository has not created its tag yet. `GITHUB_TOKEN` cannot tag a
134
+ commit whose workflows differ from the default branch, and rerunning fails the same
135
+ way. Recover with the Publish `workflow_dispatch` from current main.
136
+ - A release-verify job asserts that the GitHub release `v<version>` exists. A watch
137
+ picks the exact run by head SHA, never by a time window.
@@ -85,6 +85,10 @@ _service.DidNotReceive().DoSomethingElse(Arg.Any<int>());
85
85
  _handler.Handle(Arg.Any<CommandContext>()).Throws(new Exception("fail"));
86
86
  ```
87
87
 
88
+ A change to a widely substituted interface runs the whole affected spec project,
89
+ not one spec. Grep for `Substitute.For<IThatInterface>` to find every substitute
90
+ that needs updating.
91
+
88
92
  Catch exceptions for a unit under test with `Catch.Exception`:
89
93
 
90
94
  ```csharp
@@ -115,7 +115,8 @@ adding a project cannot leave it unassigned; review the list when a project is a
115
115
 
116
116
  To balance, read each shard job's median duration from the slowest-jobs table of
117
117
  `ci-timings.sh`, move a project from the longest shard to the shortest, and
118
- re-measure; stop when the spread is within the job start cost.
118
+ re-measure; stop when the spread is within the job start cost. Balance by
119
+ measured wall time, and confirm the new split on one real CI run before merging it.
119
120
 
120
121
  ## Decisions
121
122
 
@@ -42,10 +42,13 @@ before an external effect. A request to verify does not authorize a push.
42
42
  not a universal framework-specific scanner in this corpus.
43
43
  3. Prefer the repository's existing gate script. If none exists, keep a small
44
44
  local runner under `.ai-work/`, with each phase's real exit status preserved.
45
- Do not substitute only the touched projects for the final gate.
45
+ Do not substitute only the touched projects for the final gate. The done gate
46
+ runs its tier's CI shards unfiltered; filters are for iterating only.
46
47
  4. **Tier 1** is the whole-solution build with CI's configuration and warning
47
48
  settings, lint/format, and every non-integration test project. For example,
48
- use Release with warnings as errors when that is what CI uses.
49
+ use Release with warnings as errors when that is what CI uses. For a
50
+ dependency or analyzer bump, that exact CI Release build is the gate; a Debug
51
+ build is not evidence.
49
52
  5. **Tier 2** adds integration tests. The repository's tier policy decides
50
53
  whether they run locally. The default is CI-backed integration only if CI
51
54
  runs that coverage, it passes before merge, and reviewer notes say it was
@@ -53,6 +56,9 @@ before an external effect. A request to verify does not authorize a push.
53
56
  6. Name anything CI runs that cannot run locally: services, platforms, secrets
54
57
  or hosted checks. Say what ran instead and what remains unverified before
55
58
  pushing. Missing coverage is not a local pass.
59
+ 7. A change to a command, read model or query shape runs the repository's proxy
60
+ and API regeneration checks; never hand-edit generated files. A package bump
61
+ regenerates the checked-in snapshots that pin versions, in the same commit.
56
62
 
57
63
  Use affected-project checks while coding and writing specifications. Build once
58
64
  at the end: run the full local gate when the work is believed complete, not after
@@ -93,6 +93,14 @@ boundary that makes a change safe to adopt. One item can follow this shape:
93
93
  That is a checklist for facts, not a template to repeat word-for-word across
94
94
  items. Use descriptive headings, meaningful links, and natural sentence rhythm.
95
95
 
96
+ A `no-release` PR body still follows this contract. Its `(#n)` closes nothing
97
+ because no release runs, so the issue is closed separately, and only when the
98
+ request includes that effect; never imply automatic closing (see the issue
99
+ section of [pull-requests.md](../../rules/pull-requests.md)).
100
+
101
+ For every pull request, write the body file in a step of its own before
102
+ `gh pr create --body-file`.
103
+
96
104
  ## Repair an already-published release
97
105
 
98
106
  Only when asked to fix a release that violates the contract:
@@ -134,6 +142,14 @@ dispatch the publish workflow from the current default branch with the PR's
134
142
  release notes. Re-running the stale commit does not fix this. Other 403s keep
135
143
  their original cause; do not treat every permission failure as workflow drift.
136
144
 
145
+ Before re-running a cancelled publish, check
146
+ `git merge-base --is-ancestor <merge-commit> <latest-release-tag>`. If it is an
147
+ ancestor, a release already contains the change, so do not cut another version.
148
+ The tag alone does not prove it shipped: a release can be created before its
149
+ publishing jobs run. Confirm that the containing release's publish run completed
150
+ every publishing job and its packages exist before reporting it shipped;
151
+ otherwise recover that version's publishing rather than releasing again.
152
+
137
153
  ## Verify before handing over
138
154
 
139
155
  1. Reconcile every version, affected range, capability and API against the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.115.0",
3
+ "version": "7.116.1",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [