@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.
- package/package/corpus/harnesses/copilot/instructions/code-quality.instructions.md +11 -1
- package/package/corpus/harnesses/copilot/instructions/framework.instructions.md +14 -1
- package/package/corpus/harnesses/copilot/instructions/git-commits.instructions.md +9 -102
- package/package/corpus/harnesses/copilot/instructions/glossary.instructions.md +14 -1
- package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +18 -170
- package/package/corpus/harnesses/copilot/instructions/rtk.instructions.md +6 -41
- package/package/corpus/prompts/ship-changes.prompt.md +1 -1
- package/package/corpus/rules/code-quality.md +11 -1
- package/package/corpus/rules/framework.md +14 -1
- package/package/corpus/rules/general.md +11 -10
- package/package/corpus/rules/git-commits.md +9 -102
- package/package/corpus/rules/glossary.md +14 -1
- package/package/corpus/rules/issue-assignment.md +6 -26
- package/package/corpus/rules/pull-requests.md +18 -170
- package/package/corpus/rules/rtk.md +6 -41
- package/package/corpus/skills/cratis-commits-and-pull-requests/LICENSE +2 -0
- package/package/corpus/skills/cratis-commits-and-pull-requests/SKILL.md +48 -0
- package/package/corpus/skills/cratis-commits-and-pull-requests/references/commits.md +110 -0
- package/package/corpus/skills/cratis-commits-and-pull-requests/references/pr-description.md +90 -0
- package/package/corpus/skills/cratis-commits-and-pull-requests/references/pr-labels-and-release.md +82 -0
- package/package/corpus/skills/cratis-commits-and-pull-requests/verification.json +11 -0
- package/package/corpus/skills/cratis-engineering-ci-gates/SKILL.md +1 -1
- package/package/corpus/skills/cratis-engineering-issue-hygiene/SKILL.md +17 -3
- package/package/corpus/skills/cratis-engineering-issue-hygiene/verification.json +11 -0
- package/package/corpus/skills/cratis-rtk/LICENSE +2 -0
- package/package/corpus/skills/cratis-rtk/SKILL.md +59 -0
- package/package/corpus/skills/cratis-rtk/verification.json +11 -0
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +30 -0
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +2 -2
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +1 -1
- package/package/profile-catalog.json +90 -1
- 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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
44
|
-
- **Landing a PR?** `gh pr merge --merge` (a real merge commit). **Not `--squash`, not `--rebase`.**
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
10
|
+
## The description is the release note
|
|
13
11
|
|
|
14
|
-
|
|
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
|
|
17
|
-
-
|
|
18
|
-
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
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
|
|
32
|
+
## Before you create or edit a PR
|
|
182
33
|
|
|
183
|
-
- `
|
|
184
|
-
- `dotnet test`
|
|
185
|
-
-
|
|
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: "
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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`](../
|
|
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
|
-
|
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
|
153
|
-
|
|
|
154
|
-
| Before
|
|
155
|
-
|
|
|
156
|
-
| Exit
|
|
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 |
|