@cratis/pi 7.119.1 → 7.121.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 (34) hide show
  1. package/package/corpus/harnesses/copilot/instructions/code-quality.instructions.md +11 -1
  2. package/package/corpus/harnesses/copilot/instructions/framework.instructions.md +14 -1
  3. package/package/corpus/harnesses/copilot/instructions/git-commits.instructions.md +9 -102
  4. package/package/corpus/harnesses/copilot/instructions/glossary.instructions.md +14 -1
  5. package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +18 -170
  6. package/package/corpus/harnesses/copilot/instructions/rtk.instructions.md +6 -41
  7. package/package/corpus/prompts/ship-changes.prompt.md +1 -1
  8. package/package/corpus/rules/code-quality.md +11 -1
  9. package/package/corpus/rules/framework.md +14 -1
  10. package/package/corpus/rules/general.md +11 -10
  11. package/package/corpus/rules/git-commits.md +9 -102
  12. package/package/corpus/rules/glossary.md +14 -1
  13. package/package/corpus/rules/issue-assignment.md +6 -26
  14. package/package/corpus/rules/pull-requests.md +18 -170
  15. package/package/corpus/rules/rtk.md +6 -41
  16. package/package/corpus/skills/cratis-commits-and-pull-requests/LICENSE +2 -0
  17. package/package/corpus/skills/cratis-commits-and-pull-requests/SKILL.md +48 -0
  18. package/package/corpus/skills/cratis-commits-and-pull-requests/references/commits.md +110 -0
  19. package/package/corpus/skills/cratis-commits-and-pull-requests/references/pr-description.md +90 -0
  20. package/package/corpus/skills/cratis-commits-and-pull-requests/references/pr-labels-and-release.md +82 -0
  21. package/package/corpus/skills/cratis-commits-and-pull-requests/verification.json +11 -0
  22. package/package/corpus/skills/cratis-engineering-ci-gates/SKILL.md +1 -1
  23. package/package/corpus/skills/cratis-engineering-issue-hygiene/SKILL.md +17 -3
  24. package/package/corpus/skills/cratis-engineering-issue-hygiene/verification.json +11 -0
  25. package/package/corpus/skills/cratis-rtk/LICENSE +2 -0
  26. package/package/corpus/skills/cratis-rtk/SKILL.md +59 -0
  27. package/package/corpus/skills/cratis-rtk/verification.json +11 -0
  28. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +30 -0
  29. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
  30. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
  31. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +2 -2
  32. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +1 -1
  33. package/package/profile-catalog.json +90 -1
  34. package/package.json +1 -1
@@ -1,5 +1,15 @@
1
1
  ---
2
- applyTo: "**/*"
2
+ applyTo: "**/*.cs,**/*.ts,**/*.tsx,**/*.go,**/*.kt,**/*.kts,**/*.java,**/*.ex,**/*.exs"
3
+ paths:
4
+ - "**/*.cs"
5
+ - "**/*.ts"
6
+ - "**/*.tsx"
7
+ - "**/*.go"
8
+ - "**/*.kt"
9
+ - "**/*.kts"
10
+ - "**/*.java"
11
+ - "**/*.ex"
12
+ - "**/*.exs"
3
13
  ---
4
14
  <!-- cratis-ai: generated Copilot instructions. Do not edit; rules/ is the source. -->
5
15
 
@@ -1,5 +1,18 @@
1
1
  ---
2
- applyTo: "**/*"
2
+ applyTo: "**/*.cs,**/*.ts,**/*.tsx,**/*.go,**/*.kt,**/*.kts,**/*.java,**/*.ex,**/*.exs,**/*.csproj,**/package.json,**/go.mod"
3
+ paths:
4
+ - "**/*.cs"
5
+ - "**/*.ts"
6
+ - "**/*.tsx"
7
+ - "**/*.go"
8
+ - "**/*.kt"
9
+ - "**/*.kts"
10
+ - "**/*.java"
11
+ - "**/*.ex"
12
+ - "**/*.exs"
13
+ - "**/*.csproj"
14
+ - "**/package.json"
15
+ - "**/go.mod"
3
16
  profile: framework
4
17
  ---
5
18
  <!-- cratis-ai: generated Copilot instructions. Do not edit; rules/ is the source. -->
@@ -5,7 +5,9 @@ applyTo: "**/*"
5
5
 
6
6
  # How to Write Git Commits
7
7
 
8
- Commits are the permanent record of how the codebase evolved. Each commit should tell a clear story: *what* changed and *why*. A reviewer reading `git log --oneline` should understand the arc of the work without opening any diffs.
8
+ **Before writing any commit message, committing, pushing, or creating/editing a PR, read the `cratis-commits-and-pull-requests` skill.** It holds the commit format, grouping, staging and when-to-commit procedure. This rule keeps the history contract that must hold even before the skill is read.
9
+
10
+ Commits are the permanent record of how the codebase evolved. Each commit is a single logical unit of work: *what* changed and *why*, in an imperative subject of at most 72 characters, never WIP, never uncompilable. Stage specific files, never `git add .`.
9
11
 
10
12
  ## Never rewrite history
11
13
 
@@ -25,115 +27,20 @@ These commands are **forbidden** unless the human explicitly asks for that speci
25
27
  | `git gc --prune=now`, `git reflog expire` | destroys the recovery path for anything already stranded |
26
28
  | `git merge --squash`, `gh pr merge --squash`, `--rebase`, the **Squash and merge** / **Rebase and merge** buttons | collapses or replays the branch's commits into new ones; every original commit becomes unreachable and the branch's real history is destroyed at the moment of merge |
27
29
 
