@hraness/design-kit 0.31.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.
Files changed (345) hide show
  1. package/ARTICLE_COPY.md +208 -0
  2. package/HERO_FIELDS.md +55 -0
  3. package/ICONS.md +56 -0
  4. package/LANTERN_MATERIAL.md +60 -0
  5. package/LICENSE +21 -0
  6. package/MARKETING_COPY.md +49 -0
  7. package/MARKETING_PRESET.md +108 -0
  8. package/PALETTES.md +90 -0
  9. package/PAPER_THEME.md +128 -0
  10. package/README.md +745 -0
  11. package/STATUS_PAGES.md +67 -0
  12. package/STYLE.md +245 -0
  13. package/WRITING.md +72 -0
  14. package/dist/browser/index.js +2345 -0
  15. package/dist/chunk-44djxk16.js +6872 -0
  16. package/dist/chunk-5gtx3pza.js +9 -0
  17. package/dist/chunk-77391vmq.js +454 -0
  18. package/dist/chunk-7b1586eb.js +1209 -0
  19. package/dist/chunk-8834fh4n.js +6 -0
  20. package/dist/chunk-9t8xyqte.js +870 -0
  21. package/dist/chunk-cejpzyfh.js +446 -0
  22. package/dist/chunk-eh71jz57.js +429 -0
  23. package/dist/chunk-evb02bc1.js +516 -0
  24. package/dist/chunk-h4k7yv6x.js +368 -0
  25. package/dist/chunk-he8eznb1.js +760 -0
  26. package/dist/chunk-mr1vdcjq.js +404 -0
  27. package/dist/chunk-wzvdn8ey.js +116 -0
  28. package/dist/fonts/nebula-sans/social-fonts.generated.js +53 -0
  29. package/dist/icons.js +48 -0
  30. package/dist/index.js +237 -0
  31. package/dist/launch.js +41 -0
  32. package/dist/mockups/client.js +422 -0
  33. package/dist/mockups/index.js +1850 -0
  34. package/dist/portfolio.js +1549 -0
  35. package/dist/provider-marks.js +19 -0
  36. package/dist/react/charts.js +11 -0
  37. package/dist/react/hero-backdrop.js +8 -0
  38. package/dist/react/index.js +7252 -0
  39. package/dist/react/platform-install.js +10 -0
  40. package/dist/react/server.js +137 -0
  41. package/dist/stylex-manifest.json +1 -0
  42. package/dist/stylex.css +5392 -0
  43. package/dist/syntax-highlighting.js +15 -0
  44. package/dist/testing.js +250 -0
  45. package/package.json +377 -0
  46. package/portfolio-inventory.json +31 -0
  47. package/scripts/check-lantern-material-snapshot.d.mts +26 -0
  48. package/scripts/check-lantern-material-snapshot.mjs +126 -0
  49. package/scripts/check-marketing-snapshot.d.mts +12 -0
  50. package/scripts/check-marketing-snapshot.mjs +58 -0
  51. package/scripts/lantern-material-snapshot.ts +101 -0
  52. package/scripts/marketing-textures.ts +48 -0
  53. package/scripts/paper-theme-snapshot.ts +97 -0
  54. package/scripts/product-marketing-snapshot.ts +149 -0
  55. package/src/appearance-menu.css +266 -0
  56. package/src/appearance.ts +32 -0
  57. package/src/article-html.ts +269 -0
  58. package/src/article.ts +686 -0
  59. package/src/browser/appearance-menu.ts +604 -0
  60. package/src/browser/artifact-share.ts +164 -0
  61. package/src/browser/design-palette.ts +197 -0
  62. package/src/browser/foil.ts +124 -0
  63. package/src/browser/hero-light.ts +11 -0
  64. package/src/browser/index.ts +29 -0
  65. package/src/browser/status-field.ts +432 -0
  66. package/src/browser/status-page.ts +100 -0
  67. package/src/browser/sticky-offset.ts +82 -0
  68. package/src/browser/theme-color-sync.ts +213 -0
  69. package/src/charts.css +7 -0
  70. package/src/compiler-components.css +34 -0
  71. package/src/compiler-foundation.css +18 -0
  72. package/src/compiler-palettes.css +7 -0
  73. package/src/compiler-tokens.css +342 -0
  74. package/src/components.css +3 -0
  75. package/src/design-gallery.css +431 -0
  76. package/src/effects.css +14 -0
  77. package/src/fonts/geist-mono/GeistMono[wght].woff2 +0 -0
  78. package/src/fonts/geist-mono/OFL.txt +93 -0
  79. package/src/fonts/geist-mono/PROVENANCE.md +12 -0
  80. package/src/fonts/instrument-serif/OFL.txt +93 -0
  81. package/src/fonts/instrument-serif/UPSTREAM.md +14 -0
  82. package/src/fonts/instrument-serif/instrument-serif-latin-400.woff2 +0 -0
  83. package/src/fonts/nebula-sans/LICENSE.txt +96 -0
  84. package/src/fonts/nebula-sans/NebulaSans-Black.woff2 +0 -0
  85. package/src/fonts/nebula-sans/NebulaSans-BlackItalic.woff2 +0 -0
  86. package/src/fonts/nebula-sans/NebulaSans-Bold.otf +0 -0
  87. package/src/fonts/nebula-sans/NebulaSans-Bold.woff2 +0 -0
  88. package/src/fonts/nebula-sans/NebulaSans-BoldItalic.woff2 +0 -0
  89. package/src/fonts/nebula-sans/NebulaSans-Book.otf +0 -0
  90. package/src/fonts/nebula-sans/NebulaSans-Book.woff2 +0 -0
  91. package/src/fonts/nebula-sans/NebulaSans-BookItalic.woff2 +0 -0
  92. package/src/fonts/nebula-sans/NebulaSans-Light.woff2 +0 -0
  93. package/src/fonts/nebula-sans/NebulaSans-LightItalic.woff2 +0 -0
  94. package/src/fonts/nebula-sans/NebulaSans-Medium.woff2 +0 -0
  95. package/src/fonts/nebula-sans/NebulaSans-MediumItalic.woff2 +0 -0
  96. package/src/fonts/nebula-sans/NebulaSans-Semibold.woff2 +0 -0
  97. package/src/fonts/nebula-sans/NebulaSans-SemiboldItalic.woff2 +0 -0
  98. package/src/fonts/nebula-sans/PROVENANCE.md +14 -0
  99. package/src/fonts/nebula-sans/social-fonts.generated.ts +3873 -0
  100. package/src/fonts.css +106 -0
  101. package/src/icons/act60/act60.svg +5 -0
  102. package/src/icons/act60/application.svg +9 -0
  103. package/src/icons/act60/chapter-compare.svg +3 -0
  104. package/src/icons/act60/decree-residence.svg +6 -0
  105. package/src/icons/act60/estimate.svg +7 -0
  106. package/src/icons/act60/export-services.svg +4 -0
  107. package/src/icons/act60/investor.svg +13 -0
  108. package/src/icons/act60/presence.svg +7 -0
  109. package/src/icons/aicharts/aicharts.svg +6 -0
  110. package/src/icons/aicharts/cost-compare.svg +4 -0
  111. package/src/icons/aicharts/task-audio.svg +7 -0
  112. package/src/icons/aicharts/task-coding.svg +6 -0
  113. package/src/icons/aicharts/task-images.svg +3 -0
  114. package/src/icons/aicharts/task-reasoning.svg +9 -0
  115. package/src/icons/aicharts/task-research.svg +5 -0
  116. package/src/icons/aicharts/task-video.svg +4 -0
  117. package/src/icons/manifest.json +1371 -0
  118. package/src/icons/platonik/conversation.svg +3 -0
  119. package/src/icons/platonik/creature.svg +7 -0
  120. package/src/icons/platonik/economy.svg +4 -0
  121. package/src/icons/platonik/keep-light.svg +6 -0
  122. package/src/icons/platonik/platonik.svg +7 -0
  123. package/src/icons/platonik/spark-route.svg +15 -0
  124. package/src/icons/receipts/act60-retry.receipt.json +888 -0
  125. package/src/icons/receipts/act60.receipt.json +1366 -0
  126. package/src/icons/receipts/aicharts.receipt.json +1546 -0
  127. package/src/icons/receipts/platonik.receipt.json +1011 -0
  128. package/src/icons/receipts/roughday.receipt.json +770 -0
  129. package/src/icons/receipts/shared.receipt.json +1296 -0
  130. package/src/icons/receipts/slopcamera.receipt.json +1495 -0
  131. package/src/icons/receipts/soundfish-retry.receipt.json +460 -0
  132. package/src/icons/receipts/soundfish.receipt.json +1709 -0
  133. package/src/icons/receipts/sponge.receipt.json +1743 -0
  134. package/src/icons/receipts/stripe-history-retry.receipt.json +145 -0
  135. package/src/icons/receipts/stripe-history.receipt.json +1202 -0
  136. package/src/icons/receipts/wordcell.receipt.json +1924 -0
  137. package/src/icons/roughday/finance.svg +7 -0
  138. package/src/icons/roughday/roughday.svg +6 -0
  139. package/src/icons/roughday/technology.svg +4 -0
  140. package/src/icons/roughday/world.svg +4 -0
  141. package/src/icons/sets/act60.json +63 -0
  142. package/src/icons/sets/aicharts.json +63 -0
  143. package/src/icons/sets/platonik.json +39 -0
  144. package/src/icons/sets/roughday.json +25 -0
  145. package/src/icons/sets/shared.json +12 -0
  146. package/src/icons/sets/slopcamera.json +47 -0
  147. package/src/icons/sets/soundfish.json +43 -0
  148. package/src/icons/sets/sponge.json +51 -0
  149. package/src/icons/sets/stripe-history.json +39 -0
  150. package/src/icons/sets/wordcell.json +51 -0
  151. package/src/icons/shared/agent-skill.svg +4 -0
  152. package/src/icons/shared/cli.svg +5 -0
  153. package/src/icons/shared/privacy.svg +3 -0
  154. package/src/icons/shared/research.svg +7 -0
  155. package/src/icons/shared/sdk.svg +3 -0
  156. package/src/icons/slopcamera/diagram.svg +3 -0
  157. package/src/icons/slopcamera/direct-scene.svg +5 -0
  158. package/src/icons/slopcamera/edit-video.svg +17 -0
  159. package/src/icons/slopcamera/mcp.svg +3 -0
  160. package/src/icons/slopcamera/native-world.svg +3 -0
  161. package/src/icons/slopcamera/slopcamera.svg +11 -0
  162. package/src/icons/soundfish/agent-ui.svg +7 -0
  163. package/src/icons/soundfish/collaborate.svg +5 -0
  164. package/src/icons/soundfish/compose.svg +3 -0
  165. package/src/icons/soundfish/hear.svg +6 -0
  166. package/src/icons/soundfish/human-ui.svg +6 -0
  167. package/src/icons/soundfish/share.svg +3 -0
  168. package/src/icons/soundfish/soundfish.svg +6 -0
  169. package/src/icons/sponge/api.svg +3 -0
  170. package/src/icons/sponge/documents.svg +3 -0
  171. package/src/icons/sponge/library.svg +3 -0
  172. package/src/icons/sponge/one-question.svg +5 -0
  173. package/src/icons/sponge/people-direct.svg +5 -0
  174. package/src/icons/sponge/read.svg +3 -0
  175. package/src/icons/sponge/save.svg +4 -0
  176. package/src/icons/sponge/sponge.svg +7 -0
  177. package/src/icons/stripe-history/company-history.svg +3 -0
  178. package/src/icons/stripe-history/evidence.svg +4 -0
  179. package/src/icons/stripe-history/independence.svg +7 -0
  180. package/src/icons/stripe-history/publications.svg +11 -0
  181. package/src/icons/stripe-history/sources.svg +6 -0
  182. package/src/icons/stripe-history/stripe-history.svg +3 -0
  183. package/src/icons/wordcell/backlinks.svg +6 -0
  184. package/src/icons/wordcell/capture.svg +6 -0
  185. package/src/icons/wordcell/git-provenance.svg +4 -0
  186. package/src/icons/wordcell/kb.svg +4 -0
  187. package/src/icons/wordcell/markdown.svg +4 -0
  188. package/src/icons/wordcell/scopes.svg +3 -0
  189. package/src/icons/wordcell/search.svg +7 -0
  190. package/src/icons.generated.ts +734 -0
  191. package/src/icons.ts +51 -0
  192. package/src/index.ts +275 -0
  193. package/src/lantern-material.css +213 -0
  194. package/src/launch.ts +624 -0
  195. package/src/marketing-assets/UPSTREAM.md +18 -0
  196. package/src/marketing-assets/cells.svg +1 -0
  197. package/src/marketing-assets/grain.svg +1 -0
  198. package/src/marketing-forced-colors.css +12 -0
  199. package/src/mockups/client.tsx +415 -0
  200. package/src/mockups/core.tsx +318 -0
  201. package/src/mockups/frames.tsx +368 -0
  202. package/src/mockups/index.ts +14 -0
  203. package/src/mockups/surfaces.tsx +681 -0
  204. package/src/mockups.css +2607 -0
  205. package/src/palette-appearance.ts +45 -0
  206. package/src/palette-bridge.css +124 -0
  207. package/src/palette-color.ts +41 -0
  208. package/src/palette-system.css +721 -0
  209. package/src/palette-themes.ts +23 -0
  210. package/src/palette-tokens.stylex.ts +519 -0
  211. package/src/palettes.css +3 -0
  212. package/src/palettes.ts +161 -0
  213. package/src/paper-theme.css +244 -0
  214. package/src/plain-publication.css +1241 -0
  215. package/src/plain-site.css +397 -0
  216. package/src/platforms.ts +151 -0
  217. package/src/portfolio.generated.json +1595 -0
  218. package/src/portfolio.generated.ts +1596 -0
  219. package/src/portfolio.ts +226 -0
  220. package/src/product-marketing-foundation.css +433 -0
  221. package/src/product-marketing-preset.css +261 -0
  222. package/src/product-marketing.css +2186 -0
  223. package/src/provider-marks.generated.ts +112 -0
  224. package/src/provider-marks.ts +143 -0
  225. package/src/react/animated-rail-stage.stylex.ts +15 -0
  226. package/src/react/animated-rail-stage.tsx +51 -0
  227. package/src/react/app-shell.stylex.ts +104 -0
  228. package/src/react/app-shell.tsx +121 -0
  229. package/src/react/article.tsx +602 -0
  230. package/src/react/aurora-dots-background.tsx +34 -0
  231. package/src/react/charts.stylex.ts +563 -0
  232. package/src/react/charts.tsx +610 -0
  233. package/src/react/chat.stylex.ts +34 -0
  234. package/src/react/chat.tsx +155 -0
  235. package/src/react/design-gallery.tsx +943 -0
  236. package/src/react/design-palette.stylex.ts +124 -0
  237. package/src/react/design-palette.tsx +196 -0
  238. package/src/react/design-theme-context.tsx +41 -0
  239. package/src/react/effects.stylex.ts +325 -0
  240. package/src/react/fader.stylex.ts +71 -0
  241. package/src/react/fader.tsx +151 -0
  242. package/src/react/foil-card-math.ts +100 -0
  243. package/src/react/foil-card-surface.stylex.ts +326 -0
  244. package/src/react/foil-card-surface.tsx +742 -0
  245. package/src/react/foil-mark.tsx +35 -0
  246. package/src/react/foil.stylex.ts +163 -0
  247. package/src/react/haptics.ts +228 -0
  248. package/src/react/hero-backdrop.tsx +22 -0
  249. package/src/react/index.ts +38 -0
  250. package/src/react/keyboard-shortcuts.ts +228 -0
  251. package/src/react/lantern-material-gallery.tsx +166 -0
  252. package/src/react/lantern-material.stylex.ts +39 -0
  253. package/src/react/launch-beats.tsx +73 -0
  254. package/src/react/navigation-rail.stylex.ts +130 -0
  255. package/src/react/navigation-rail.tsx +228 -0
  256. package/src/react/particle-halo.tsx +115 -0
  257. package/src/react/phaser-dots.tsx +501 -0
  258. package/src/react/platform-icons.tsx +94 -0
  259. package/src/react/platform-install.stylex.ts +385 -0
  260. package/src/react/platform-install.tsx +389 -0
  261. package/src/react/playback-transport.stylex.ts +14 -0
  262. package/src/react/playback-transport.tsx +112 -0
  263. package/src/react/procedural-backdrop.tsx +192 -0
  264. package/src/react/procedural-recipe.ts +323 -0
  265. package/src/react/product-marketing.stylex.ts +4469 -0
  266. package/src/react/product-marketing.tsx +1611 -0
  267. package/src/react/production-data-preview-notice.stylex.ts +40 -0
  268. package/src/react/production-data-preview-notice.tsx +34 -0
  269. package/src/react/provider-mark.stylex.ts +132 -0
  270. package/src/react/provider-mark.tsx +120 -0
  271. package/src/react/relative-time.tsx +117 -0
  272. package/src/react/route-state.stylex.ts +39 -0
  273. package/src/react/route-state.tsx +350 -0
  274. package/src/react/server.ts +11 -0
  275. package/src/react/social-kit-panel.tsx +103 -0
  276. package/src/react/sticky-offset.tsx +33 -0
  277. package/src/react/surfaces.stylex.ts +179 -0
  278. package/src/react/surfaces.tsx +330 -0
  279. package/src/react/syntax-code.tsx +33 -0
  280. package/src/react/theme-color-sync.ts +1 -0
  281. package/src/react/theme-resolution.ts +11 -0
  282. package/src/react/theme.stylex.ts +276 -0
  283. package/src/react/theme.tsx +402 -0
  284. package/src/reading.css +72 -0
  285. package/src/relative-time.ts +185 -0
  286. package/src/reset.css +2 -0
  287. package/src/site-shell.css +16 -0
  288. package/src/status-page-html.ts +63 -0
  289. package/src/status-page.css +276 -0
  290. package/src/status-page.ts +323 -0
  291. package/src/styles.css +21 -0
  292. package/src/syntax-code-lexers.ts +303 -0
  293. package/src/syntax-highlighting.css +78 -0
  294. package/src/syntax-highlighting.ts +477 -0
  295. package/src/syntax-tokens.ts +33 -0
  296. package/src/testing.ts +307 -0
  297. package/src/tokens.css +3 -0
  298. package/src/typography.css +86 -0
  299. package/vendor/evilcharts/LICENSE +21 -0
  300. package/vendor/evilcharts/UPSTREAM.md +14 -0
  301. package/vendor/platform-marks/LICENSE +30 -0
  302. package/vendor/platform-marks/UPSTREAM.md +15 -0
  303. package/vendor/platform-marks/apple.svg +1 -0
  304. package/vendor/platform-marks/linux.svg +1 -0
  305. package/vendor/provider-marks/CRUSH-LICENSE.md +134 -0
  306. package/vendor/provider-marks/LICENSE +21 -0
  307. package/vendor/provider-marks/UPSTREAM.md +27 -0
  308. package/vendor/provider-marks/aider.svg +3 -0
  309. package/vendor/provider-marks/crush-heartbit.svg +8 -0
  310. package/vendor/provider-marks/lobehub/alibabacloud-color.svg +1 -0
  311. package/vendor/provider-marks/lobehub/alibabacloud.svg +1 -0
  312. package/vendor/provider-marks/lobehub/amp-color.svg +1 -0
  313. package/vendor/provider-marks/lobehub/amp.svg +1 -0
  314. package/vendor/provider-marks/lobehub/anthropic.svg +1 -0
  315. package/vendor/provider-marks/lobehub/claude-color.svg +1 -0
  316. package/vendor/provider-marks/lobehub/claude.svg +1 -0
  317. package/vendor/provider-marks/lobehub/claudecode-color.svg +1 -0
  318. package/vendor/provider-marks/lobehub/claudecode.svg +1 -0
  319. package/vendor/provider-marks/lobehub/codex-color.svg +1 -0
  320. package/vendor/provider-marks/lobehub/codex.svg +1 -0
  321. package/vendor/provider-marks/lobehub/cursor.svg +1 -0
  322. package/vendor/provider-marks/lobehub/deepseek-color.svg +1 -0
  323. package/vendor/provider-marks/lobehub/deepseek.svg +1 -0
  324. package/vendor/provider-marks/lobehub/devin-color.svg +1 -0
  325. package/vendor/provider-marks/lobehub/devin.svg +1 -0
  326. package/vendor/provider-marks/lobehub/gemini-color.svg +1 -0
  327. package/vendor/provider-marks/lobehub/gemini.svg +1 -0
  328. package/vendor/provider-marks/lobehub/geminicli-color.svg +1 -0
  329. package/vendor/provider-marks/lobehub/geminicli.svg +1 -0
  330. package/vendor/provider-marks/lobehub/goose.svg +1 -0
  331. package/vendor/provider-marks/lobehub/meta-color.svg +1 -0
  332. package/vendor/provider-marks/lobehub/meta.svg +1 -0
  333. package/vendor/provider-marks/lobehub/mistral-color.svg +1 -0
  334. package/vendor/provider-marks/lobehub/mistral.svg +1 -0
  335. package/vendor/provider-marks/lobehub/moonshot.svg +1 -0
  336. package/vendor/provider-marks/lobehub/nvidia-color.svg +1 -0
  337. package/vendor/provider-marks/lobehub/nvidia.svg +1 -0
  338. package/vendor/provider-marks/lobehub/openai.svg +1 -0
  339. package/vendor/provider-marks/lobehub/opencode.svg +1 -0
  340. package/vendor/provider-marks/lobehub/perplexity-color.svg +1 -0
  341. package/vendor/provider-marks/lobehub/perplexity.svg +1 -0
  342. package/vendor/provider-marks/lobehub/qwen-color.svg +1 -0
  343. package/vendor/provider-marks/lobehub/qwen.svg +1 -0
  344. package/vendor/provider-marks/lobehub/xai.svg +1 -0
  345. package/vendor/provider-marks/lobehub/zai.svg +1 -0
