@boopkit/cap-product-design 0.6.5 → 0.6.6

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/capability.json CHANGED
@@ -12,7 +12,8 @@
12
12
  "boop-product-design-reference-integration",
13
13
  "boop-product-design-thought-partnership",
14
14
  "boop-writing-technical-prose",
15
- "boop-writing-documents"
15
+ "boop-writing-documents",
16
+ "boop-writing-semantic-line-breaks"
16
17
  ],
17
18
  "skill_migrations": {
18
19
  "boop-product-design-engineering-design": "design.engineering-design.skill.md",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boopkit/cap-product-design",
3
- "version": "0.6.5",
3
+ "version": "0.6.6",
4
4
  "description": "Product design skills for AI agents",
5
5
  "files": [
6
6
  "skills/",
@@ -201,4 +201,7 @@ For each row, the justification names *why this mechanism fits this job's shape*
201
201
 
202
202
  ### Why this matters
203
203
 
204
- Without an explicit interaction-shapes pass, the agent inherits whatever pattern the existing page already uses, justifies it post-hoc against whatever frame is available, and produces a design that converges on the existing shape regardless of how the jobs have changed. The pass forces a clean per-affordance decision and makes the design visible. It also makes the design checkable — a reviewer can read the affordance table and ask, for each row, *does this mechanism fit this job?*
204
+ Without an explicit interaction-shapes pass, the agent inherits whatever pattern the existing page already uses, justifies it post-hoc against whatever frame is available, and produces a design that converges on the existing shape regardless of how the jobs have changed. The pass forces a clean per-affordance decision and makes the design visible. It also makes the design checkable — a reviewer can read the affordance table and ask, for each row, *does this mechanism fit this job?*
205
+ ## Related
206
+
207
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — design docs live in `specs/`; break their lines semantically so edits diff cleanly.
@@ -8,4 +8,8 @@ metadata:
8
8
  - Identity the intended audience. For example, data engineers who may not have done this sort of exercise before.
9
9
  - Identify the audience's "group identity". For example, which company, team, or project they belong to.
10
10
  - Identify the activity to be explained. For example, designing or operating at scale.
11
- - Write up an introduction to {audience} that haven’t done this sort of {activity} before. This should be a gentle intro, {group identity} flavored, “this is going to be fun” toned, very precise engineering speak explanation of what is going to be in place for {activity}. Use “we” as needed. Provide as markdown.
11
+ - Write up an introduction to {audience} that haven’t done this sort of {activity} before. This should be a gentle intro, {group identity} flavored, “this is going to be fun” toned, very precise engineering speak explanation of what is going to be in place for {activity}. Use “we” as needed. Provide as markdown.
12
+
13
+ ## Related
14
+
15
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — when the documentation lands in a markdown file in the repo.
@@ -109,3 +109,7 @@ When writing a feature spec, work the following order. Each step depends on the
109
109
  8. **Success metrics** — per job, observable
110
110
 
111
111
  Steps 1–3 are where this skill earns its keep. Skipping them produces well-structured feature checklists with no design clarity downstream.
112
+
113
+ ## Related
114
+
115
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — specs live in `specs/`; break their lines semantically so edits diff cleanly.
@@ -48,3 +48,7 @@ After editing, verify:
48
48
  - **"See also" link dumps** — links should be inline where the concept is discussed, not in a footer list
49
49
  - **Copy-pasting from the spec** — specs use future tense and rationale; reference uses present tense and describes what is, not why it was chosen
50
50
  - **Leaving stale content** — if the feature changes existing behavior, update or remove the old description
51
+
52
+ ## Related
53
+
54
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — `reference/` pages are edited far more often than they are written; semantic line breaks are what keep those edits reviewable.
@@ -105,3 +105,4 @@ When a reader points at one fault, treat it as an example rather than an invento
105
105
 
106
106
  - [`boop-writing-technical-prose`](../boop-writing-technical-prose/SKILL.md) — sentence-level standard and the full anti-pattern list; this skill inherits its goal.
107
107
  - [`boop-product-design-feature-requirements`](../boop-product-design-feature-requirements/SKILL.md) — when the document is a feature spec or PRD.
108
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — line-break convention for the markdown source of the document.
@@ -0,0 +1,129 @@
1
+ ---
2
+ name: boop-writing-semantic-line-breaks
3
+ description: "When you need to write or edit prose in a markdown file under version control — a spec, a reference page, a README, a skill — break lines at semantic boundaries rather than at a fixed column, so that edits produce readable diffs."
4
+ metadata:
5
+ category: writing
6
+ ---
7
+
8
+ # Semantic Line Breaks
9
+
10
+ ## Goal
11
+
12
+ **A line break in a prose file is a diff tool, not a formatting preference.**
13
+
14
+ Hard-wrapping at a fixed column puts the break wherever the word count happens to run out.
15
+ Change one word early in a paragraph and every line after it reflows, so the diff shows a rewritten paragraph when what actually changed was an adjective.
16
+ Nobody can review that.
17
+
18
+ Semantic line breaks put the break where the *thought* breaks.
19
+ An edit to a sentence then shows up as a one-line diff, a review comment lands on the claim it is about, and a reader scanning the source sees the shape of the argument before reading a word of it.
20
+
21
+ The rendered output is identical either way.
22
+ Markdown treats a single newline inside a paragraph as a space, so this is invisible to anyone reading the published page.
23
+ It is purely a convenience for the people editing and reviewing the source.
24
+
25
+ This follows the [Semantic Line Breaks specification](https://sembr.org/) (SemBr), with one deliberate deviation — see below.
26
+
27
+ ## The rules
28
+
29
+ From the specification:
30
+
31
+ - A break **MUST** come after a sentence ending in `.`, `!`, or `?`.
32
+ - A break **SHOULD** come after an independent clause punctuated by a comma, semicolon, colon, or em dash.
33
+ - A break **MAY** come after a dependent clause, to clarify structure.
34
+ - A break is **RECOMMENDED** before a list, and **MAY** follow list items to group related entries.
35
+ - A break **MUST NOT** fall inside a hyphenated word.
36
+ - A break **MAY** come before or after a hyperlink, and before inline markup.
37
+
38
+ Two rules govern all the others: the breaks **MUST NOT** change the rendered output, and they **SHOULD NOT** change the intended meaning.
39
+ If a break makes a sentence read differently, put it somewhere else.
40
+
41
+ ### Our deviation: no maximum line length
42
+
43
+ The specification recommends an 80-character maximum.
44
+ **We do not follow that rule.**
45
+
46
+ It is the one rule in the spec that works against the goal.
47
+ In real prose most sentences run past 80 characters, often well past.
48
+ An 80-column ceiling therefore forces a mid-sentence break in most sentences, and the leftover clause lands alone on a line as a fragment — which is precisely the arbitrary, non-semantic break the convention exists to avoid.
49
+ The ceiling only ever served people reading source in an 80-column terminal, and every editor we use soft-wraps.
50
+
51
+ So: let a line be as long as the thought it carries.
52
+
53
+ ## Deciding where the break goes
54
+
55
+ **One sentence per line is the default.**
56
+ A sentence is the unit of thought; a clause usually is not.
57
+
58
+ Break *within* a sentence only when both of these are true:
59
+
60
+ 1. The sentence is long — past roughly 100 characters of visible text.
61
+ 2. It contains two or more genuinely **independent** claims, joined by a semicolon, colon, em dash, or coordinating conjunction.
62
+
63
+ A trailing dependent clause is not a second claim.
64
+ "A request that arrives after the cache has expired still succeeds, because the loader falls back to the origin" stays on one line: the `because` clause cannot stand alone, so splitting it strands a fragment.
65
+
66
+ Short sentences always stay whole, however tempting the parallel.
67
+ "A read hits the cache; a write goes to the origin" is under fifty characters, and the contrast *is* the thought — breaking it in half makes two half-thoughts.
68
+
69
+ Count visible text, not markup.
70
+ A line carrying a long markdown link is shorter than it looks; judge it by what the reader sees.
71
+
72
+ ## Where this applies
73
+
74
+ **Use semantic line breaks in:**
75
+
76
+ - `specs/` — design docs and specifications
77
+ - `reference/` — the current-state documentation
78
+ - `skills/*/SKILL.md` — including this one
79
+ - `README.md`, `AGENTS.md`, `CLAUDE.md`, and any other prose markdown at the root
80
+
81
+ **Do not use them in:**
82
+
83
+ - **Markdown whose body is consumed as raw text rather than rendered** — a file sent to a model as a prompt, used as a template, or otherwise read verbatim, where the newlines survive into the payload.
84
+ A line break there changes the string, not just the diff.
85
+ Write those bodies as ordinary paragraphs.
86
+ - **bd issue bodies.**
87
+ The payoff for semantic line breaks is a line-level diff, and an issue description is stored in the Dolt database and exported to `.beads/issues.jsonl` as a single JSON string — there is no line-level diff to improve.
88
+ `bd show` also re-wraps descriptions to the terminal width, keeping only blank-line paragraph breaks.
89
+ Write issue bodies as paragraphs separated by blank lines.
90
+ - **Chat responses.** Nothing is being diffed. Write normally.
91
+ - **Code and inline comments.** Follow the surrounding code's conventions.
92
+ - **Commit messages.** The subject and body conventions in [`boop-coding-commit-changes`](../../../cap-coding/skills/boop-coding-commit-changes/SKILL.md) already govern these.
93
+
94
+ ## Editing a file that is not yet broken this way
95
+
96
+ Do not reflow a whole file as a drive-by change.
97
+ It buries the edit you actually came to make inside a diff that touches every line.
98
+
99
+ Apply semantic breaks to the paragraphs you are already rewriting and leave the rest alone.
100
+ A whole-file reflow is fine, but it belongs in its own commit with nothing else in it.
101
+
102
+ When you do reflow a file, verify that you changed only whitespace: split both versions into blank-line-separated blocks, normalize the whitespace inside each block, and compare.
103
+ Every block should match.
104
+
105
+ ## Example
106
+
107
+ Hard-wrapped at 90 columns:
108
+
109
+ ```
110
+ When a request comes in, resolve the config once at the top of the handler and pass it down.
111
+ Reading it again deeper in the call stack re-parses the file and can pick up a different value
112
+ mid-request; resolving once keeps the whole request consistent.
113
+ ```
114
+
115
+ The same text with semantic line breaks:
116
+
117
+ ```
118
+ When a request comes in, resolve the config once at the top of the handler and pass it down.
119
+ Reading it again deeper in the call stack re-parses the file and can pick up a different value mid-request; resolving once keeps the whole request consistent.
120
+ ```
121
+
122
+ One sentence per line.
123
+ The second sentence keeps its semicolon clause on the same line because, long as it is, the two halves are one continuous point.
124
+ Changing "at the top of the handler" to "at the entry point" now touches exactly one line.
125
+
126
+ ## Related
127
+
128
+ - [`boop-writing-technical-prose`](../boop-writing-technical-prose/SKILL.md) — how to choose the words; this skill only covers where to end the line.
129
+ - [`boop-writing-documents`](../boop-writing-documents/SKILL.md) — longer-form document structure.
@@ -140,3 +140,4 @@ The first version compresses meaning into 60 words of jargon. The second uses ab
140
140
  - `boop-project-mgmt-beads-planning` — its "self-contained briefing" rule for issue bodies leans on the patterns described here.
141
141
  - `boop-product-design-engineering-design` — when writing spec prose. Specs are usually fine, but when they drift the same anti-patterns apply.
142
142
  - `boop-coding-review-changes` — when writing review summaries that follow-up agents will read.
143
+ - [`boop-writing-semantic-line-breaks`](../boop-writing-semantic-line-breaks/SKILL.md) — where to end the line in a markdown file. Word choice is this skill; line breaks are that one.