28
- **Merging is part of this rule, and it is the easiest place to get it wrong.** A squash merge feels
29
- like an integration step rather than a rewrite, which is exactly why it slips past: the branch is
30
- deleted straight afterwards, so the commits it collapsed have no ref left and `gc` eventually takes
31
- them. **Always merge with a true merge commit** — `git merge --no-ff`, or `gh pr merge --merge`.
32
- Never `--squash`, never `--rebase`, and never the equivalent buttons in the GitHub UI.
33
-
34
- If a repository's settings only allow squash or rebase merges, that is a **setting to raise with the
35
- owner, not a licence to squash.** Stop and ask.
30
+ **Merging is part of this rule, and it is the easiest place to get it wrong.** A squash merge feels like an integration step rather than a rewrite, which is exactly why it slips past: the branch is deleted straight afterwards, so the commits it collapsed have no ref left and `gc` eventually takes them. **Always merge with a true merge commit** — `git merge --no-ff`, or `gh pr merge --merge`. Never `--squash`, never `--rebase`, and never the equivalent buttons in the GitHub UI.
36
31
 
37
- **This is not stylistic.** A commit can exist as an object (`git cat-file -t <sha>` succeeds) while being absent from every branch *and* from the working tree — reachable only through `git reflog`, and only until `gc` runs. Work has already been lost in this repository exactly this way: a branch checkout carried another session's commit away, the branch was deleted, and the file changes silently reverted in the tree. It was recovered from the reflog by luck, because someone asked the right question in time.
32
+ If a repository's settings only allow squash or rebase merges, that is a **setting to raise with the owner, not a licence to squash.** Stop and ask.
38
33
 
39
34
  ### What to do instead
40
35
 
41
- - **Made a mistake in the last commit?** Add a new commit that corrects it. The wrong state stays in history, and that is fine — history is a record of what happened, not a curated story of what you wish had happened.
36
+ - **Made a mistake in the last commit?** Add a new commit that corrects it.
42
37
  - **Need to undo a commit?** `git revert <sha>` — it records the undo as a new commit and loses nothing.
43
- - **Messy commits before a PR?** Leave them. A reviewer reading a coherent series of small commits is better served than by one squashed blob, and the project does not require a linear history.
44
- - **Landing a PR?** `gh pr merge --merge` (a real merge commit). **Not `--squash`, not `--rebase`.** The commits on the branch are the record of how the change was actually built; squashing throws that away permanently in exchange for a tidier `main`, which is not a trade this project makes.
38
+ - **Messy commits before a PR?** Leave them; the project does not require a linear history.
39
+ - **Landing a PR?** `gh pr merge --merge` (a real merge commit). **Not `--squash`, not `--rebase`.**
45
40
  - **Need someone else's changes?** `git merge`, never `git rebase`.
46
41
  - **Need to move a commit to another branch?** `git cherry-pick` — it copies, leaving the original reachable.
47
42
  - **Working alongside another agent or session?** Use `git worktree add` so each has its own checkout and branch. Never two sessions committing in one working tree.
48
43
 
49
44
  ### Before you finish
50
45
 
51
- Verify your own commits are still reachable on the branch **and** that their content is still in the working tree — those are two different things. `git log --oneline -5` plus a `grep` for something the commit introduced. If a commit has gone missing, `git reflog` is the recovery tool: find the SHA, `git tag` it immediately so `gc` cannot take it, then `git cherry-pick` it back.
52
-
53
- ## Logical Grouping
54
-
55
- Every commit must be a **single logical unit of work**. Group related changes together; separate unrelated changes into distinct commits.
56
-
57
- ### What belongs in one commit
58
-
59
- - A bug fix and the spec that proves it.
60
- - A new file and the changes to existing files needed to integrate it (imports, registrations, wiring).
61
- - A refactor that moves or renames code — only the mechanical transformation, nothing else.
62
- - An interface change together with all implementation updates required to compile.
63
-
64
- ### What does NOT belong in one commit
65
-
66
- - A bug fix mixed with an unrelated feature.
67
- - Source code changes mixed with unrelated spec additions for a different area.
68
- - Formatting or style cleanups bundled with behavioral changes.
69
- - Multiple independent fixes or features squashed into a single commit.
70
-
71
- ### Deciding where to split
72
-
73
- Ask: "If I needed to revert this commit, would I lose exactly one coherent change?" If reverting would undo two unrelated things, it should be two commits.
74
-
75
- Common split points:
76
-
77
- 1. **Infrastructure / plumbing first** — interface additions, new types, or schema changes that later commits build on.
78
- 2. **Core logic second** — the behavioral change that uses the new infrastructure.
79
- 3. **Specs / tests third** — the specs that prove the behavioral change works. Specs may also be combined with the core logic commit when they are tightly coupled (e.g., a TDD red-green cycle or a bug fix with its regression test).
80
- 4. **Integration or wiring last** — connecting the new behavior to the rest of the system (DI registration, routing, UI hookup).
81
-
82
- When a task produces both source fixes and new integration specs, prefer separate commits for the source changes and the specs — unless the specs are inseparable from the fix (e.g., a single bug fix + its regression test).
83
-
84
- ## Commit Messages
85
-
86
- ### Format
87
-
88
- ```text
89
- <imperative summary of what this commit does>
90
-
91
- <optional body — why the change was made, context, trade-offs>
92
- ```
93
-
94
- - **Subject line**: imperative mood, present tense. Start with a verb: `Add`, `Fix`, `Remove`, `Rename`, `Extract`, `Update`, `Support`.
95
- - **No period** at the end of the subject line.
96
- - **72-character limit** on the subject line. If you cannot describe the change in 72 characters, the commit is probably too large — split it.
97
- - **Body**: separated from the subject by a blank line. Explain *why*, not *what* (the diff shows the what). Use bullet points for multi-part changes.
98
-
99
- ### Good examples
100
-
101
- ```text
102
- Fix duplicate key crash in IdentityStorage.Populate
103
-
104
- The upsert used InsertOne which threw on existing identities.
105
- Replace with ReplaceOne using upsert: true.
106
- ```
107
-
108
- ```text
109
- Add type-safe event migration API with expression-based builders
110
-
111
- Introduce EventTypeMigration<TUpgrade, TPrevious> base class with
112
- typed property builders for Split, Join, Rename, and DefaultValue
113
- operations. Migrators are discovered automatically by convention.
114
- ```
115
-
116
- ```text
117
- Add integration specs for observer replay on redaction
118
- ```
119
-
120
- ### Bad examples
121
-
122
- - `Fix stuff` — meaningless.
123
- - `WIP` — never commit work-in-progress; stage and commit when the unit is complete.
124
- - `Add files` — says nothing about what or why.
125
- - `Fix bug and add new feature and update docs` — three unrelated things.
126
- - `Changed Observer.Handling.cs` — describes a file, not a behavior.
127
-
128
- ## When to Commit
129
-
130
- - **After each logical unit passes the build** — `dotnet build` with zero errors and zero warnings, or `yarn compile` with zero errors.
131
- - **Before starting a different kind of work** — about to switch from fixing a bug to adding a feature? Commit the bug fix first.
132
- - **After completing specs for a change** — if the specs are a separate commit from the source change.
133
- - **Never commit code that does not compile.** Every commit must be a buildable, working state of the codebase.
134
-
135
- ## Staging Discipline
136
-
137
- - Use `git add <specific files>` rather than `git add .` or `git add -A`. Only stage files that belong to the current logical unit.
138
- - Review `git diff --cached` before committing to verify nothing unrelated was staged.
139
- - If you realize mid-commit that unrelated changes are mixed in, unstage them and commit only the related subset.
46
+ Verify your own commits are still reachable on the branch **and** that their content is still in the working tree: `git log --oneline -5` plus a `grep` for something the commit introduced. If a commit has gone missing, recover it from `git reflog`, `git tag` it immediately, then `git cherry-pick` it back.
@@ -1,5 +1,18 @@
1
1
  ---