@@ -0,0 +1,67 @@
1
+ # Status pages
2
+
3
+ Every Hraness site uses one page for missing addresses and recoverable errors. A reader who reaches it followed a link that promised something. The page gets them to that thing, or to the product's main action, in one step.
4
+
5
+ ## What the page shows
6
+
7
+ | Slot | Write | Limit | Avoid |
8
+ | --- | --- | --- | --- |
9
+ | `title` | Keep the default ("We can’t find that page") unless the site's voice needs a different sentence. | 60 characters | Jokes, stock metaphors, and blame ("You broke it"). |
10
+ | `summary` | Keep the default ("The link may be out of date or mistyped."). | 160 characters | Apologies and explanations of HTTP. |
11
+ | `primaryAction` | The product's main next step: the same action as the homepage hero, such as "Start your library" or "Install xcb". Without it, the page offers "Go to {siteName}". | 48 characters | "Return home" when the product has a better action. |
12
+ | `next` | Up to three pages a new reader would want, each with a one-line `description`. Link the product page, the docs, and pricing or install. | Three links; description 90 characters | Sitemaps, `llms.txt`, legal pages, and links to other products. |
13
+ | `routes` | Known internal pages as `{ href, label }` objects. They are never listed. The page compares them with the missing address and offers the closest one as "Did you mean …?". Pass the site's sitemap entries or its article index as they are: entries that are not same-site paths or have no label are dropped, and titles over 80 characters are shortened. | 2,000 | Plain path strings; they are dropped. External URLs; they are ignored. |
14
+ | `agentIndexHref` | `/llms.txt` when the site serves one. It renders as one quiet line for AI agents. | | Using it for anything a person needs. |
15
+
16
+ The glyph ("404", or "!" for errors) is decorative. The browser enhancement draws it as dots that gather on load, move away from the pointer, scatter on a click or tap, and light up in the site's accent while they move. The animation stops once the dots settle, so an idle page does no work. Reduced motion shows the settled dots; forced colors and browsers without WebGL show the text glyph.
17
+
18
+ The Back link appears only when the reader came from another page on the same site.
19
+
20
+ ## Next.js
21
+
22
+ ```tsx
23
+ // app/not-found.tsx
24
+ import { RouteNotFoundPage } from "@hraness/design-kit/react";
25
+
26
+ export default function NotFound() {
27
+ return (
28
+ <RouteNotFoundPage
29
+ siteName="Sponge"
30
+ primaryAction={{ href: "/start", label: "Start your library" }}
31
+ next={[
32
+ { href: "/product", label: "How Sponge works", description: "Save pages; your agent reads and cites them." },
33
+ { href: "/docs", label: "Docs", description: "Connect Claude, ChatGPT, or any MCP client." },
34
+ { href: "/pricing", label: "Pricing", description: "Free to start." },
35
+ ]}
36
+ routes={knownPages}
37
+ agentIndexHref="/llms.txt"
38
+ />
39
+ );
40
+ }
41
+ ```
42
+
43
+ `RouteErrorPage` (for `app/error.tsx`) and `GlobalErrorDocument` (for `app/global-error.tsx`) render the same page with a Try again button. Pass `siteName` so the home action names the product.
44
+
45
+ Load `styles.css` or `compiler-foundation.css`, which include `status-page.css`, or import `@hraness/design-kit/status-page.css` directly. Keep the site header and footer around the page. Answer missing pages with HTTP status 404; a missing page that returns 200 is indexed as a real page.
46
+
47
+ ## Static sites
48
+
49
+ ```ts
50
+ import { renderStatusPageHtml } from "@hraness/design-kit";
51
+
52
+ const body = renderStatusPageHtml({ siteName: "GhostGet", primaryAction: { href: "/#install", label: "Install GhostGet" } });
53
+ // Write body into 404.html between the site header and footer.
54
+ ```
55
+
56
+ ```html
57
+ <script type="module">
58
+ import { attachStatusPage } from "/assets/design-kit-browser.js";
59
+ attachStatusPage(document.querySelector(".hraness-status-page"));
60
+ </script>
61
+ ```
62
+
63
+ The markup is identical to `RouteNotFoundPage`'s, so the same stylesheet and browser enhancement apply. Render one status page per document; its next-links heading has a fixed id.
64
+
65
+ ## Theming
66
+
67
+ The page follows the palette tokens. Override `--hraness-status-ink`, `--hraness-status-muted`, `--hraness-status-accent`, `--hraness-status-line`, `--hraness-status-radius`, or `--hraness-status-glyph-font` on `.hraness-status-page` when the site needs to. The glyph uses the site's heading face, so an editorial site gets serif dots.
package/STYLE.md ADDED
@@ -0,0 +1,245 @@
1
+ # Public writing style
2
+
3
+ <!-- synced from hraness/.github STYLE.md sha256:3e0d4984501e1d7bfbaa2812fa0b71ba6846cc537d9e79c358e771e567aa58a5 -->
4
+
5
+ This guide covers everything written for readers outside a repository: product pages, documentation, READMEs, interface text, metadata, and text a model writes for publication. Apply the voice rules in [`WRITING.md`](WRITING.md) first. The [documentation guidelines](https://github.com/hraness/.github/blob/main/DOCUMENTATION_GUIDELINES.md) choose a document's purpose and shape, and the [README guidelines](https://github.com/hraness/.github/blob/main/README_GUIDELINES.md) cover the repository front door.
6
+
7
+ Public prose must be precise, useful, and free of hype. Use a direct, natural voice that reads well aloud.
8
+
9
+ This copy is synced from [hraness/.github](https://github.com/hraness/.github/blob/main/STYLE.md). Change shared rules there; add rules for this repository under “Repository additions” below.
10
+
11
+ ## Leave the reader with a clearer model
12
+
13
+ - Write for a reader who knows the general subject but has not read the sources, related articles, or internal project material.
14
+ - State the page's central claim and why it matters in plain language before adding detail.
15
+ - Introduce each person, organization, source, and necessary technical term at first use. Do not make a link carry context the prose has not supplied.
16
+ - Make every page understandable on its own. Related links may deepen the explanation but must not be prerequisites.
17
+ - Organize explanatory prose around the reader's questions rather than citation handling, repository structures, data schemas, search strategy, or the sequence in which the analysis was produced. A technical reference may mirror a public interface or schema when that structure is the reader's subject.
18
+ - Cite the primary source for a reported claim. Use a secondary digest only when it contributes distinct evidence or analysis, and state that contribution without explaining internal citation mechanics.
19
+ - Label personal observations, controlled benchmarks, official specifications, and forecasts accurately. Do not turn an anecdote into a general finding or a possible cause into the only cause.
20
+ - Do not invent an opposing claim, conflict, or consequence to manufacture an argument. If a source does not connect two topics, connect them only with independent evidence that helps answer the reader's question.
21
+ - Do not expose private implementation details, internal reasoning, or editorial process. A technical reference may document only the public interface, schema, and behavior readers need to use or evaluate the product. In explanatory prose, state the supported conclusion, the evidence a reader can inspect, and the limitations that affect it.
22
+ - Connect an external source to the product only when the connection helps answer the page's central question. Do not force every source into the project's current data model or product vocabulary.
23
+ - After editing, confirm that a first-time reader can state the thesis, key evidence, and limits after one pass. Rewrite or remove any passage that adds context without improving that understanding.
24
+
25
+ ## Use a direct voice
26
+
27
+ - State what the object does. Let the reader decide whether it is good.
28
+ - Write about the reader's task. Use second person for instructions.
29
+ - Use present tense for current behavior. Use past tense for events and history.
30
+ - Use first person only when a named person or organization can support the claim.
31
+ - Name the exact control, command, limit, state, and outcome.
32
+ - Name limits and edge cases. A precise boundary makes the rest of the explanation credible.
33
+ - Do not use exclamation marks or all-capital emphasis.
34
+ - Remove “simply,” “just,” or “easily” when the word minimizes work or adds no meaning.
35
+
36
+ ## Edit without changing meaning
37
+
38
+ Confirm the meaning before you shorten the prose. Preserve facts, names, numbers, quotations, links, code, commands, and necessary qualifications.
39
+
40
+ - Delete stock metaphors, similes, and figures of speech.
41
+ - Keep a fresh comparison only when it makes a mechanism easier to understand.
42
+ - Prefer the shortest familiar word that preserves the exact meaning.
43
+ - Keep an established technical term when an everyday substitute would be less precise.
44
+ - Delete each word that adds no fact, relationship, tone, or useful rhythm.
45
+ - Use active voice when the actor and action matter.
46
+ - Use passive voice when the actor is unknown or the result matters more than the actor.
47
+ - Replace jargon with plain English when both have the same meaning.
48
+ - Define a necessary technical term once. Use the same term after the definition.
49
+ - Rewrite a sentence when a word replacement changes the grammar or meaning.
50
+
51
+ Read the edited paragraph at speaking pace. Restore a transition or exact qualification if compression makes the paragraph mechanical.
52
+
53
+ When you shorten a claim, keep every condition that decides whether it is true, such as *closed*, *idle*, *by default*, *opt-in*, or *on macOS*. Recheck absolute words such as *any*, *every*, *never*, and *always* against the source. A simpler sentence that is no longer true is worse than the original.
54
+
55
+ Guides and briefs are held to the same standard. An example of good copy about a real product must be true of that product; check it like any other claim.
56
+
57
+ Accuracy has priority over a local line-editing rule. Record a recurring exception in the closest canonical guide.
58
+
59
+ ## Support each claim
60
+
61
+ - Give each headline, summary line (`dek`), callout, and marketing line one concrete claim.
62
+ - Replace praise with observable behavior, a boundary, or evidence.
63
+ - Treat “revolutionary,” “seamless,” “powerful,” “robust,” and similar words as requests for proof.
64
+ - Use the swap test. If an unrelated product could publish the sentence unchanged, make it specific or delete it.
65
+ - Remove self-congratulation from release notes, documentation, and product copy.
66
+ - State what changed, why it changed, and what the reader can now do.
67
+ - Put each qualification beside the claim that it limits.
68
+ - Check each command, flag, version, license, price, and capability against current source or release output before you publish or edit it. Product pages go stale faster than code, so treat a claim on one as unverified until you check it.
69
+ - Label historical evidence as historical. A proof frame, benchmark, or screenshot from an earlier build names its date and scope, and a command shown on a page must run on the current release.
70
+ - Do not describe your own page, product, comparison, or caveat as *honest*, *plain*, *factual*, *checked*, *real*, or *clear*. Show the evidence and let the reader judge it. Title a limits section “Limits” or “Status”; “The landscape, honestly sorted” becomes “How they compare”.
71
+ - Check every heading, tagline, share image, and background visual against the body and the product's own rules. A heading may not promise what the next sentence walks back, and a decorative visual may not show what the product forbids.
72
+ - Check every promise on a pricing, purchase, or support page against the code that fulfills it.
73
+
74
+ ## Describe the product that exists now
75
+
76
+ - Describe current behavior in the present tense. Words such as *now*, *no longer*, *still*, *remains unchanged*, *existing*, *retains*, and *this change* describe a diff; put them in release notes. Keep release history in `CHANGELOG.md` or GitHub Releases, not in a README or guide.
77
+ - Write historical facts as history (“Added in v3.3.1”). Do not pin a claim about today to an old release after a newer one has shipped.
78
+ - Derive every install command and version on a page from the package version or the release record, and test that they match. Type a version in one place only.
79
+ - After a rename, pivot, retirement, or restructure, search every surface for the old name and for the nouns that described the old product, follow every internal link, and fix or remove what no longer exists. Update `AGENTS.md`, `CONTRIBUTING.md`, design briefs, and product lists on legal pages in the same change, so the next agent does not restore the old product.
80
+ - Mention a retired product only in a redirect, a changelog, or a “formerly” note. Do not compare the current release with a retired product's release.
81
+
82
+ ## Keep one definition per product
83
+
84
+ - Each product has one messaging record in the portfolio registry: a category, a tagline, and short, meta, medium, and long descriptions. [`MESSAGING.md`](https://github.com/hraness/.github/blob/main/MESSAGING.md) defines each field and the surfaces that use it. The page description, GitHub About text, package description, CLI introduction, README first paragraph, `llms.txt` summary, and sibling sites take their words from that record.
85
+ - Shorten by cutting words from the original sentence. Do not replace plain words with house nouns: “a tool for creating a dossier on any person” should not become “evidence-backed dossiers and revisable models of people”.
86
+ - Render repeated text from one constant: the visible FAQ and its JSON-LD, a page and its Markdown twin, a hidden agent layer and the visible page.
87
+ - Describe a sibling product with its registry name and `short` line. Say what two products do together only when both support it in shipped code, and take that sentence from the registry's relationships file.
88
+ - Do not paste a marketing sentence into several repositories. Put shared copy in a shared component or the registry.
89
+
90
+ ## Cite sources exactly
91
+
92
+ - Resolve every DOI, PMID, PMCID, and arXiv ID before publishing, and confirm that the title, venue, and year at the link match the citation. A link that resolves does not show that the citation matches.
93
+ - Put only verbatim text in quotation marks, with its speaker. Present a paraphrase as a paraphrase.
94
+ - Take a number from the source's own results, not from its introduction or its account of other work. Keep the statistic (mean or median), the denominator, and the population.
95
+ - Label evidence at the strength the source supports. A preprint is not a journal article, an interview study is not a cohort, and a paper, its preprint, and its press release are one study.
96
+ - Do not present a sibling project's measurements as measurements of this product.
97
+ - Give every third-party figure a primary source the reader can open.
98
+
99
+ ## Write for the reader, not the build
100
+
101
+ Most Hraness copy is drafted by agents working inside repository guides full of delivery and governance language. That language belongs in `AGENTS.md`. On a product page it tells the reader how carefully something was built instead of what it does for them.
102
+
103
+ - Treat the vocabulary of `AGENTS.md`, CI, admission ledgers, and data schemas as internal. On a page for readers outside the repository, define such a word where it first appears (a technical reference may) or say what the reader gets instead. The words that leak most often are *admission*, *admitted*, *qualification*, *qualified*, *custody*, *settlement*, *settled*, *receipt*, *attest*, *attested*, *evidence-backed*, *provenance* (as a label), *bounded*, *boundary*, *typed*, *contract*, *fenced*, *lease*, *manifest*, *promoted*, *gate*, *lane*, *workstream*, *surface*, *projection*, *foundation*, *substrate*, *authority*, *inert*, *canonical*, *retained*, *source pilot*, *source-bound*, *steel thread*, and *owns* (for a source or a record). “Every turn lands on one eligible account, bounded, with custody proven at settlement” becomes “Each task runs on one of your signed-in connections that is idle and not at a known quota limit, and xcb keeps that connection locked until the provider process exits.”
104
+ - Do not stack precision words. *Exact*, *explicit*, *full*, *complete*, *independently*, and *retained* each have to change the meaning of their sentence. “Sign only the exact retained draft” becomes “Sign the draft you saved.”
105
+ - Do not let one word become the page's signature. When most sections lean on the same framing word, keep it where it marks a real distinction and rewrite the rest.
106
+ - Lead a product page with what the reader can do, then the mechanism. A hero that stacks four mechanisms into one sentence makes the reader do the work.
107
+ - Write a sentence, not a slogan. Verbless fragments (“All your subscriptions. One router.”) and reflexive threes (“Compact, resume, and audit”) read as generated. List three things only when there are exactly three.
108
+ - Keep a contrast only when readers actually hold the misconception it corrects. “A policy over your transcripts, not a new editor” argues with nobody; “You decide when to compact and how” says the same thing.
109
+ - Remove unverifiable superlatives such as “the first” and “the only” unless a cited source supports them.
110
+ - Keep repository instructions and tests from demanding reader-hostile copy. When a guide or test requires a status phrase on every page, change the requirement to the fact that must stay true and let the page say it plainly.
111
+
112
+ ## State each limit once
113
+
114
+ Readers trust a page that states its limits plainly. They skim a page that repeats them.
115
+
116
+ - State the product's status once, near the top, with one of these labels: *In development*, *Preview*, *Beta*, *Latest release: vX.Y.Z*, *Paused*, or *Retired*. Follow it with one sentence on how to install or use it today, such as “Install from source; there is no signed release yet.”
117
+ - Put each other limit beside the feature it limits, once. Link to the status or limits page instead of restating the caveat in each section. Never drop a true limit to make the copy read better.
118
+ - Write a claim at its true scope instead of following it with what it does not prove. “Tests cover local networks only” replaces “These are tested local cases, not hosted private networking or evidence about independent devices.”
119
+ - State a privacy or scope rule once, positively (“Only documents you choose to publish become public”), and keep the full list of exclusions on the privacy or security page.
120
+ - Label a figure's evidence once, in plain words (“Stripe's own figure”).
121
+ - Do not end a page or section with a list of claims the page does not support.
122
+ - Keep notices about retired features on the status page, in the changelog, and in the messages a returning user sees. Keep them off the homepage, quick-start paths, and tutorials.
123
+
124
+ ## Match the text to its reader
125
+
126
+ - Keep agent protocol (acknowledgement rules, discovery output, reservation windows, closeout offers) in the Agent Skill or agent reference. A README, package page, or `llms.txt` gives people two plain sentences and a link.
127
+ - Write any string that can reach a person to that person. Say “you”, not “the human” or “the operator”.
128
+ - Keep maintainer runbooks, release checklists, submission evidence packs, and agent task plans out of user documentation.
129
+ - Describe an editorial standard in the reader's terms (“Each figure links to its primary source”). Do not publish the repository's rules as imperatives.
130
+ - Public setup steps never require internal tools a reader cannot get.
131
+ - Treat decorative and ambient text as copy. Sample notes, hero backgrounds, fake terminals, and hidden text follow these rules: no invented quotations, metrics, or people.
132
+ - Do not hide text from readers to give a page a heading or description for crawlers.
133
+
134
+ ## Write titles and descriptions as sentences of their own
135
+
136
+ - Write the page description as one or two complete sentences of 110 to 160 characters that name the thing and one concrete fact. Make each description unique on the site.
137
+ - Never make a description by cutting body text at a character limit. Code that derives one cuts at a sentence boundary and falls back to a word boundary only when the first sentence is too long. A description never ends mid-word or with “.…”.
138
+ - Do not list more than three parts in a description.
139
+ - Separate the page name and the site name in `<title>` with the repository's separator: a middle dot, a pipe, or a colon. Name the brand once.
140
+ - Make the share title and description match the page's own, or shorten them. An interior page does not inherit the homepage's share text.
141
+ - Write social image alt text that describes the image, in 125 characters or fewer.
142
+ - Keep each page's dates true to that page. Do not stamp one “updated” date on every page from a shared constant, and do not change a date because automation ran without changing the content.
143
+
144
+ ## Use consistent text conventions
145
+
146
+ - Use sentence case for headings, buttons, tabs, labels, placeholders, and empty states.
147
+ - Capitalize proper nouns according to their official form.
148
+ - Put periods on full sentences, including callouts.
149
+ - Omit periods from headings, buttons, and short labels. A full-sentence display heading in the editorial marketing preset may end with a period.
150
+ - Use the Oxford comma.
151
+ - Use natural contractions when they match the voice. Do not force them.
152
+ - Use curly quotation marks in prose and straight quotation marks in code.
153
+ - Put literal input and interface values in `code`.
154
+ - Use an ellipsis glyph (`…`) only when an action opens another input step.
155
+ - Do not use em dashes in authored text: prose, titles, meta descriptions, social text, alt text, captions, image credits, list separators, and the templates that generate them. Rewrite the sentence instead of substituting a spaced hyphen. Quoted third-party titles keep their own punctuation. Use parentheses only for a short, necessary explanation.
156
+ - Use each product's prose name exactly as its messaging record spells it (`names.name`), including case (xcb, Textbutler, AI Charts, Soundfish, Sys1). The all-capitals `names.catalog` form belongs only in designs that set every name in capitals. Do not use the repository slug or the domain as the name in prose, and do not use a product name as a common noun.
157
+ - Give each destination one label across the header, footer, breadcrumbs, and Markdown twins.
158
+ - Make interpolated counts agree with their nouns (“1 check”, “2 checks”), and test zero, one, and several.
159
+ - Spell out zero through nine in prose. Use numerals for 10 or more, measurements, dates, and money.
160
+
161
+ ## Write captions, alt text, and credits
162
+
163
+ - Write alt text for what the image shows in its context. Do not repeat the headline or start with “Image of”.
164
+ - Use a caption to connect the image to the text. Do not explain what the image is not, and do not end on an epigram.
165
+ - Credit tools and models by their current names.
166
+
167
+ ## Write focused documentation
168
+
169
+ - Decide whether a page is a tutorial, how-to guide, explanation, or reference.
170
+ - Do not mix document modes when a link gives the reader a clearer path.
171
+ - Lead with the outcome. Do not write “In this guide, we will.”
172
+ - Make headings form a useful path through the page.
173
+ - Give each paragraph one main topic. Let the argument determine its length.
174
+ - Use numbered steps only for procedures. Start each step with an imperative verb.
175
+ - Give one instruction per step. Put a prerequisite condition before its command.
176
+ - Use notes, tips, warnings, and danger callouts according to consequence.
177
+ - Keep essential information in text. Do not put essential information only in an image or diagram.
178
+
179
+ ## Keep interface copy operational
180
+
181
+ - Do not invent marketing copy to fill space.
182
+ - Omit taglines, benefit claims, unsupported proof, and decorative labels unless they help the reader complete a task.
183
+ - Use one literal heading for the object, task, data view, or state.
184
+ - Add supporting text only for a distinct instruction, constraint, status, or scope.
185
+ - Name the action, object, current state, limit, or recovery step.
186
+ - Do not narrate the interface or repeat visible information.
187
+ - Keep normal readiness silent. Show status text for pending work, important results, or problems that the reader can fix.
188
+ - Add search only when the collection is too large or varied for direct selection.
189
+ - Move secondary actions and settings out of persistent primary controls.
190
+ - Use checkboxes for independent form choices that take effect on submission.
191
+ - Use toggle buttons for immediate view, visibility, mute, solo, and mode changes.
192
+ - Keep a unit label with its control. Put longer explanations in nearby text or a disclosure.
193
+ - Put provenance, tuning, and methodology in a labeled disclosure when they compete with the primary task.
194
+ - Use a specific verb and object on buttons. Write “Create project,” not “Submit” or “OK.”
195
+ - Use “New noun” to open a creation flow. Use “Create noun” for the committing action.
196
+ - Name the missing object in an empty state. Give one useful sentence and the primary action.
197
+ - State the problem and the fix in an error. Do not blame the reader or write “Oops.”
198
+ - Name the consequence in a confirmation. Repeat the exact verb and object for a destructive action.
199
+ - Use nouns for labels. Use placeholders for a format or example, not a repeated label.
200
+ - State the completed result in past tense in a toast notification.
201
+
202
+ ## Vary a generated series
203
+
204
+ When agents write many pages from one schema or one first example, the first page's habits become every page's.
205
+
206
+ - Give each page its own opening and ending. Do not repeat a title formula, a signpost opener (“This note answers three questions”), a closing heading, a closing checklist, or a disclaimer paragraph across the series.
207
+ - Take structure from the schema and the prompt, not from an earlier page. Check the corpus for repeated headings, openings, and closers.
208
+ - End a summary on its last supported fact. Write what an event means only when a source says it, and attribute it. Do not end with a sentence about what something signals, underscores, highlights, reflects, or represents, and do not end a paragraph on an aphorism.
209
+ - Report what a source shows instead of grading it (“Its value is…”, “The useful lens is…”).
210
+ - Do not narrate how the page was made: fetches, blocked pages, paywalls, captures, clip times, candidate pools, agent lanes, formulas, deduplication, date-precision notes, or who linked the source. State the evidence and its limits as facts about the world.
211
+ - Name a quoted speaker and their role. Do not add a paraphrase of the quote to the attribution (“Name, stating the governing claim”).
212
+
213
+ ## Write prompts that produce public text
214
+
215
+ A prompt, skill, or template that makes a model write published text is public copy one step removed. The model follows its instructions and copies its examples.
216
+
217
+ - Point the prompt at this guide and `WRITING.md`, and state the reader, the form, and the length.
218
+ - Give examples in the house voice. A template example becomes output: the placeholder attribution “Ada Example, stating the governing claim” reappeared verbatim in published reading notes.
219
+ - Name the patterns to avoid, including em dashes, staged contrasts, and narration about how a source was fetched or blocked.
220
+ - Ask for summaries and descriptions as complete sentences that fit their limit. Do not rely on truncation to make text fit.
221
+ - Keep quoted source text and generated text distinguishable, and say who wrote the summary.
222
+ - Read a sample of real outputs after every prompt change.
223
+ - Tell the model who reads the output and that the reader has not seen the inputs or the instructions. Name every field that is published, including rationales and labels.
224
+ - Set length limits as maximums. A minimum longer than the evidence forces padding.
225
+ - Include the shared generation block from [`GENERATION_STYLE.md`](https://github.com/hraness/.github/blob/main/GENERATION_STYLE.md) and record its version with the prompt version.
226
+ - Check the prompt, skill, and examples for the patterns they forbid; a prompt that uses em dashes and staged contrasts produces them.
227
+
228
+ ## Keep tests and guides from freezing copy
229
+
230
+ - Tests pin facts: commands, versions, counts, limits, prices, legal text, and links that resolve. They do not pin headings, taglines, or prose sentences. When a test protects a limit, it asserts the limit in plain words.
231
+ - Assert the shape of a real value, such as a run URL that matches `/runs/\d{10,}/`, never a placeholder.
232
+ - A test or validator may require that a disclosure exists and matches the provenance record. It may not require a reviewer name or a review claim, except that an essay or blog post's provenance note must match its review record.
233
+ - Guides, briefs, examples, schemas, and fixtures are copy one step removed; agents copy them word for word. Keep taglines, slogans, and internal vocabulary out of them. Do not define a field every item must fill, such as a `closing` line, whose role invites a closer or a slogan. A product's messaging `tagline` is a sentence with one claim the page proves, defined in `MESSAGING.md`.
234
+
235
+ ## Say who wrote and who checked
236
+
237
+ - Show AI-drafting disclosure on hraness.com through its shared disclosure component, on every page with AI-drafted text. Essays and blog posts on any Hraness site also show the provenance note from [`GENERATION_STYLE.md`](https://github.com/hraness/.github/blob/main/GENERATION_STYLE.md), naming the recorded reviewer. Other pages on other Hraness sites and products do not carry AI-drafting disclosures, labels, or badges.
238
+ - Everywhere, keep a record of who drafted and who reviewed generated or agent-drafted text: the author, an independent human, or an AI agent, by name.
239
+ - Never credit AI-drafted text to a person as its sole author, never describe AI review as human review, and never claim a review that has no record. A page without a review record makes no review claim.
240
+ - Text an agent posts from a person's account does not claim that person wrote AI-drafted work.
241
+
242
+ ## Repository additions
243
+
244
+ - Copy written for the product-marketing components also follows [`MARKETING_COPY.md`](MARKETING_COPY.md), which says what each slot holds and how long it can be.
245
+ - Articles follow [`ARTICLE_COPY.md`](ARTICLE_COPY.md). By the owner's 2026-09-23 decision, articles on every host show the drafting and review note, which takes precedence over the hraness.com-only disclosure rule above for articles.
package/WRITING.md ADDED
@@ -0,0 +1,72 @@
1
+ # Internal writing and voice
2
+
3
+ <!-- synced from hraness/.github WRITING.md sha256:9ff22e15275ceb5a9113b49d177a6b309233164661cc723bddd98912fb80c92b -->
4
+
5
+ This guide covers agent responses, code comments, commits, pull requests, plans, and knowledge-base notes. [`STYLE.md`](STYLE.md) adds rules for public prose.
6
+
7
+ This copy is synced from [hraness/.github](https://github.com/hraness/.github/blob/main/WRITING.md). Change shared rules there; add rules for this repository under “Repository additions” below.
8
+
9
+ ## Write for the spoken voice
10
+
11
+ - Lead with the answer, outcome, or required action.
12
+ - Have a position. State the conclusion and its reason.
13
+ - Connect related ideas. Do not stack choppy sentences that all carry equal weight.
14
+ - Vary sentence length and structure enough to avoid a mechanical rhythm.
15
+ - Do not force each paragraph to announce its point and repeat it at the end.
16
+ - Remove throat-clearing openers, recaps, setup-and-payoff framing, and decorative closing lines.
17
+ - Ask a real question only when the reader needs to answer it. Do not use rhetorical questions to manufacture momentum.
18
+ - State a claim directly instead of staging a “not X but Y” contrast.
19
+ - Do not build rhythm from repeated negatives, contrasting pairs, parallel sentence forms, or automatic groups of three.
20
+ - Keep parallel grammar when a list, procedure, or exact comparison needs it.
21
+ - Prefer concrete verbs to noun phrases that hide the action. Write “evaluate,” not “perform an evaluation.”
22
+ - Unpack long stacks of nouns so the relationship between terms is explicit.
23
+ - Remove filler intensifiers such as *genuinely, really, truly,* and *actually*.
24
+ - Replace vague corporate verbs such as *leverage, utilize, showcase,* and *underscore* with the exact action.
25
+ - Replace abstract slogans and personification with the action, object, and result. A technical property can be named when it changes a decision; it is not a tagline.
26
+ - Use one accurate qualifier when uncertainty matters. Remove empty or repeated hedges.
27
+ - Use natural contractions when they fit the voice. Do not force a formal register.
28
+ - Keep enthusiasm proportional to the evidence. Do not perform excitement or agreement.
29
+ - Use humor rarely. Do not let humor carry technical meaning.
30
+
31
+ These rules target rhetorical habits, not necessary grammar. Keep a contrast, qualifier, parallel structure, or technical noun when accuracy requires it.
32
+
33
+ ## Keep technical prose exact
34
+
35
+ - Preserve facts, names, numbers, quotations, links, code, commands, and necessary qualifications.
36
+ - Use one stable term for each concept. Define an unfamiliar term at its first use.
37
+ - Keep exact code identifiers, interface values, proper names, and approved project vocabulary.
38
+ - Prefer a short familiar word only when it preserves the technical distinction.
39
+ - Prefer active voice when the actor and action matter. Use passive voice when the actor is unknown or the result is the subject.
40
+ - Give one required action in each procedural step. Start the step with an imperative verb.
41
+ - Put a prerequisite condition before its command.
42
+ - Put required actions in steps, not notes. Use notes for supporting information.
43
+ - Start safety text with a clear command or condition. Name the risk and the possible result.
44
+ - Use a vertical list when prose hides complex parallel information.
45
+ - Use inclusive language. Avoid regional expressions, slang, and unexplained jargon.
46
+
47
+ [ASD-STE100 Simplified Technical English, Issue 9](https://www.asd-ste100.org/assets/files/ASD-STE100_ISSUE9.pdf) remains an additional standard for controlled technical English. Use it only when a procedure, safety instruction, maintenance document, or contract requires STE.
48
+
49
+ Apply its controlled dictionary and numeric limits only when the task requires STE compliance. Do not claim compliance without a review against the full standard.
50
+
51
+ ## Keep the structure operational
52
+
53
+ - Use bullets for parallel independent items. Use paragraphs for connected reasoning.
54
+ - Use informative, sentence-case headings. Do not use decorative emoji.
55
+ - Reserve callouts for destructive actions, breaking changes, or required reader action.
56
+ - Name the file, function, count, command, date, or failure.
57
+ - Describe the scale of a change accurately. A configuration edit is a configuration edit.
58
+ - State failures with evidence. Write “3 of 41 tests fail,” and name the failed tests.
59
+ - Name skipped checks and real uncertainty once.
60
+ - Stop when the useful content ends. Do not add a recap to text the reader has just read.
61
+ - Record an AI review as an AI review. Before you call copy done, check it against `STYLE.md` and name what you did not verify.
62
+ - Match the length to the reader's next decision. Delete details that do not change it.
63
+
64
+ ## Match the writing surface
65
+
66
+ - Agent responses give the answer first, then necessary reasoning and limits. Match the user's register and time pressure.
67
+ - Code comments explain intent, a tradeoff, or a non-obvious risk. They do not narrate visible code.
68
+ - Commits and pull requests name the outcome and its reason. Keep file inventories secondary.
69
+ - Pull request bodies and commit messages describe a change. Do not paste them into READMEs or guides, which describe the product as it is.
70
+ - The vocabulary of `AGENTS.md`, CI, and admission ledgers is internal. Use it in commits, pull requests, and agent notes when it is the precise term; translate it when the text will reach a reader outside the repository.
71
+ - Knowledge-base notes use complete thoughts, durable context, source links, and descriptive titles.
72
+ - Riffs preserve first-person voice and uncertainty while they repair transcription errors. Do not flatten personality into a summary.