@erclx/aitk 0.21.0 → 0.22.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/claude/.claude-plugin/plugin.json +1 -1
- package/claude/skills/claude-address-review/REQUIREMENT.md +1 -0
- package/claude/skills/claude-address-review/SKILL.md +4 -3
- package/claude/skills/claude-diagram/SKILL.md +1 -1
- package/claude/skills/claude-pr-review/REQUIREMENT.md +1 -0
- package/claude/skills/claude-pr-review/SKILL.md +1 -1
- package/claude/skills/git-followup/REQUIREMENT.md +1 -1
- package/claude/skills/git-followup/SKILL.md +1 -1
- package/claude/skills/git-issue/REQUIREMENT.md +1 -1
- package/claude/skills/git-issue/SKILL.md +1 -1
- package/claude/skills/git-pr/REQUIREMENT.md +1 -1
- package/claude/skills/git-pr/SKILL.md +1 -1
- package/claude/skills/git-split/REQUIREMENT.md +1 -1
- package/claude/skills/git-split/SKILL.md +1 -1
- package/docs/agents.md +3 -3
- package/docs/target-projects.md +1 -1
- package/package.json +1 -1
- package/src/commands/sandbox.ts +35 -1
- package/standards/index.md +1 -1
- package/standards/prose.md +16 -2
- package/standards/versioning.md +11 -1
|
@@ -17,6 +17,7 @@ Without this skill, review findings are worked in whatever order the author read
|
|
|
17
17
|
- Push before replying, so the comment never runs ahead of the code it describes
|
|
18
18
|
- Map every finding to what changed, or to a one-line reason when it is a question or a conscious accept
|
|
19
19
|
- Post the terminal comment only when the findings are addressed and every check passes
|
|
20
|
+
- Scan the reply for banned characters and internal phase labels before posting, since the comment leaves for the remote unchecked
|
|
20
21
|
|
|
21
22
|
## Must not
|
|
22
23
|
|
|
@@ -73,9 +73,10 @@ bullet per finding, each opening with the bolded finding identifier.
|
|
|
73
73
|
Close the body with `🤖 Addressed by Claude Code` on its own line so the reply
|
|
74
74
|
reads as an independent machine pass, not a human sign-off.
|
|
75
75
|
|
|
76
|
-
Before posting, run the
|
|
77
|
-
against the reply
|
|
78
|
-
|
|
76
|
+
Before posting, run the pre-publish scan in `.claude/standards/prose.md`
|
|
77
|
+
against the reply, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the
|
|
78
|
+
project does not have it. The hook skips `.claude/.tmp/`, so this scan is the
|
|
79
|
+
only gate on the published reply. Post it to the PR:
|
|
79
80
|
|
|
80
81
|
```bash
|
|
81
82
|
gh pr comment <number> --body-file .claude/.tmp/address-review/reply-<number>.md
|
|
@@ -80,7 +80,7 @@ The code paths the explanation cites are what the `claude-docs` sweep watches fo
|
|
|
80
80
|
|
|
81
81
|
Quote node labels containing spaces or special characters with double quotes (`A["Web shell"]`). Avoid parentheses inside labels, they break some renderers. Use `<br/>` for line breaks inside labels.
|
|
82
82
|
|
|
83
|
-
Run the
|
|
83
|
+
Run the pre-publish scan in `.claude/standards/prose.md` against the whole file, including inside mermaid `subgraph` labels and node text, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it. The file lands in the repository rather than on a remote, so the scan's destination scoping leaves the character checks and not the phase-label one. A colon also works as a replacement inside a label. The pedagogical voice the diagram standard asks for is a yield on voice alone and buys no exemption from these bans.
|
|
84
84
|
|
|
85
85
|
Nothing enforces the ban inside the diagram. The standards-audit hook toggles on a fence and skips every line within it, so a label carrying an em dash passes silently while the same character in the explanation paragraph below is caught. Check the labels by reading them. This is the one place in the file where the author is the only gate.
|
|
86
86
|
|
|
@@ -17,6 +17,7 @@ Without this skill, a pull request is reviewed only by the session that wrote it
|
|
|
17
17
|
- Apply the integration, contract, and consumer lenses a self-review structurally cannot
|
|
18
18
|
- Post a close-out even with nothing to report, since a first pass left unanswered reads as a review nobody closed
|
|
19
19
|
- Key the body file on both the pull request number and the head commit, so no two passes overwrite each other
|
|
20
|
+
- Scan the comment for banned characters and internal phase labels before posting, since a finding phrased against a phase label reaches a reader with no task board
|
|
20
21
|
|
|
21
22
|
## Must not
|
|
22
23
|
|
|
@@ -131,7 +131,7 @@ The `What is right` section is optional, capped at three bullets, and included o
|
|
|
131
131
|
|
|
132
132
|
Close the body with `🤖 Reviewed by Claude Code` on its own line so the review reads as an independent machine pass, not a human sign-off.
|
|
133
133
|
|
|
134
|
-
Before posting, run the
|
|
134
|
+
Before posting, run the pre-publish scan in `.claude/standards/prose.md` against the body, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it. The hook skips `.claude/.tmp/`, so this scan is the only gate on the published comment. A finding phrased against an internal phase label is what the label half of the scan catches here.
|
|
135
135
|
|
|
136
136
|
```bash
|
|
137
137
|
gh pr review <number> --comment --body-file .claude/.tmp/pr-review/body-<number>-<short-sha>.md
|
|
@@ -14,7 +14,7 @@ Without this skill, an edit made after a pull request is already open ships as a
|
|
|
14
14
|
- Refuse unless the branch has an upstream and an open pull request, since every later step addresses one of the two
|
|
15
15
|
- Delegate the message to `git-commit` rather than composing one, so a follow-up commit reads like every other commit
|
|
16
16
|
- Sync the body when the new commit moves the scope, and the title when the shift makes it inaccurate
|
|
17
|
-
- Reply on the pull request when it carries review comments, and scan that reply for the banned characters before posting. The hook watches files and never sees a comment body on its way to the remote.
|
|
17
|
+
- Reply on the pull request when it carries review comments, and scan that reply for the banned characters and internal phase labels before posting. The hook watches files and never sees a comment body on its way to the remote.
|
|
18
18
|
- Suppress the reply when the caller owns it, and still run the push and the body sync
|
|
19
19
|
|
|
20
20
|
## Must not
|
|
@@ -24,7 +24,7 @@ its own reply, so skip the comment in step 6. The push and body sync still run.
|
|
|
24
24
|
3. Invoke `aitk:git-commit` to generate one conventional commit from the staged diff
|
|
25
25
|
4. Run `git push` to the tracking branch
|
|
26
26
|
5. Check for existing review comments: `gh api 'repos/{owner}/{repo}/pulls/<number>/comments' --jq 'length'`, resolving `<number>` from `gh pr view --json number`.
|
|
27
|
-
6. When invoked with `reply-owned`, skip this step's comment: the caller posts the reply. Otherwise, if the count is above zero, the followup addresses review feedback: post a one-line summary of the fix with `gh pr comment --body`, first running the
|
|
27
|
+
6. When invoked with `reply-owned`, skip this step's comment: the caller posts the reply. Otherwise, if the count is above zero, the followup addresses review feedback: post a one-line summary of the fix with `gh pr comment --body`, first running the pre-publish scan in `.claude/standards/prose.md` against it, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it, since the hook does not see an inline comment body. If it is zero, run `gh pr view --json url,title,body` and update the body with `gh pr edit --body` when the new commit changes scope, and the title with `gh pr edit --title` when the scope shifted enough to make it inaccurate.
|
|
28
28
|
|
|
29
29
|
## After completion
|
|
30
30
|
|
|
@@ -13,7 +13,7 @@ Without this skill, an issue takes the shape of whatever the session was saying.
|
|
|
13
13
|
|
|
14
14
|
- Read the issue reference and the prose standard before formatting
|
|
15
15
|
- Confirm a remote and an authenticated `gh` before composing, so the failure lands before a body is written rather than after
|
|
16
|
-
- Scan the title and body for banned characters as an explicit step. Reading the standard does not catch them, because the text is generated after the read.
|
|
16
|
+
- Scan the title and body for banned characters and internal phase labels as an explicit step. Reading the standard does not catch them, because the text is generated after the read.
|
|
17
17
|
- Map the type to exactly one label, so filing and filtering agree
|
|
18
18
|
- Ask once when the type is ambiguous between a bug and a task, since the label follows from it and a wrong label buries the issue
|
|
19
19
|
- Pass the body through a file and remove it afterward, so shell quoting cannot mangle it
|
|
@@ -40,7 +40,7 @@ After outputting the preview, execute the final command immediately. Claude Code
|
|
|
40
40
|
|
|
41
41
|
### Pre-publish scan
|
|
42
42
|
|
|
43
|
-
Before running the final command, run the
|
|
43
|
+
Before running the final command, run the pre-publish scan in `.claude/standards/prose.md` against the title and body, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/references/issue.md`.
|
|
44
44
|
|
|
45
45
|
### Final command
|
|
46
46
|
|
|
@@ -15,7 +15,7 @@ Without this skill, a pull request body is written from memory of the branch rat
|
|
|
15
15
|
- Derive the title and body from the commits and the diff against main, with lockfiles excluded
|
|
16
16
|
- Run each check before writing its line, then state the result the run reported
|
|
17
17
|
- Leave a box unchecked only for a human-only case, naming which human and why on the same line
|
|
18
|
-
- Scan the title and body for banned characters as an explicit step, on top of reading the prose standard
|
|
18
|
+
- Scan the title and body for banned characters and internal phase labels as an explicit step, on top of reading the prose standard
|
|
19
19
|
- Detect an open pull request and edit it in place, so a follow-up push keeps the body in sync instead of failing
|
|
20
20
|
|
|
21
21
|
## Must not
|
|
@@ -69,7 +69,7 @@ Leave a box unchecked only for the human-only cases the reference defines, and n
|
|
|
69
69
|
|
|
70
70
|
### Pre-publish scan
|
|
71
71
|
|
|
72
|
-
Before running the final command, run the
|
|
72
|
+
Before running the final command, run the pre-publish scan in `.claude/standards/prose.md` against the PR title and body, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it. The title and body go straight to the remote with nothing checking them on the way, so this scan is the only gate. It covers the phase-label check as well as the characters, since both go to a reader who has no task board. It applies on top of the banned phrases in `${CLAUDE_SKILL_DIR}/references/pr.md`.
|
|
73
73
|
|
|
74
74
|
### Final command
|
|
75
75
|
|
|
@@ -17,7 +17,7 @@ Without this skill, a branch carrying unrelated commits ships as one pull reques
|
|
|
17
17
|
- Account for every commit ahead of main in the preview
|
|
18
18
|
- State the merge order and the reason behind it, since the order is not recoverable from reading the pull requests afterward
|
|
19
19
|
- Carry the restack loop for stacked mode, where each branch is rebased onto main once the one below it merges
|
|
20
|
-
- Scan every generated title and body for banned characters as an explicit step before opening a pull request
|
|
20
|
+
- Scan every generated title and body for banned characters and internal phase labels as an explicit step before opening a pull request
|
|
21
21
|
|
|
22
22
|
## Must not
|
|
23
23
|
|
|
@@ -69,7 +69,7 @@ If Mode is Independent, append this line to the preview:
|
|
|
69
69
|
|
|
70
70
|
After outputting the preview, execute the final commands immediately. Claude Code's tool permission dialog is the confirmation gate. Do not wait for user input.
|
|
71
71
|
|
|
72
|
-
Before running them, run the
|
|
72
|
+
Before running them, run the pre-publish scan in `.claude/standards/prose.md` against every title and body, or `${CLAUDE_SKILL_DIR}/../../standards/prose.md` when the project does not have it. Each body stages under `.claude/.tmp/` and leaves through `gh`, so the hook sees neither and this scan is the only gate.
|
|
73
73
|
|
|
74
74
|
### Final commands
|
|
75
75
|
|
package/docs/agents.md
CHANGED
|
@@ -66,7 +66,7 @@ Full help: `aitk <command> --help`.
|
|
|
66
66
|
| `aitk init [path]` | Bootstrap a project with selected toolkit domains |
|
|
67
67
|
| `aitk sync [path]` | Sync all installed domains in a target project |
|
|
68
68
|
| `aitk sync --check` | Report toolkit drift without writing (`--json`, `--exit-code`) |
|
|
69
|
-
| `aitk sandbox [cat:cmd]` | Run sandbox scenarios (interactive or routed)
|
|
69
|
+
| `aitk sandbox [cat:cmd]` | Run sandbox scenarios (interactive or routed), toolkit-only like the tree it reads |
|
|
70
70
|
| `aitk sandbox reset` | Reset sandbox to baseline |
|
|
71
71
|
| `aitk sandbox clean` | Wipe the sandbox |
|
|
72
72
|
| `aitk sandbox check` | Score a provisioned sandbox against a scenario expectation (`--json` for the verdict) |
|
|
@@ -189,7 +189,7 @@ inside an already-open frame.
|
|
|
189
189
|
|
|
190
190
|
### Sandbox scenarios
|
|
191
191
|
|
|
192
|
-
Scenarios live under `scripts/sandbox/`, one folder per category. `scripts/sandbox/fixtures/` is the exception, holding file content that scenarios stage rather than scenarios of its own, so both pickers filter it out. Route non-interactively with `SANDBOX_SCENARIO`:
|
|
192
|
+
Scenarios live under `scripts/sandbox/`, one folder per category. `scripts/sandbox/fixtures/` is the exception, holding file content that scenarios stage rather than scenarios of its own, so both pickers filter it out. `files` in `package.json` excludes that tree, so an installed `aitk` carries the command, reports it as toolkit-only on one line, and exits 1 rather than failing on the missing directory. Route non-interactively with `SANDBOX_SCENARIO`:
|
|
193
193
|
|
|
194
194
|
```bash
|
|
195
195
|
SANDBOX_SCENARIO=sync aitk sandbox infra:tooling
|
|
@@ -222,7 +222,7 @@ Exit 0 means `pass` or `unchecked`. Exit 1 means `fail`, or a caller error: a ma
|
|
|
222
222
|
|
|
223
223
|
### Scenario coverage
|
|
224
224
|
|
|
225
|
-
`aitk sandbox coverage` reports which scenarios declare expectations and which only provision a state. It reads the fixture tree, so it needs no provisioned sandbox and runs nothing.
|
|
225
|
+
`aitk sandbox coverage` reports which scenarios declare expectations and which only provision a state. It reads the fixture tree, so it needs no provisioned sandbox and runs nothing. Where that tree does not ship it exits 1 and prints no percentage, since a denominator nobody looked at is not a coverage result. A tree that is present and holds no scenarios is a real zero and still reports one.
|
|
226
226
|
|
|
227
227
|
```bash
|
|
228
228
|
aitk sandbox coverage --json
|
package/docs/target-projects.md
CHANGED
|
@@ -77,7 +77,7 @@ Run `aitk tooling list --json` and `aitk gov list --json` to see the current cat
|
|
|
77
77
|
`governance`, `standards`, and `wiki` are skippable:
|
|
78
78
|
|
|
79
79
|
- `--skip governance`: leave `.claude/rules/` empty. Standards still install, so `.claude/standards/prose.md` lands with nothing pointing at it and no coding standard loads on a file match. The preview names any `--add` rules the skip drops, and the run prints the `aitk gov install <stack> <path>` command to add rules afterward, carrying those extras so one paste restores what the skip declined.
|
|
80
|
-
- `--skip standards`: leave standards out. The governance rules still reference `.claude/standards/`, so their authority lines resolve to nothing. Toolkit skills are unaffected, since each falls back to the copy in its own plugin root. That fallback now carries runtime behavior rather than reference prose alone, because the
|
|
80
|
+
- `--skip standards`: leave standards out. The governance rules still reference `.claude/standards/`, so their authority lines resolve to nothing. Toolkit skills are unaffected, since each falls back to the copy in its own plugin root. That fallback now carries runtime behavior rather than reference prose alone, because the pre-publish scan and the branch-slug transform are defined in the standards and cited by the skills that run them.
|
|
81
81
|
- `--skip wiki`: skip the `.claude/wiki/` scaffold. A target that already carries a root `wiki/` keeps it, since the verb reports that folder rather than migrating it.
|
|
82
82
|
|
|
83
83
|
## Add a domain later
|
package/package.json
CHANGED
package/src/commands/sandbox.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
type Verdict,
|
|
18
18
|
} from '@/sandbox/expect'
|
|
19
19
|
import {
|
|
20
|
+
frameError,
|
|
20
21
|
intro,
|
|
21
22
|
logError,
|
|
22
23
|
logInfo,
|
|
@@ -29,6 +30,34 @@ import {
|
|
|
29
30
|
|
|
30
31
|
const SANDBOX_DIR = join(PROJECT_ROOT, 'scripts', 'sandbox')
|
|
31
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Reports that the scenario tree does not ship, and answers whether it reported,
|
|
35
|
+
* so a caller that sees `true` returns without touching the tree.
|
|
36
|
+
*
|
|
37
|
+
* `scripts/sandbox` is excluded from the published package, so an installed
|
|
38
|
+
* `aitk` resolves `SANDBOX_DIR` to a directory that is not there. Both entry
|
|
39
|
+
* points that walk the tree ask here rather than carrying a check each, because
|
|
40
|
+
* absence is a property of the install rather than of a verb, and a second copy
|
|
41
|
+
* of the question is a second message to keep true. `check` reads the tree as
|
|
42
|
+
* well, through `expectFilePath`, and needs no guard because its provisioned-tree
|
|
43
|
+
* check already stops an installed run before the read.
|
|
44
|
+
*
|
|
45
|
+
* The distinction it preserves is between an absent tree and an empty one. Only
|
|
46
|
+
* the second is a real zero, and a coverage percentage over a denominator nobody
|
|
47
|
+
* looked at reads as a suite that examined everything and found it clean.
|
|
48
|
+
*
|
|
49
|
+
* The frame opens and closes here, so this runs before `intro` rather than
|
|
50
|
+
* inside an open frame.
|
|
51
|
+
*/
|
|
52
|
+
function reportAbsentScenarioTree(): boolean {
|
|
53
|
+
if (existsSync(SANDBOX_DIR)) return false
|
|
54
|
+
|
|
55
|
+
frameError('sandbox is toolkit-only and is absent from an installed aitk')
|
|
56
|
+
process.exitCode = 1
|
|
57
|
+
|
|
58
|
+
return true
|
|
59
|
+
}
|
|
60
|
+
|
|
32
61
|
/**
|
|
33
62
|
* The provisioned tree, as opposed to `SANDBOX_DIR` above, which holds the
|
|
34
63
|
* scenario scripts. It sits outside the toolkit worktree so the toolkit's own
|
|
@@ -217,6 +246,8 @@ function reportCoverage(report: CoverageReport): void {
|
|
|
217
246
|
}
|
|
218
247
|
|
|
219
248
|
function runCoverage(options: CoverageOptions): void {
|
|
249
|
+
if (reportAbsentScenarioTree()) return
|
|
250
|
+
|
|
220
251
|
intro('aitk sandbox coverage')
|
|
221
252
|
|
|
222
253
|
const report = collectCoverage(PROJECT_ROOT)
|
|
@@ -284,6 +315,8 @@ export function register(program: Command): void {
|
|
|
284
315
|
.allowExcessArguments(true)
|
|
285
316
|
.passThroughOptions()
|
|
286
317
|
.action(async (_opts: unknown, cmd: Command) => {
|
|
318
|
+
if (reportAbsentScenarioTree()) return
|
|
319
|
+
|
|
287
320
|
const args = cmd.args
|
|
288
321
|
|
|
289
322
|
if (args.length === 0) {
|
|
@@ -336,7 +369,8 @@ export function register(program: Command): void {
|
|
|
336
369
|
' aitk sandbox coverage',
|
|
337
370
|
' aitk sandbox coverage --json',
|
|
338
371
|
'',
|
|
339
|
-
'Exit codes: 0
|
|
372
|
+
'Exit codes: 0, unless --strict and a scenario declares nothing.',
|
|
373
|
+
'Where the scenario tree does not ship, exits 1 without a report.',
|
|
340
374
|
].join('\n'),
|
|
341
375
|
)
|
|
342
376
|
.action((options: CoverageOptions) => {
|
package/standards/index.md
CHANGED
|
@@ -18,5 +18,5 @@ Reference docs for consistent authoring across the toolkit and target projects.
|
|
|
18
18
|
- [Claude skill reference](skill.md): Claude skill structure and authoring rules
|
|
19
19
|
- [Standard reference](standard.md): Shape and content rules for authoring a standard
|
|
20
20
|
- [Tasks reference](tasks.md): Folder layout, filename convention, and content rules for .claude/tasks/
|
|
21
|
-
- [Versioning reference](versioning.md): Phase label vs semver discipline across tasks, PRs, commits, and tags
|
|
21
|
+
- [Versioning reference](versioning.md): Phase label vs semver discipline across tasks, PRs, reviews, issues, commits, and tags
|
|
22
22
|
- [Wireframe reference](wireframes.md): Shape and content rules for .claude/wireframes/<surface>.md files
|
package/standards/prose.md
CHANGED
|
@@ -74,10 +74,14 @@ Applies to markdown reference docs, READMEs, and inline documentation in repos.
|
|
|
74
74
|
- Do not address the reader as a participant (`Let's`, `Here's`, `Here are`). State the content directly.
|
|
75
75
|
- Commit to a position. Do not hedge in clusters (`It might be worth considering`) or use false balance (`While X is true, Y is also important`). Recommend, or state the tradeoff.
|
|
76
76
|
|
|
77
|
-
##
|
|
77
|
+
## Pre-publish scan
|
|
78
78
|
|
|
79
79
|
Wherever text leaves through a channel no automated check covers, the author is the only gate and runs this scan. Text sent to another service, written to a path the project's checks exclude, and text inside a fenced block are the usual cases. The surface that publishes the text is what knows which gap applies, so it names its own rather than reading one here.
|
|
80
80
|
|
|
81
|
+
Run the scan as an explicit step against the finished text. Having read this file before drafting does not cover it, because the check has to happen after the text exists.
|
|
82
|
+
|
|
83
|
+
### Banned characters
|
|
84
|
+
|
|
81
85
|
Scan the drafted text and rewrite each occurrence:
|
|
82
86
|
|
|
83
87
|
- `—` (em dash): split into two sentences, or use a comma
|
|
@@ -85,7 +89,17 @@ Scan the drafted text and rewrite each occurrence:
|
|
|
85
89
|
|
|
86
90
|
Restructure the sentence rather than substituting the character. A semicolon swapped for a period leaves both clauses in the order the semicolon chose, which is the shape the ban exists to remove.
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
### Phase labels
|
|
93
|
+
|
|
94
|
+
The versioning standard beside this file holds the label rule and the table of surfaces. Read it at scan time rather than working the format from memory.
|
|
95
|
+
|
|
96
|
+
Scope this check by destination. Text published to a remote takes it. Text scanned on its way into the repository, where the reader has the task board, takes the character checks alone.
|
|
97
|
+
|
|
98
|
+
### An unreadable source
|
|
99
|
+
|
|
100
|
+
Stop and name the source when one this scan reaches for cannot be read. Do not scan what resolved and report the result.
|
|
101
|
+
|
|
102
|
+
A run that covers half its sources and says nothing is worse than one that visibly did not happen, because the surfaces running this scan are the ones that describe themselves as the only gate. A clean result from a half-run scan is read as coverage.
|
|
89
103
|
|
|
90
104
|
## Frontmatter descriptions
|
|
91
105
|
|
package/standards/versioning.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Versioning reference
|
|
3
|
-
description: Phase label vs semver discipline across tasks, PRs, commits, and tags
|
|
3
|
+
description: Phase label vs semver discipline across tasks, PRs, reviews, issues, commits, and tags
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Versioning reference
|
|
@@ -31,6 +31,9 @@ External release identity used in git tags and release notes. Independent of pha
|
|
|
31
31
|
| `.claude/tasks/` | yes | no |
|
|
32
32
|
| Chat with the operator | yes | no |
|
|
33
33
|
| PR titles | no | only when the PR cuts a release |
|
|
34
|
+
| PR bodies | no | only when the PR cuts a release |
|
|
35
|
+
| Review comments | no | only when referencing a release |
|
|
36
|
+
| Issue titles and bodies | no | only when referencing a release |
|
|
34
37
|
| Commit messages | no | only when the commit cuts a release |
|
|
35
38
|
| Git tags | no | yes |
|
|
36
39
|
| README and `CHANGELOG.md` | no | yes |
|
|
@@ -41,6 +44,13 @@ External release identity used in git tags and release notes. Independent of pha
|
|
|
41
44
|
- Commit subjects do not embed phase labels.
|
|
42
45
|
- Git tags use semver only. Phase labels never become tags.
|
|
43
46
|
- A PR that cuts a release may reference its semver tag in the title or body. Phase labels still do not appear.
|
|
47
|
+
- PR bodies, review comments, and issue text name the change itself, never the internal stream that scheduled it. Describe the work rather than the label it was planned under.
|
|
48
|
+
|
|
49
|
+
## Pre-publish check
|
|
50
|
+
|
|
51
|
+
Text bound for a remote is checked for phase labels against the finished draft, before it is sent. A body, comment, or title reaches a reader who has no task board, so a label that survives to publication cannot be resolved by anyone downstream.
|
|
52
|
+
|
|
53
|
+
The surface publishing the text is the last gate on it. Where no automated check covers that surface, the author performs the check as an explicit step rather than relying on having read this file while drafting.
|
|
44
54
|
|
|
45
55
|
## Why
|
|
46
56
|
|