2
- applyTo: "**/*"
2
+ applyTo: "**/*.cs,**/*.ts,**/*.tsx,**/*.go,**/*.kt,**/*.kts,**/*.java,**/*.ex,**/*.exs,**/*.play,**/Documentation/**/*.md,**/Documentation/**/*.mdx"
3
+ paths:
4
+ - "**/*.cs"
5
+ - "**/*.ts"
6
+ - "**/*.tsx"
7
+ - "**/*.go"
8
+ - "**/*.kt"
9
+ - "**/*.kts"
10
+ - "**/*.java"
11
+ - "**/*.ex"
12
+ - "**/*.exs"
13
+ - "**/*.play"
14
+ - "**/Documentation/**/*.md"
15
+ - "**/Documentation/**/*.mdx"
3
16
  ---
4
17
  <!-- cratis-ai: generated Copilot instructions. Do not edit; rules/ is the source. -->
5
18
 
@@ -5,184 +5,32 @@ applyTo: "**/*"
5
5
 
6
6
  # How to Do Pull Requests
7
7
 
8
- ## The description is the release note
9
-
10
- **The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up. The same contract applies to release notes typed into a manual workflow run or written straight into a release. Where it is installed, the `policy / verify` check enforces it on release-bound PRs into the default branch carrying `major`/`minor`/`patch` (it re-runs when the label is added); its release-note step warns on `no-release` and unlabelled PRs, which must still be written this way because any of them may become releasable. `release-action` does not run for a `no-release` PR, so `(#n)` closes nothing there. Editing the description re-runs the check. HTML comments are not shown on the release page and the check ignores them for headings, keywords and placeholders, and `release-action` removes them before publishing, so a `(#n)` only inside a comment closes nothing; the check fails it, so never put an issue reference in a comment. The template's own comment can stay: its `(#123)` examples are inline code, and the comment is not published.
8
+ **Before writing any commit message, committing, pushing, or creating/editing a PR, read the `cratis-commits-and-pull-requests` skill.** It holds the allowed description shape, the forbidden list, worked examples, label procedure, grouping and release-action windows. This rule keeps the contract that must hold even before the skill is read. Commit rules are in [git-commits.md](./git-commits.instructions.md).
11
9
 
12
- **A change to a hook script or its wiring (`.cratis/ai/hooks/**`) needs a release-note line that tells consumers to run `cratis ai update`; a hook fix does not reach a repository until they do.**
10
+ ## The description is the release note
13
11
 
14
- ### Allowed shape
12
+ **The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up.
15
13
 
16
- - Follow the repository's pull request template (`.github/pull_request_template.md`) within this contract.
17
- - An optional summary, first, only when one cohesive theme spans the bullets: **either** a `## Summary` section (short, user-facing prose) **or** one unheaded lead paragraph (1–3 sentences), never both. `Summary` is a level-2 heading; `# Summary` is the wrong level. No bullets before the first section.
18
- - Then only these `##` sections, each at most once, in this order after any `## Summary`: `## Added`, `## Changed`, `## Fixed`, `## Removed`, `## Security`, `## Deprecated`. Keep only the sections that have bullets: a section holding only prose, a code example or `None.` fails the check, so delete it. `###` sub-headings inside a section are fine unless they use a forbidden name; inside a section even `### Added` is only a sub-heading, and a section itself is always level 2.
19
- - A `major`/`minor`/`patch` PR needs at least one bullet under an allowed section.
20
- - Bullets are short, self-contained and user-facing: what a consumer compiles against, runs or observes. A user-visible fix may add one sentence of root cause or regression guard, stated as observable behavior. Credit an external contributor by name or handle, unless they asked not to be named.
21
- - Breaking changes and upgrade actions are bullets in `## Changed` or `## Removed` that state the action. A longer migration story goes in the docs, linked by absolute URL.
22
- - Do not list internal plumbing (storage, converters, gRPC internals, specs, file lists, refactor narration).
14
+ - Follow the repository's pull request template within this contract: an optional summary first, then only `## Added`, `## Changed`, `## Fixed`, `## Removed`, `## Security`, `## Deprecated`, each with short, user-facing bullets and none empty.
15
+ - Never put review, verification, test or CI results, provenance, merge or deploy instructions, internal state, relative links or placeholders in the description. **Reviewer-facing information goes in a PR comment** posted right after creating the PR (`gh pr comment <n> --body-file .ai-work/pr-notes.md`), even when the PR is labelled `no-release`.
16
+ - A change to a hook script or its wiring (`.cratis/ai/hooks/**`) needs a release-note line that tells consumers to run `cratis ai update`; a hook fix does not reach a repository until they do.
23
17
 
24
18
  ### Issue references
25
19
 
26
- | Write | Meaning |
27
- | --- | --- |
28
- | `(#351)` at the **end of the bullet that delivers it** | Delivered: in a repository released by `cratis/release-action`, it closes it at release |
29
- | `(part of #351)` or prose `see #351` | Related, partial or follow-up: never closes |
30
- | `Cratis/Repo#351` | Other repository: never closed |
31
- | one `(#351)` per issue, never `(#351, #352)` | `(#351, #352)` closes nothing: write `(#351) (#352)` |
32
-
33
- - Nothing but more issue references (also `(part of #n)`, `(see #n)` and `(Cratis/Repo#n)`), closing emphasis, `<br>` and sentence punctuation (a `:` may introduce nested bullets) may follow the delivering `(#n)`. Write one `(#n)` per issue: release-action only matches `(#n)`, so `(#56, #57)` closes nothing; write `(#56) (#57)`.
34
- - Never use a linking or closing keyword before a number, anywhere: `Close`, `Closes`, `Closed`, `Fix`, `Fixes`, `Fixed`, `Resolve`, `Resolves`, `Resolved`, `Refs`, `Ref`, `References`, also as `Keyword: #n`, with `owner/repo#n`, followed by an issue URL, and wrapped in bold, italics or a link (`**Closes** #n`, `Closes [#n](url)`, `[Closes #n](url)`, and `[Closes](url)` where the link starts a clause). A `Refs #93` line closes nothing and is not a delivery marker: write `(#93)` at the end of the delivering bullet, or `(part of #93)` if it must stay open.
35
- - Comment on or close an issue when the user's request includes that effect; otherwise prepare a bounded post-merge disposition without performing it. In repositories released by `cratis/release-action`, a delivered `(#n)` is closed by release-action at release, so do not close it by hand; for a `no-release` PR release-action does not run, so any disposition follows this same rule. Elsewhere, follow the repository's own release and issue-closing process.
36
- - Use a bare `(#n)` only for an issue this PR fully delivers. No issue means no reference. Never use a placeholder such as `(#issue)` or the template's `(#123)`, and verify every number exists in the right repository; never guess.
37
-
38
- ### Forbidden anywhere outside code
39
-
40
- - **Headings** (any level, also written as HTML `<h2>`, `<b>`, `<i>` or a possibly multi-line `<summary>`, or as an `*italic*` line; a heading line is checked like any other, so a keyword, relative link or `(#n)` in one fails too) other than a first `## Summary`, such as Overview, Description, What, Why, How, Context, Changes, What changed, Test plan, Testing, Tests, Verification, Verified, Validation, Quality, Review, Notes, Notes for reviewers, Limitations, Known follow-up, Acceptance, Details, and any `#`/`##` heading not in the allowed list.
41
- - **Review, verification, testing and provenance notes**: `Review:`, `Reviewed:`, a stand-alone `Reviewed by` line, `Verification:`, `Tested:`, `Testing:`, `Validation:` lines that stand alone or report a result (`Tests: 400 passed`, `Review: approved`); same-provider, cross-provider, Opus-only or Anthropic-only review remarks; the review workflow having passed, returned or run; CI or gate results (`CI green`, `all tests passed`); and a line stating which agent or model wrote the description (`Generated with Claude Code`, `Co-Authored-By:`). A bullet that describes a product change and only mentions review, validation, tests or an AI model (`- Validation: rules now apply to commands (#3)`, `- Reviewed by status is now shown on the dashboard (#4)`) is fine: inside a bullet, a summary or the lead paragraph the check reads a note only when it ends the clause (`- Cross-provider review pending`).
42
- - **Verification and scope notes**: how or where something was checked (`verified by building …`, `verified in Storybook`, `tested locally`, `Storybook only`), what was not checked (`not yet verified`, `Not verified against a real kernel`), and results (`492/492`, `9 of 9 runs`, `Tier 1 PASS`, `0 warnings, 0 errors`, a `Local:`, `CI:`, `Checks:` or `Checked locally:` line).
43
- - **Reviewer, merge and deploy instructions**: `Stacked on #207`, `retarget to main once #207 merges`, `This PR should be deployed separately`, `Draft:`, `do not merge`, merge or deploy order. If a consumer must upgrade in a set order, write that as an upgrade bullet ("Upgrade the Chronicle kernel to 19.25 before this client").
44
- - **Provenance**: which branch, commit or build something was checked against (`verified against Arc.TypeScript main (v0.34.0)`). If compatibility matters to the reader, state it as a fact about the release: "Requires `@cratis/arc` 0.34 or later."
45
- - **Internal state** that is not a consumer change (for example "npm publication remains disabled").
46
- - **Relative links** (`](Documentation/x.md)`, `](./x)`, `](Source/...)`): they 404 on the release page. Use `https://github.com/Cratis/<Repo>/blob/main/<path>`, a `#anchor` or `mailto:`.
47
- - **Placeholders and transcripts**: template text, empty sections, Copilot "Original prompt" blocks, agent transcripts.
48
-
49
- Reviewer-facing information (test plan, verification, what was not verified, review provenance, stacking, merge or deploy order) goes in a **PR comment** posted right after creating the PR: `gh pr comment <n> --body-file .ai-work/pr-notes.md`. Never put it in the description, even when the PR is labelled `no-release`.
50
-
51
- ### Keep the note true to the diff
52
-
53
- After merging or rebasing the base branch, and before every body edit, run `git diff --stat origin/main...HEAD`. Delete each bullet whose change is now on main through another PR, or was dropped in conflict resolution. Check every version, package name and registry against the diff and the current `.github/workflows/publish*.yml`; never name a registry the publish workflow does not push to.
54
-
55
- ### Bad to good
56
-
57
- Bad (Cratis/Arc.TypeScript v0.48.0 as first published, bullets abridged):
58
-
59
- ```markdown
60
- Arc can now construct Chronicle reactors and reducers through its own dependency injection, one scope per delivered batch, as an opt-in preview. npm publication remains disabled.
61
-
62
- ## Added
63
-
64
- - Preview option `withChronicle({ ..., activateArtifactsInScopes: true })` ... (#93)
65
-
66
- See [Activate reactors and reducers in Arc scopes](Documentation/chronicle/reactors/scoped-activation.md).
67
-
68
- Review: Opus-only (same-provider) review.
69
-
70
- Refs #93
71
- ```
72
-
73
- Good (as corrected):
74
-
75
- ```markdown
76
- Arc can now construct Chronicle reactors and reducers through its own dependency injection, one scope per delivered batch, as an opt-in preview.
77
-
78
- ## Added
79
-
80
- - Preview option `withChronicle({ ..., activateArtifactsInScopes: true })` ... See [Activate reactors and reducers in Arc scopes](https://github.com/Cratis/Arc.TypeScript/blob/main/Documentation/chronicle/reactors/scoped-activation.md). (part of #93)
81
- ```
82
-
83
- "npm publication remains disabled" is internal status, the link was relative (it 404s on the release page), the review line is provenance for reviewers, and `Refs #93` is a keyword line. #93 was only partly delivered by this release, so its bullets say `(part of #93)`; `(#93)` would have closed it.
84
-
85
- ### Before you create or edit a PR
86
-
87
- 1. Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`. It runs the exact `policy / verify` release-note rules plus the label and diff checks, and the Bash hook runs it on `gh pr create` and `gh pr edit`.
88
- 2. Read the body against the forbidden list and the issue table above; delete every hit and verify every issue number.
89
- 3. Sections in order, none empty, at most one summary form; every bullet user-facing.
90
- 4. Test plan, verification and review notes are in a PR comment.
91
-
92
- If the release-note rules fail, fix the description, not the code.
93
-
94
- ## Commits
95
-
96
- See the full [Git Commits guide](./git-commits.instructions.md) for rules on logical grouping, message format, and staging discipline.
97
-
98
- Quick reminders:
99
-
100
- - Imperative mood: "Add author registration" not "Added author registration".
101
- - Each commit = one logical unit of work. No WIP commits in the final PR.
102
- - Never mix unrelated changes in a single commit.
20
+ - `(#n)` at the end of the bullet that delivers it closes the issue at release: use it **only** for an issue this PR fully delivers. One `(#n)` per issue: `(#351, #352)` closes nothing, write `(#351) (#352)`.
21
+ - `(part of #n)`, prose `see #n` or `Cratis/Repo#n` relate without closing. No issue means no reference; never use a placeholder or guess a number.
22
+ - Never use a linking or closing keyword before a number, anywhere (`Close`, `Closes`, `Fix`, `Fixes`, `Resolve`, `Resolves`, `Refs`, `References`, in any form). `Refs #n` closes nothing: write `(#n)` or `(part of #n)`.
23
+ - Comment on or close an issue only when the user's request includes that effect. A delivered `(#n)` in a repository released by `cratis/release-action` is closed at release; do not close it by hand.
103
24
 
104
25
  ## Labels
105
26
 
106
- Confirm the current repository workflow contract before selecting release intent because release-intent labels can trigger publication. A direct request to ship with a named label authorizes applying that label and completing the repository's standard pull-request workflow, including the release it normally triggers. Do not ask for separate authorization at each step. If the user did not request shipping or publication, a proposed semantic label describes impact but does not grant authority.
107
-
108
- - Exactly one of `major`/`minor`/`patch`/`no-release`, set in the creating command (`gh pr create --label patch`), in every repository, including samples, docs and tooling repositories (`no-release` when nothing is shipped). To change intent, swap labels in one command: `gh pr edit <n> --remove-label minor --add-label patch`. Never add a second: with more than one of them, release-action releases nothing and reports `reason=error`. Re-running a `pull_request` workflow replays the original label payload, so fix a label mistake by editing the PR or pushing; a `workflow_dispatch` run needs an explicit `version` and the PR description as `release-notes`, and without notes it closes no issues.
109
- - Dependabot PRs carry only `no-release`. release-action never releases them, and the `major`/`minor`/`patch` Dependabot adds describe the dependency's version, not this product's.
110
- - Label the PR according to semantic versioning impact:
111
- - **major** — breaking changes to public APIs
112
- - **minor** — new features, new slices, non-breaking additions
113
- - **patch** — bug fixes, refactoring with identical behavior
114
-
115
- ### A major release needs a human's explicit go-ahead
116
-
117
- A `major` label is the one release-intent label a ship request does not, by
118
- itself, authorize through to merge. Breaking a public API is the most
119
- consequential and hardest-to-reverse thing a release does — every downstream
120
- consumer eventually has to act on it — so it gets a checkpoint the other two
121
- intents do not.
122
-
123
- - Prepare the branch, commits, push, and PR carrying the `major` label exactly
124
- as any other ship request would.
125
- - Before merging, stop and ask a human to confirm the major bump specifically:
126
- name the exact breaking change(s), who is affected and how, and the
127
- resulting version number. A generic "ready to ship?" is not this checkpoint —
128
- say plainly that this release breaks compatibility and needs a yes.
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.
133
- - This checkpoint is per release, not per conversation — a human confirming
134
- one major release does not pre-authorize the next one.
135
-
136
- This narrows the general ship-changes authorization in
137
- [`ship-changes.prompt.md`](../../../prompts/ship-changes.prompt.md) for exactly this
138
- label; every other step of that workflow proceeds under its existing
139
- authority.
140
-
141
- ### A pull request that changes nothing outward-facing carries `no-release`
142
-
143
- **If nothing in the PR can change what a consumer compiles against, runs, or observes, propose repository-supported non-release intent, ordinarily `no-release`** — not `patch`. Confirm that the current workflow supports the label, requires exactly one release-intent label, and suppresses publication as intended before applying it with authorization.
144
-
145
- Where the repository requires release intent, `no-release` is a decision, not an omission. Missing required labels are blockers, not a reason to bypass the check.
146
-
147
- This covers, whenever the PR touches *only* these:
148
-
149
- - **Documentation** — anything under `Documentation/**`, READMEs, the `.cratis/ai/` corpus.
150
- - **CI and repository automation** — `.github/workflows/**`, `.github/scripts/**`, `.github/CODEOWNERS`, issue/PR templates.
151
- - **Tests and specs** — `*.Specs/**`, `when_*/**`, `for_*/**`, `Integration/**`, and test-only fixtures.
152
- - **Build and tooling configuration** that produces no shipped artifact difference — lint config, editor config, local scripts.
153
-
154
- The test is **outward-facing effect, not file location**. A change under `Source/**` that only touches specs is not shippable; a one-line change to a published package's behavior is, however small. If a consumer could not tell the difference by upgrading, there is nothing to version. When genuinely unsure, ask rather than defaulting to `patch` — an unnecessary release is not free: it burns a version number, ships release notes describing nothing, and buries the releases that matter.
155
-
156
- A non-release pull request must satisfy the relevant required checks like any other. Confirm label acceptance and publication suppression against the current workflow contract; do not assume external CI or API state.
157
-
158
- ### Release-action windows and workflow drift
159
-
160
- Batching is opt-in; success with `batched` or `nothing-pending` is not publication.
161
- Read **cratis-release-notes** before configuring windows, handling a pending-major
162
- hotfix, or recovering a workflow-drift 403. Major confirmation remains required;
163
- a workflow-drift recovery differs from the concurrent-tag retry above.
164
-
165
- ### Group small related changes into one pull request
166
-
167
- 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`.
168
-
169
- **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.
170
-
171
- Before a consolidation or a re-land of reverted work merges, prove it dropped nothing with `cratis-engineering-consolidation-guard`.
172
-
173
- Split into separate pull requests when the changes are genuinely unrelated, when one is urgent and the others are not, or when one is risky enough to want its own revert.
174
-
175
- ## Quality Gates
176
-
177
- Documentation-only changes use repository-supported non-release intent, ordinarily `no-release`; confirm the workflow contract rather than assuming a label or API state. Run relevant content, link, frontmatter, and corpus checks instead of unrelated application builds, and satisfy every repository-required check, including release-intent checks where supported. Documentation is never a blanket exemption from red CI.
178
-
179
- **`no-release` does not otherwise excuse a PR from this section.** A CI, tooling, or spec-only pull request ships nothing, but it is exactly the kind of change that can break the build or the pipeline for everyone else — a broken workflow or a deleted spec does its damage without ever being released. Hold it to every gate below.
27
+ - **Exactly one** of `major`/`minor`/`patch`/`no-release`, set in the creating command (`gh pr create --label patch`), in every repository. Never add a second: release-action then releases nothing. Swap in one command with `gh pr edit --remove-label … --add-label …`. Dependabot PRs carry only `no-release`.
28
+ - Confirm the repository workflow before choosing, because the label can trigger publication. A direct request to ship with a named label authorizes applying it and the standard workflow; without a ship request a proposed label describes impact but grants no authority.
29
+ - **A major release needs a human's explicit go-ahead, and a human merges it.** Prepare the branch and PR with `major`, then stop and ask a human to confirm the major bump: name the breaking changes, who is affected and the resulting version. A general "ship" instruction does not answer it. An agent never merges a `major` PR, even after confirmation; the checkpoint is per release.
30
+ - **If nothing in the PR can change what a consumer compiles against, runs or observes, use `no-release`**, not `patch`: documentation, CI and automation, tests and specs, tooling configuration. The test is outward-facing effect, not file location. When unsure, ask rather than defaulting to `patch`.
180
31
 
181
- Before marking code/automation work ready, select the affected-project gates that apply from the following list; run wider checks for cross-cutting changes and repository-required merge/release gates:
32
+ ## Before you create or edit a PR
182
33
 
183
- - `dotnet build` — zero errors, zero warnings
184
- - `dotnet test` — all specs pass
185
- - `yarn lint` — zero errors
186
- - `npx tsc -b` — zero TypeScript errors
187
- - Code follows all project coding standards and conventions
188
- - **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).
34
+ - Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`; it applies the exact `policy / verify` release-note rules and the Bash hook runs it on `gh pr create` and `gh pr edit`. If it fails, fix the description, not the code. Before every body edit, run `git diff --stat origin/main...HEAD` and delete bullets the diff no longer supports.
35
+ - Run the affected-project gates before marking work ready (`dotnet build`/`dotnet test` with zero warnings, `yarn lint`, `npx tsc -b`), and the repository's required CI checks after an authorized push. `no-release` and documentation-only PRs still satisfy every required check; none is a blanket exemption from red CI.
36
+ - Group small related changes into one branch and one PR; see the skill for consolidation and the release-action windows.
@@ -1,48 +1,13 @@
1
1
  ---
2
2
  applyTo: "**/*"
3
- description: "Use when running any shell command, reading files, or searching code. Route commands through rtk for human-readable output (a hook auto-rewrites Bash commands; prefix rtk yourself where it does not); use raw output when the result is parsed, compared exactly, or drives another operation."
3
+ description: "Choose command wrappers without losing exact output or exit codes."
4
4
  ---
5
5
  <!-- cratis-ai: generated Copilot instructions. Do not edit; rules/ is the source. -->
6
6
 
7
7
  # Using rtk (Token-Optimized Commands)
8
8
 
9
- [rtk](https://github.com/rtk-ai/rtk) (Rust Token Killer) is a CLI proxy that filters and compresses command output *before it reaches the model* — typically **60–90% fewer tokens** on common dev commands, with no loss of the signal you actually need. The default in this corpus is to **run every command rtk supports through rtk**. The savings are real and compound across a session: build, test, lint, git, search, and file-read output are exactly the high-volume, low-signal outputs rtk trims.
10
-
11
- ## How it works — let the hook do its job
12
-
13
- A `PreToolUse` hook **auto-rewrites Bash commands** to their `rtk` equivalent transparently and at zero token overhead (`git status` → `rtk git status`). For any supported command you do **nothing special** — run it normally and the hook wraps it. Where no hook is configured, prefix the command yourself — including each command in an `&&` chain: `rtk git add . && rtk git commit -m "msg"`.
14
-
15
- - **Audit coverage** with `rtk gain` (savings so far) and `rtk discover` (commands that slipped past rtk — missed opportunities to close).
16
-
17
- ## When to use raw output instead
18
-
19
- rtk output is a summary for a reader. It is never evidence of exact file contents, paths, Git state, or command semantics, and a filter can drop the line you needed. Use the raw command — `rtk proxy <cmd>`, or the plain command where nothing rewrites it — whenever:
20
-
21
- - the output is parsed by a script, compared exactly, or fed to another command;
22
- - the output is the evidence for a claim about content, paths, or Git state;
23
- - the command's exit code or exact diagnostics decide what happens next (security checks, structured JSON, machine-readable diagnostics);
24
- - a wrapped command failed. Read the actual error and retry through `rtk proxy` before concluding the tool, path, or repository is missing.
25
-
26
- Do not add `rtk` to scripts, hooks, or CI steps that deliberately use native commands; their raw output is the point. Exit codes are never traded for token savings — see [`exit-codes-and-wrappers.md`](./exit-codes-and-wrappers.instructions.md).
27
-
28
- ## What rtk supports (route these through rtk)
29
-
30
- - **Files** — `ls`, `tree`, `read`, `find`, `grep`, `diff`
31
- - **Git & GitHub** — `git status/log/diff/add/commit/push/pull`, `gh pr/issue/run …`
32
- - **Tests** — `dotnet test`, Jest, Vitest, Playwright, pytest, Go, Cargo, RSpec
33
- - **Build & lint** — `dotnet build`, `tsc`, ESLint, Biome, Prettier, Cargo Clippy, Ruff, golangci-lint, Rubocop
34
- - **Package managers** — pnpm/npm/yarn, pip, Bundler, Prisma
35
- - **Cloud & containers** — AWS CLI, Docker, Kubernetes, OpenShift
36
-
37
- In practice this means the Cratis **quality-gate commands** — `dotnet build`, `dotnet test`, `yarn lint`, `npx tsc -b`, `git`, `gh` — all flow through rtk automatically. Just run them.
38
-
39
- ## The one gap — built-in tools bypass the hook
40
-
41
- The hook only sees **Bash** commands. Claude Code's built-in `Read`, `Grep`, and `Glob` tools (and the Copilot equivalents) do **not** pass through it, so they are **not** auto-rewritten — and those are some of the most token-heavy operations in a session.
42
-
43
- - For **bulk reads and broad searches** where output volume is large, call **`rtk read` / `rtk grep` / `rtk find`** from the terminal so the savings are captured. This is a deliberate override of the usual "prefer the built-in file tools" default.
44
- - Keep the **built-in** `Read`/`Grep`/`Glob` for **small, targeted reads** and when you need exact line references for an edit — rtk filters output, so it serves exploration and volume, not the precise content an `Edit` must match verbatim.
45
-
46
- ## Availability
47
-
48
- This assumes the `rtk` binary is installed and the hook configured (`rtk init -g`). If `rtk` is **not** on `PATH`, ignore this rule and use the normal tools — never block work on rtk being present.
9
+ Read **cratis-rtk** before choosing wrappers. The Bash hook rewrites supported
10
+ commands; built-in tools bypass it. Exact output and real exit codes win:
11
+ use `rtk proxy <cmd>` for parsed output, diagnostics and evidence driving an
12
+ operation, including wrapped failures. Never use summaries as gate evidence.
13
+ If rtk is absent, use normal tools. Keep scripts, hooks and CI native.
@@ -26,7 +26,7 @@ and verify required checks before merging.
26
26
  and PR labeled `major` as usual, then stop before merging. Ask a human to confirm the breaking
27
27
  change(s), who is affected, and the resulting version number; the human merges it after an
28
28
  explicit yes to that specific question, and an agent never does — see
29
- [`pull-requests.md`](../rules/pull-requests.md#a-major-release-needs-a-humans-explicit-go-ahead).
29
+ [`pull-requests.md`](../skills/cratis-commits-and-pull-requests/references/pr-labels-and-release.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
 
32
32
  This prompt is for an explicit request to ship or land. If the user asked only to commit, only to
@@ -1,5 +1,15 @@
1
1
  ---
2
- applyTo: "**/*"
2
+ applyTo: "**/*.cs,**/*.ts,**/*.tsx,**/*.go,**/*.kt,**/*.kts,**/*.java,**/*.ex,**/*.exs"
3
+ paths:
4
+ - "**/*.cs"
5
+ - "**/*.ts"
6
+ - "**/*.tsx"
7
+ - "**/*.go"
8
+ - "**/*.kt"
9
+ - "**/*.kts"
10
+ - "**/*.java"
11
+ - "**/*.ex"
12
+ - "**/*.exs"
3
13
  ---
4
14
 
5
15
  # Code Quality
@@ -1,5 +1,18 @@
1
1
  ---
2
- applyTo: "**/*"
2
+ applyTo: "**/*.cs,**/*.ts,**/*.tsx,**/*.go,**/*.kt,**/*.kts,**/*.java,**/*.ex,**/*.exs,**/*.csproj,**/package.json,**/go.mod"
3
+ paths:
4
+ - "**/*.cs"
5
+ - "**/*.ts"
6
+ - "**/*.tsx"
7
+ - "**/*.go"
8
+ - "**/*.kt"
9
+ - "**/*.kts"
10
+ - "**/*.java"
11
+ - "**/*.ex"
12
+ - "**/*.exs"
13
+ - "**/*.csproj"
14
+ - "**/package.json"
15
+ - "**/go.mod"
3
16
  profile: framework
4
17
  ---
5
18
 
@@ -55,6 +55,8 @@ obtaining credentials, and other local conventions ("Product policy" above).
55
55
  - Project-specific guidance wins when it deliberately narrows shared behavior,
56
56
  but it may not weaken organization security, authorization, or required
57
57
  quality gates.
58
+ - Scope project file concerns with `paths`; put operational workflows in
59
+ `.agents/skills/`, not global `applyTo: "**/*"` rules.
58
60
 
59
61
  ## Collaboration Default
60
62
 
@@ -125,15 +127,14 @@ A claim is only as good as the signal behind it — a build result, a test run,
125
127
 
126
128
  | For | Location |
127
129
  | --- | --- |
128
- | **AI Corpus Profiles** — what profiles exist and how to configure them | `profiles.md` |
130
+ | Corpus profiles and configuration | `profiles.md` |
129
131
  | **Contributing to a Cratis framework repo** (framework profile) | `framework.md`; creating a repository in the Cratis organization: `new-repository-intake.md` |
130
132
  | Slice anatomy (commands, `Provide()`, validators, events, projections, read models, reactors, constraints, compliance, cross-slice) | `vertical-slices.md` |
131
133
  | C# / TypeScript style and code-quality principles | `csharp.md`, `typescript.md`, `code-quality.md`, `code-quality.csharp.md`, `code-quality.typescript.md` |
132
134
  | Kotlin / Java / Elixir style; Orleans grains; reactors; GitHub Actions workflows | `kotlin.md`, `java.md`, `elixir.md`, `orleans.md`, `reactors.md`, `github-actions.md` |
133
- | Documentation pages (`Documentation/`): structure, voice, examples, editing | `documentation.md`, `documentation-structure-and-formatting.md`, `writing-cratis-docs.md`, `editing-cratis-docs.md`, `writing-correct-examples.md` |
135
+ | Documentation structure, voice and examples | `documentation.md`, `documentation-structure-and-formatting.md`, `writing-cratis-docs.md`, `editing-cratis-docs.md`, `writing-correct-examples.md` |
134
136
  | Findability of published pages, READMEs and package metadata | `discoverability.md` |
135
- | Go style, source and module files | `go.md`; framework contributors also read `go-engineering.md`; product APIs use `cratis-chronicle-client-go`, `cratis-arc-go` and `cratis-fundamentals-concept-go` |
136
- | Service lifetimes — why anything taking a scoped dependency is scoped or transient, never a singleton | `csharp.md` |
137
+ | Go | `go.md`; framework: `go-engineering.md`; product APIs: `cratis-chronicle-client-go`, `cratis-arc-go` and `cratis-fundamentals-concept-go` |
137
138
  | React + Arc + Cratis Components + MVVM + dialogs | `react.md`, `components.md`, `dialogs.md` |
138
139
  | Frontend engineering quality & testing | `frontend-quality.md`, `frontend-testing.md`, `storybook.md` |
139
140
  | Spec patterns — universal `Specification` base (both profiles) | `specs.md`, `specs.csharp.md`, `specs.typescript.md` |
@@ -144,16 +145,16 @@ A claim is only as good as the signal behind it — a build result, a test run,
144
145
  | Inspecting or operating a **running** Chronicle store (failed partitions, replays, browsing events) with the `cratis` CLI | the **cratis-chronicle-cli-operations** and **cratis-cli-terminal-workbench** skills |
145
146
  | EF Core read models / migrations | `efcore.md`, `efcore.specs.md` |
146
147
  | MongoDB queries — native driver API over LINQ; paging and sorting belong to Arc | `mongodb.md` |
147
- | Before writing a commit message, committing, pushing or opening/editing a PR: read both | `git-commits.md`, `pull-requests.md` |
148
+ | Before commit messages, commits, pushes or PRs | `git-commits.md`, `pull-requests.md`, then **cratis-commits-and-pull-requests** |
148
149
  | Reading, citing and superseding a decision record | the **cratis-engineering-decision-record** skill |
149
150
  | Before any browser call: production permit, handoff, artifact paths, evidence | `browser.md` |
150
151
  | Whether you are allowed to do the thing you are able to do | `capability-is-not-authority.md` |
151
152
  | Before running a command that could print a credential, or when a secret value appears in output | `secrets.md` |
152
- | What must stop and ask a human | `capability-is-not-authority.md` |
153
- | What counts as evidence that something works | `verification-discipline.md` |
154
- | Before writing a session note, plan or handover: where they may live (`.ai-work/` only) | `local-work-artifacts.md` |
155
- | What may be written into the `.cratis/` folder (configuration and the corpus only, never deliverables) | `cratis-folder-is-configuration.md` |
156
- | Exit-code meaning, scripts and wrappers that lose a verdict; which language a script uses | `exit-codes-and-wrappers.md`, `scripting.md` |
153
+ | Session notes, plans and handovers (`.ai-work/` only) | `local-work-artifacts.md` |
154
+ | Command wrappers, exact output and exit codes | `rtk.md`, then **cratis-rtk** |
155
+ | Before issue-linked edits | `issue-assignment.md`, then **cratis-engineering-issue-hygiene** |
156
+ | `.cratis/` is configuration, not deliverables | `cratis-folder-is-configuration.md` |
157
+ | Exit codes, wrappers and scripting | `exit-codes-and-wrappers.md`, `scripting.md` |
157
158
  | Writing a scan, allowlist, script or CI check, or a destructive pass, that cannot pass vacuously | `guards-and-fuses.md` |
158
159
  | How the shared corpus is installed, updated and rolled back | `ai-distribution.md` |
159
160
  | Code-level event modeling / schema migration / calling commands from code / paging / cross-cutting metadata / multi-tenancy | the matching skills |