@design-intelligence/ghost 0.0.0-next-20260715121453

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 (327) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +89 -0
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +19 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +29 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/checks-command.d.ts +9 -0
  12. package/dist/commands/checks-command.d.ts.map +1 -0
  13. package/dist/commands/checks-command.js +52 -0
  14. package/dist/commands/checks-command.js.map +1 -0
  15. package/dist/commands/command-discovery.d.ts +57 -0
  16. package/dist/commands/command-discovery.d.ts.map +1 -0
  17. package/dist/commands/command-discovery.js +220 -0
  18. package/dist/commands/command-discovery.js.map +1 -0
  19. package/dist/commands/errors.d.ts +7 -0
  20. package/dist/commands/errors.d.ts.map +1 -0
  21. package/dist/commands/errors.js +19 -0
  22. package/dist/commands/errors.js.map +1 -0
  23. package/dist/commands/export-command.d.ts +3 -0
  24. package/dist/commands/export-command.d.ts.map +1 -0
  25. package/dist/commands/export-command.js +157 -0
  26. package/dist/commands/export-command.js.map +1 -0
  27. package/dist/commands/fingerprint-commands.d.ts +10 -0
  28. package/dist/commands/fingerprint-commands.d.ts.map +1 -0
  29. package/dist/commands/fingerprint-commands.js +69 -0
  30. package/dist/commands/fingerprint-commands.js.map +1 -0
  31. package/dist/commands/gather-command.d.ts +3 -0
  32. package/dist/commands/gather-command.d.ts.map +1 -0
  33. package/dist/commands/gather-command.js +214 -0
  34. package/dist/commands/gather-command.js.map +1 -0
  35. package/dist/commands/init-command.d.ts +3 -0
  36. package/dist/commands/init-command.d.ts.map +1 -0
  37. package/dist/commands/init-command.js +89 -0
  38. package/dist/commands/init-command.js.map +1 -0
  39. package/dist/commands/manifest-command.d.ts +9 -0
  40. package/dist/commands/manifest-command.d.ts.map +1 -0
  41. package/dist/commands/manifest-command.js +33 -0
  42. package/dist/commands/manifest-command.js.map +1 -0
  43. package/dist/commands/pull-command.d.ts +3 -0
  44. package/dist/commands/pull-command.d.ts.map +1 -0
  45. package/dist/commands/pull-command.js +230 -0
  46. package/dist/commands/pull-command.js.map +1 -0
  47. package/dist/commands/pulse-command.d.ts +3 -0
  48. package/dist/commands/pulse-command.d.ts.map +1 -0
  49. package/dist/commands/pulse-command.js +248 -0
  50. package/dist/commands/pulse-command.js.map +1 -0
  51. package/dist/commands/review-command.d.ts +3 -0
  52. package/dist/commands/review-command.d.ts.map +1 -0
  53. package/dist/commands/review-command.js +78 -0
  54. package/dist/commands/review-command.js.map +1 -0
  55. package/dist/commands/skill-command.d.ts +3 -0
  56. package/dist/commands/skill-command.d.ts.map +1 -0
  57. package/dist/commands/skill-command.js +96 -0
  58. package/dist/commands/skill-command.js.map +1 -0
  59. package/dist/fingerprint.d.ts +5 -0
  60. package/dist/fingerprint.d.ts.map +1 -0
  61. package/dist/fingerprint.js +3 -0
  62. package/dist/fingerprint.js.map +1 -0
  63. package/dist/ghost-core/catalog/assemble.d.ts +26 -0
  64. package/dist/ghost-core/catalog/assemble.d.ts.map +1 -0
  65. package/dist/ghost-core/catalog/assemble.js +29 -0
  66. package/dist/ghost-core/catalog/assemble.js.map +1 -0
  67. package/dist/ghost-core/catalog/closest.d.ts +16 -0
  68. package/dist/ghost-core/catalog/closest.d.ts.map +1 -0
  69. package/dist/ghost-core/catalog/closest.js +63 -0
  70. package/dist/ghost-core/catalog/closest.js.map +1 -0
  71. package/dist/ghost-core/catalog/index.d.ts +10 -0
  72. package/dist/ghost-core/catalog/index.d.ts.map +1 -0
  73. package/dist/ghost-core/catalog/index.js +9 -0
  74. package/dist/ghost-core/catalog/index.js.map +1 -0
  75. package/dist/ghost-core/catalog/menu.d.ts +28 -0
  76. package/dist/ghost-core/catalog/menu.d.ts.map +1 -0
  77. package/dist/ghost-core/catalog/menu.js +23 -0
  78. package/dist/ghost-core/catalog/menu.js.map +1 -0
  79. package/dist/ghost-core/catalog/types.d.ts +33 -0
  80. package/dist/ghost-core/catalog/types.d.ts.map +1 -0
  81. package/dist/ghost-core/catalog/types.js +2 -0
  82. package/dist/ghost-core/catalog/types.js.map +1 -0
  83. package/dist/ghost-core/check/index.d.ts +12 -0
  84. package/dist/ghost-core/check/index.d.ts.map +1 -0
  85. package/dist/ghost-core/check/index.js +12 -0
  86. package/dist/ghost-core/check/index.js.map +1 -0
  87. package/dist/ghost-core/check/lint.d.ts +9 -0
  88. package/dist/ghost-core/check/lint.d.ts.map +1 -0
  89. package/dist/ghost-core/check/lint.js +119 -0
  90. package/dist/ghost-core/check/lint.js.map +1 -0
  91. package/dist/ghost-core/check/load.d.ts +7 -0
  92. package/dist/ghost-core/check/load.d.ts.map +1 -0
  93. package/dist/ghost-core/check/load.js +44 -0
  94. package/dist/ghost-core/check/load.js.map +1 -0
  95. package/dist/ghost-core/check/parse.d.ts +12 -0
  96. package/dist/ghost-core/check/parse.d.ts.map +1 -0
  97. package/dist/ghost-core/check/parse.js +13 -0
  98. package/dist/ghost-core/check/parse.js.map +1 -0
  99. package/dist/ghost-core/check/source-ref.d.ts +27 -0
  100. package/dist/ghost-core/check/source-ref.d.ts.map +1 -0
  101. package/dist/ghost-core/check/source-ref.js +58 -0
  102. package/dist/ghost-core/check/source-ref.js.map +1 -0
  103. package/dist/ghost-core/check/types.d.ts +48 -0
  104. package/dist/ghost-core/check/types.d.ts.map +1 -0
  105. package/dist/ghost-core/check/types.js +4 -0
  106. package/dist/ghost-core/check/types.js.map +1 -0
  107. package/dist/ghost-core/errors.d.ts +30 -0
  108. package/dist/ghost-core/errors.d.ts.map +1 -0
  109. package/dist/ghost-core/errors.js +33 -0
  110. package/dist/ghost-core/errors.js.map +1 -0
  111. package/dist/ghost-core/glob.d.ts +5 -0
  112. package/dist/ghost-core/glob.d.ts.map +1 -0
  113. package/dist/ghost-core/glob.js +68 -0
  114. package/dist/ghost-core/glob.js.map +1 -0
  115. package/dist/ghost-core/glossary.d.ts +25 -0
  116. package/dist/ghost-core/glossary.d.ts.map +1 -0
  117. package/dist/ghost-core/glossary.js +69 -0
  118. package/dist/ghost-core/glossary.js.map +1 -0
  119. package/dist/ghost-core/index.d.ts +13 -0
  120. package/dist/ghost-core/index.d.ts.map +1 -0
  121. package/dist/ghost-core/index.js +19 -0
  122. package/dist/ghost-core/index.js.map +1 -0
  123. package/dist/ghost-core/markdown.d.ts +15 -0
  124. package/dist/ghost-core/markdown.d.ts.map +1 -0
  125. package/dist/ghost-core/markdown.js +30 -0
  126. package/dist/ghost-core/markdown.js.map +1 -0
  127. package/dist/ghost-core/material-transport.d.ts +43 -0
  128. package/dist/ghost-core/material-transport.d.ts.map +1 -0
  129. package/dist/ghost-core/material-transport.js +231 -0
  130. package/dist/ghost-core/material-transport.js.map +1 -0
  131. package/dist/ghost-core/materials.d.ts +14 -0
  132. package/dist/ghost-core/materials.d.ts.map +1 -0
  133. package/dist/ghost-core/materials.js +52 -0
  134. package/dist/ghost-core/materials.js.map +1 -0
  135. package/dist/ghost-core/node/index.d.ts +11 -0
  136. package/dist/ghost-core/node/index.d.ts.map +1 -0
  137. package/dist/ghost-core/node/index.js +11 -0
  138. package/dist/ghost-core/node/index.js.map +1 -0
  139. package/dist/ghost-core/node/parse.d.ts +16 -0
  140. package/dist/ghost-core/node/parse.d.ts.map +1 -0
  141. package/dist/ghost-core/node/parse.js +55 -0
  142. package/dist/ghost-core/node/parse.js.map +1 -0
  143. package/dist/ghost-core/node/schema.d.ts +17 -0
  144. package/dist/ghost-core/node/schema.d.ts.map +1 -0
  145. package/dist/ghost-core/node/schema.js +49 -0
  146. package/dist/ghost-core/node/schema.js.map +1 -0
  147. package/dist/ghost-core/node/serialize.d.ts +12 -0
  148. package/dist/ghost-core/node/serialize.d.ts.map +1 -0
  149. package/dist/ghost-core/node/serialize.js +39 -0
  150. package/dist/ghost-core/node/serialize.js.map +1 -0
  151. package/dist/ghost-core/node/steering.d.ts +19 -0
  152. package/dist/ghost-core/node/steering.d.ts.map +1 -0
  153. package/dist/ghost-core/node/steering.js +68 -0
  154. package/dist/ghost-core/node/steering.js.map +1 -0
  155. package/dist/ghost-core/node/types.d.ts +43 -0
  156. package/dist/ghost-core/node/types.d.ts.map +1 -0
  157. package/dist/ghost-core/node/types.js +2 -0
  158. package/dist/ghost-core/node/types.js.map +1 -0
  159. package/dist/ghost-core/package-manifest.d.ts +19 -0
  160. package/dist/ghost-core/package-manifest.d.ts.map +1 -0
  161. package/dist/ghost-core/package-manifest.js +24 -0
  162. package/dist/ghost-core/package-manifest.js.map +1 -0
  163. package/dist/ghost-core/skill-bundle-loader.d.ts +28 -0
  164. package/dist/ghost-core/skill-bundle-loader.d.ts.map +1 -0
  165. package/dist/ghost-core/skill-bundle-loader.js +51 -0
  166. package/dist/ghost-core/skill-bundle-loader.js.map +1 -0
  167. package/dist/index.d.ts +5 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +5 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/init-payloads/median/cliche.median.md +86 -0
  172. package/dist/init-payloads/median/median-tells.md +117 -0
  173. package/dist/init-payloads/skeleton/brand.md +23 -0
  174. package/dist/init-payloads/skeleton/context.conversation.md +24 -0
  175. package/dist/init-payloads/skeleton/foundation.color.md +39 -0
  176. package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
  177. package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
  178. package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
  179. package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
  180. package/dist/init-payloads/skeleton/foundation.type.md +44 -0
  181. package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
  182. package/dist/init-payloads/skeleton/glossary.md +39 -0
  183. package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
  184. package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
  185. package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
  186. package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
  187. package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
  188. package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
  189. package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
  190. package/dist/init-payloads/vessel-light/checks/values.md +51 -0
  191. package/dist/init-payloads/vessel-light/glossary.md +44 -0
  192. package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
  193. package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
  194. package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
  195. package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
  196. package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
  197. package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
  198. package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
  199. package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
  200. package/dist/init-payloads/vessel-light/index.md +33 -0
  201. package/dist/init-payloads/vessel-light/manifest.yml +3 -0
  202. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
  203. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
  204. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
  205. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
  206. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
  207. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
  208. package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
  209. package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
  210. package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
  211. package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
  212. package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
  213. package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
  214. package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
  215. package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
  216. package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
  217. package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
  218. package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
  219. package/dist/init-payloads/vessel-light/register.email.md +43 -0
  220. package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
  221. package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
  222. package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
  223. package/dist/init-payloads/vessel-light/signature.type.md +37 -0
  224. package/dist/internal/fs.d.ts +4 -0
  225. package/dist/internal/fs.d.ts.map +1 -0
  226. package/dist/internal/fs.js +24 -0
  227. package/dist/internal/fs.js.map +1 -0
  228. package/dist/observability-events.d.ts +34 -0
  229. package/dist/observability-events.d.ts.map +1 -0
  230. package/dist/observability-events.js +68 -0
  231. package/dist/observability-events.js.map +1 -0
  232. package/dist/package-version.d.ts +3 -0
  233. package/dist/package-version.d.ts.map +1 -0
  234. package/dist/package-version.js +10 -0
  235. package/dist/package-version.js.map +1 -0
  236. package/dist/review/baseline.d.ts +11 -0
  237. package/dist/review/baseline.d.ts.map +1 -0
  238. package/dist/review/baseline.js +35 -0
  239. package/dist/review/baseline.js.map +1 -0
  240. package/dist/review/diff.d.ts +7 -0
  241. package/dist/review/diff.d.ts.map +1 -0
  242. package/dist/review/diff.js +41 -0
  243. package/dist/review/diff.js.map +1 -0
  244. package/dist/review/glob.d.ts +2 -0
  245. package/dist/review/glob.d.ts.map +1 -0
  246. package/dist/review/glob.js +2 -0
  247. package/dist/review/glob.js.map +1 -0
  248. package/dist/review/probes.d.ts +13 -0
  249. package/dist/review/probes.d.ts.map +1 -0
  250. package/dist/review/probes.js +45 -0
  251. package/dist/review/probes.js.map +1 -0
  252. package/dist/review/resolve.d.ts +28 -0
  253. package/dist/review/resolve.d.ts.map +1 -0
  254. package/dist/review/resolve.js +90 -0
  255. package/dist/review/resolve.js.map +1 -0
  256. package/dist/review/review-packet.d.ts +41 -0
  257. package/dist/review/review-packet.d.ts.map +1 -0
  258. package/dist/review/review-packet.js +128 -0
  259. package/dist/review/review-packet.js.map +1 -0
  260. package/dist/scan/check-files.d.ts +23 -0
  261. package/dist/scan/check-files.d.ts.map +1 -0
  262. package/dist/scan/check-files.js +75 -0
  263. package/dist/scan/check-files.js.map +1 -0
  264. package/dist/scan/check-scaffold.d.ts +8 -0
  265. package/dist/scan/check-scaffold.d.ts.map +1 -0
  266. package/dist/scan/check-scaffold.js +53 -0
  267. package/dist/scan/check-scaffold.js.map +1 -0
  268. package/dist/scan/constants.d.ts +21 -0
  269. package/dist/scan/constants.d.ts.map +1 -0
  270. package/dist/scan/constants.js +21 -0
  271. package/dist/scan/constants.js.map +1 -0
  272. package/dist/scan/file-kind.d.ts +12 -0
  273. package/dist/scan/file-kind.d.ts.map +1 -0
  274. package/dist/scan/file-kind.js +114 -0
  275. package/dist/scan/file-kind.js.map +1 -0
  276. package/dist/scan/fingerprint-package-lint.d.ts +8 -0
  277. package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
  278. package/dist/scan/fingerprint-package-lint.js +284 -0
  279. package/dist/scan/fingerprint-package-lint.js.map +1 -0
  280. package/dist/scan/fingerprint-package-loader.d.ts +5 -0
  281. package/dist/scan/fingerprint-package-loader.d.ts.map +1 -0
  282. package/dist/scan/fingerprint-package-loader.js +78 -0
  283. package/dist/scan/fingerprint-package-loader.js.map +1 -0
  284. package/dist/scan/fingerprint-package.d.ts +66 -0
  285. package/dist/scan/fingerprint-package.d.ts.map +1 -0
  286. package/dist/scan/fingerprint-package.js +101 -0
  287. package/dist/scan/fingerprint-package.js.map +1 -0
  288. package/dist/scan/index.d.ts +3 -0
  289. package/dist/scan/index.d.ts.map +1 -0
  290. package/dist/scan/index.js +3 -0
  291. package/dist/scan/index.js.map +1 -0
  292. package/dist/scan/lint.d.ts +15 -0
  293. package/dist/scan/lint.d.ts.map +1 -0
  294. package/dist/scan/lint.js +2 -0
  295. package/dist/scan/lint.js.map +1 -0
  296. package/dist/scan/node-files.d.ts +25 -0
  297. package/dist/scan/node-files.d.ts.map +1 -0
  298. package/dist/scan/node-files.js +112 -0
  299. package/dist/scan/node-files.js.map +1 -0
  300. package/dist/scan/package-paths.d.ts +10 -0
  301. package/dist/scan/package-paths.d.ts.map +1 -0
  302. package/dist/scan/package-paths.js +49 -0
  303. package/dist/scan/package-paths.js.map +1 -0
  304. package/dist/scan/packed-payloads.d.ts +4 -0
  305. package/dist/scan/packed-payloads.d.ts.map +1 -0
  306. package/dist/scan/packed-payloads.js +55 -0
  307. package/dist/scan/packed-payloads.js.map +1 -0
  308. package/dist/scan/tarball.d.ts +23 -0
  309. package/dist/scan/tarball.d.ts.map +1 -0
  310. package/dist/scan/tarball.js +145 -0
  311. package/dist/scan/tarball.js.map +1 -0
  312. package/dist/scan/templates.d.ts +42 -0
  313. package/dist/scan/templates.d.ts.map +1 -0
  314. package/dist/scan/templates.js +375 -0
  315. package/dist/scan/templates.js.map +1 -0
  316. package/dist/skill-bundle/SKILL.md +146 -0
  317. package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
  318. package/dist/skill-bundle/references/authoring-scenarios.md +184 -0
  319. package/dist/skill-bundle/references/blocks.md +179 -0
  320. package/dist/skill-bundle/references/brief.md +50 -0
  321. package/dist/skill-bundle/references/capture.md +392 -0
  322. package/dist/skill-bundle/references/concrete-tiers.md +95 -0
  323. package/dist/skill-bundle/references/recall.md +36 -0
  324. package/dist/skill-bundle/references/schema.md +114 -0
  325. package/dist/skill-bundle/references/self-check.md +65 -0
  326. package/dist/skill-bundle/references/steering-audit.md +60 -0
  327. package/package.json +79 -0
@@ -0,0 +1,392 @@
1
+ ---
2
+ name: capture
3
+ description: Author repo-local Ghost brand fingerprints as a flat set of prose nodes.
4
+ handoffs:
5
+ - label: Inspect the package
6
+ command: ghost validate
7
+ prompt: Does this fingerprint package validate, and what is absent?
8
+ ---
9
+
10
+ # Recipe: Author Ghost Fingerprint
11
+
12
+ **Goal:** record durable brand truths in `.ghost/` as a flat set of prose
13
+ **nodes**. If a change is uncommitted, it is draft work. If it is checked in,
14
+ Ghost treats the fingerprint package as canonical.
15
+
16
+ ```text
17
+ .ghost/
18
+ manifest.yml # schema + id
19
+ glossary.md # the kind vocabulary + what each kind means
20
+ principle.trust.md # a brand truth of kind `principle`
21
+ pattern.invoice.md # a pattern with an optional ## Skeleton
22
+ anti-goal.generic.md # a review-critical replacement rule
23
+ voice.md # a brand truth without a kind
24
+ ```
25
+
26
+ A **node** is a markdown file: a `description`, optional `materials`, and a
27
+ prose body. The package is **flat** — no hierarchy, no inheritance, no edges. A
28
+ node's kind comes from its filename prefix; the glossary declares the kinds.
29
+
30
+ ## Lead with an annotated exemplar over a complete artifact
31
+
32
+ The strongest steering artifact is not a summary; it is a complete on-brand
33
+ artifact with annotation. Capture the whole thing, then name what the agent
34
+ should preserve and what is incidental.
35
+
36
+ `exemplar.status-card.md`:
37
+
38
+ ````markdown
39
+ ---
40
+ description: Complete status card exemplar — normative for density, evidence placement, and action language.
41
+ materials:
42
+ - src/components/status-card.tsx
43
+ ---
44
+
45
+ Normative for the opening fact, square edge, evidence placement, and accountable
46
+ action. The exact invoice count and dates are incidental.
47
+
48
+ ```tsx
49
+ <section className="border-l border-[#D8DED8] bg-[#F7F5EF] p-6 text-[#17201B]">
50
+ <p className="text-xs uppercase tracking-[0.14em] text-[#2F6F4F]">Bank sync</p>
51
+ <h1 className="mt-3 text-2xl font-semibold">3 deposits need matching</h1>
52
+ <p className="mt-2 max-w-prose text-sm">
53
+ They total $8,410 and arrived between Jul 12 and Jul 15.
54
+ </p>
55
+ <button className="mt-6 border border-[#17201B] px-4 py-2 text-sm">
56
+ Match deposits — about 4 minutes
57
+ </button>
58
+ </section>
59
+ ```
60
+
61
+ What makes it ours: the surface opens with an accountable fact, keeps evidence
62
+ next to the claim, uses square structure instead of floating cards, and prices
63
+ the user's next action in time. Do not copy the exact amounts, dates, or class
64
+ names unless the implementation path confirms them.
65
+ ````
66
+
67
+ The annotation is load-bearing. A bare sample teaches form; the annotation
68
+ teaches which features of the form are intentional, which stops an agent from
69
+ copying incidental details.
70
+
71
+ Protect exact voice artifacts the same way. A real on-brand error message
72
+ out-steers a paragraph about error-message voice:
73
+
74
+ `exemplar.error-voice.md`:
75
+
76
+ ```markdown
77
+ ---
78
+ description: A verbatim on-brand error message — the voice at failure moments.
79
+ ---
80
+
81
+ Normative for rhythm and stance at failure moments; match its form, not its words.
82
+
83
+ > We couldn't save your changes. Your work is still here — try again, and if it
84
+ > keeps failing, we'll hold onto everything while you sort it out.
85
+
86
+ What makes it ours: leads with what happened, not with apology. States what is
87
+ safe before what to do. One calm next step. No "Oops," no exclamation points,
88
+ no blame on the user or the network.
89
+ ```
90
+
91
+ ## Write patterns as bound and open
92
+
93
+ A pattern node binds part of a reusable structure and leaves the rest open.
94
+ State both explicitly:
95
+
96
+ - **Bound** — what the agent should not redecide: the structural moves fixed
97
+ regardless of task (what renders first, what appears exactly once, what may
98
+ never compete for attention).
99
+ - **Open** — where the agent may choose, within limits (which evidence shape
100
+ fits, how tone flexes, where secondary content may go).
101
+
102
+ If everything is bound, the node is a template, not a pattern. If nothing is
103
+ bound, it is vibes, not steering. A pattern may also `Refines:` a broader
104
+ principle by id; when the two conflict, the principle wins.
105
+
106
+ ## Add Skeletons when the opening structure matters
107
+
108
+ A `## Skeleton` section contains the literal opening structure the agent should
109
+ start from. Use it on a pattern node when the first tokens determine whether the
110
+ surface lands in the right shape.
111
+
112
+ Rules:
113
+
114
+ - Put exactly one fenced block in each `## Skeleton` section. `ghost validate`
115
+ warns when there are zero or multiple fences.
116
+ - Make the block complete enough to begin from, but not so complete that it
117
+ invents task-specific facts.
118
+ - Keep explanation above the `## Skeleton`; `ghost pull` extracts skeleton
119
+ fences and emits them dead last under the banner to begin from this structure.
120
+ - If a pulled skeleton matches the requested surface, write it first verbatim,
121
+ then fill it with the task's facts and materials.
122
+
123
+ ## Write rules only after concrete artifacts
124
+
125
+ Rules are useful when they name the decision that survives across examples.
126
+ Keep them short, specific, and attached to concrete objects whenever possible:
127
+
128
+ - exact values when the agent keeps inventing values;
129
+ - never/always invariants when a hard line is crossed;
130
+ - conditions in prose when guidance applies only in a situation;
131
+ - decision traces when two plausible choices keep competing.
132
+
133
+ Do not turn every observation into a rule. Stale or generic rules average
134
+ against the exemplars and pull the packet back toward the median.
135
+
136
+ ## Write anti-goals as replacement, not as blacklist
137
+
138
+ An anti-goal is ordinary node prose whose kind the glossary defines as a
139
+ review-critical replacement rule.
140
+
141
+ A good anti-goal states **not X; instead Y; recognize the switch by Z**. The
142
+ replacement matters because negation alone raises the salience of the rejected
143
+ thing.
144
+
145
+ `anti-goal.generic-ui.md`:
146
+
147
+ ```markdown
148
+ ---
149
+ description: Review-critical replacement for the generic AI dashboard default.
150
+ ---
151
+
152
+ Not: rounded-xl cards on gray-50, indigo primary buttons, gradient hero text,
153
+ emoji headings, and "You're crushing it" optimism.
154
+
155
+ Instead: flat paper surfaces, one restrained accent, square alignment, and a
156
+ next action backed by the number or source that justifies it.
157
+
158
+ Recognize the switch: if removing the logo would make the surface look like any
159
+ SaaS template, the anti-goal failed even when every token is technically valid.
160
+ ```
161
+
162
+ The strongest anti-goal is silent: purged from exemplars, absent from starter
163
+ structures, and enforced by a probe-backed check in review. Use anti-goal prose
164
+ to name the replacement; use checks and `probe:` commands to catch regressions.
165
+
166
+ ## The node shape
167
+
168
+ A node at `principle.trust.md` (id `principle.trust`, kind `principle`):
169
+
170
+ ```markdown
171
+ ---
172
+ description: Trust at the payment moment. # the retrieval payload
173
+ # optional: materials, audience, stage, or other free-form keys
174
+ ---
175
+
176
+ Near the moment of payment, reduce felt risk. Proximity of reassurance to the
177
+ action beats completeness...
178
+ ```
179
+
180
+ - **`description`** is how an agent finds the node: a compact retrieval payload
181
+ naming what the node governs, the observable condition under which it applies,
182
+ and what it contributes when useful. `ghost gather` emits id, kind,
183
+ description, concrete coverage, payload labels, and material count; the agent matches the ask
184
+ against applicability.
185
+ - **Kind is the filename prefix** and must be a kind the glossary declares. A
186
+ bare name (`voice.md`) has no kind.
187
+ - **Altitude lives in the prose.** State a universal truth plainly; give a
188
+ narrower truth its **condition** — the situation it applies in — in the prose
189
+ and usually in the description. Do not use broad universal imperatives unless
190
+ universal retrieval is intended. Never file a truth by destination
191
+ (`for-emails.md`).
192
+ - **Concreteness is derived.** A node carries concrete material when it has
193
+ `materials`, a substantial fenced example, or a `## Skeleton`. You do not
194
+ declare a separate type.
195
+
196
+ ## What a node body answers
197
+
198
+ While drafting, ask three questions of every truth — *why* (the stance), *with
199
+ what* (the materials), and *how it is assembled* (the patterns). These are
200
+ drafting prompts, never frontmatter keys, node types, or required sections, and
201
+ a node may answer only one. Each answer lands as a steering dimension the
202
+ machinery already scores:
203
+
204
+ - **why** lands as stance prose — read first in `ghost pull`, weakest at
205
+ moving output form on its own; it is the yardstick every later selection is
206
+ measured against.
207
+ - **with what** lands as `materials` and concreteness — affects pull packet
208
+ order and `ghost review` matching. See [blocks.md](blocks.md) for authoring
209
+ material-backed nodes.
210
+ - **how it is assembled** lands as patterns and `## Skeleton` sections — the
211
+ strongest steering; Skeleton fences are extracted and emitted dead last so
212
+ generation starts from them.
213
+
214
+ Keep a node **purpose-coherent**: one truth, any length. Split only when it is
215
+ genuinely a different truth.
216
+
217
+ ## Node prose stances
218
+
219
+ Node prose is steering payload. A generic sentence in a node body averages every
220
+ future generation toward the median, so hold drafts to these stances before the
221
+ human sees them.
222
+
223
+ Two carve-outs come first, because they invert ordinary prose advice:
224
+
225
+ - **Anti-goals keep their negation.** "Not X; instead Y; recognize the switch
226
+ by Z" is the required anti-goal form. Naming the rejected thing is the
227
+ anti-goal's job; never "improve" one by stating only the replacement.
228
+ - **Invariants keep their absolutes.** "Never" and "always" are correct in an
229
+ invariant when the hard line is real and human-ratified. Absolutes are lazy
230
+ only when they stand in for an uncurated stance.
231
+
232
+ Everywhere else:
233
+
234
+ - **No aspirational abstractions.** "We value clarity and trust" steers
235
+ nothing. Name the decision the truth forces: what gets picked when two goods
236
+ compete, and what gets given up.
237
+ - **Descriptions must discriminate.** Read the description alone. If it also
238
+ fits a competitor's brand, it is retrieval-dead; rewrite it until it could
239
+ belong to no one else.
240
+ - **Cut unratified hedges.** "Generally," "where possible," and "consider" in a
241
+ node body mean the human never picked a side. Get the ratification or cut the
242
+ sentence.
243
+ - **Ban brand-deck filler.** "Elevate," "delight," "seamless," "best-in-class,"
244
+ "empower." When a brand doc supplies these words, they are testimony to
245
+ distill, never prose to keep.
246
+ - **Settle the altitude on purpose.** Every truth is either claimed universal
247
+ or given its condition in the prose. A node body that does neither was never
248
+ curated for altitude; ask the human which it is.
249
+
250
+ ## Score drafts before curation
251
+
252
+ Before handing drafts to the human (step 5), rate each node 1 to 5 per
253
+ dimension:
254
+
255
+ | Dimension | Question |
256
+ | --- | --- |
257
+ | Testimony | Can you quote the human words or artifact this node came from? |
258
+ | Discrimination | Does the description fit only this brand? |
259
+ | Force | Does the node body decide something, or merely describe something? |
260
+ | Altitude | Is it universal on purpose, or given its condition? |
261
+ | Residue | Is it free of starter-demo prose and brand-deck filler? |
262
+
263
+ Below 20 of 25, the node goes back to the interview, not into the package. The
264
+ score is a drafting gate for the agent; the human's keep/soften/reject verdict
265
+ in curation still decides what becomes canonical.
266
+
267
+ ## Author through steering jobs
268
+
269
+ The steering jobs are questions, not mandatory fields. Encode the truth in the
270
+ strongest form that fixes the observed failure.
271
+
272
+ | If the agent keeps... | Author... |
273
+ | --- | --- |
274
+ | missing the truth | sharper `description`; move universal truth to the cover |
275
+ | inventing values | `asset.*` node with materials and exact names |
276
+ | producing generic output | `anti-goal.*` replacement plus annotated `exemplar.*` |
277
+ | choosing the wrong structure | `pattern.*` with bound/open and a `## Skeleton` |
278
+ | crossing hard lines | invariant prose plus a check, optionally with `probe:` |
279
+ | applying guidance too broadly | condition in prose |
280
+ | making bad tradeoffs | `decision.*` trace |
281
+ | producing correct but forgettable work | scoped `concept.*` |
282
+
283
+ A `concept.*` node holds a one-time creative move — a launch hook, a
284
+ campaign idea, a specific non-median leap the corpus would not have produced
285
+ by recombining its other truths. Scope it explicitly to the task or surface
286
+ it was written for, keep it distinct from invariants, and do not generalize
287
+ it into permanent brand law. If it proves reusable later, promote it into an
288
+ exemplar or pattern deliberately; do not let a one-off default into durable
289
+ truth by accumulation.
290
+
291
+ Ask while authoring:
292
+
293
+ - What complete artifact shows the brand at its best?
294
+ - What should be copied from this exemplar, and what is incidental?
295
+ - What generic output would an agent probably produce?
296
+ - What does this brand refuse, and what replaces it?
297
+ - What real material should the agent inspect?
298
+ - What opening structure should be preserved?
299
+ - What hard line would you block in review?
300
+ - When would this guidance reverse?
301
+
302
+ ## Steps
303
+
304
+ ### 1. Classify the authoring scenario
305
+
306
+ Decide which posture fits before scaffolding. Follow
307
+ [authoring-scenarios.md](authoring-scenarios.md) when setting up or substantially
308
+ revising a fingerprint. Human intent anchors the truths; what the human says and
309
+ shows — words, images, links, exemplars — is the evidence; agent synthesis is
310
+ draft work until a human curates it and Git review accepts it.
311
+
312
+ Monorepos and product suites run **one contract per package**.
313
+
314
+ ### 2. Initialize
315
+
316
+ ```bash
317
+ ghost init # scaffolds the steering starter
318
+ ghost validate
319
+ ```
320
+
321
+ `ghost init` seeds the skeleton starter: the manifest, a starter
322
+ `glossary.md`, a `brand.md` cover, foundation chapters with open questions, and
323
+ the model cliche floor. Replace open questions with real product truth before
324
+ using it to steer generation. Use `ghost init --template minimal` for a
325
+ manifest, glossary, cover, and cliche floor.
326
+
327
+ Write the manifest-declared cover as the human-curated front door:
328
+ non-negotiables that apply to every task, what the fingerprint covers, and any
329
+ stricter silence posture. `ghost gather` inlines it before the menu, so anything
330
+ that must never be missed belongs there.
331
+
332
+ Nodes may carry a `materials` list in frontmatter: repo-relative paths/globs or
333
+ HTTPS URLs for the concrete materials the prose governs. Put brand-owned
334
+ materials that should survive export or refactors under `materials/`; point at
335
+ living app code where the implementation itself should stay in place. Optional
336
+ review checks live under `.ghost/checks/` (`ghost checks init`) and are
337
+ feed-back only; they are never gathered.
338
+
339
+ ### 3. Shape the glossary
340
+
341
+ Declare the kinds you will use in `glossary.md` — the frontmatter `kinds` list
342
+ plus a `#` section per kind explaining its meaning and normative weight. Kinds
343
+ are your choice; Ghost ships no fixed vocabulary. A node's filename prefix must
344
+ match a declared kind (or the node has no kind).
345
+
346
+ The glossary is a dictionary of every term with defined meaning in the corpus.
347
+ A root `voice.md` with a `voice` glossary entry declares the scope for future
348
+ `voice.<slug>.md` nodes; declaring a kind with zero or one users is good
349
+ hygiene, not over-structure.
350
+
351
+ ### 4. Orient
352
+
353
+ Elicit the brand from the human, not from a codebase. Interview for stance,
354
+ audience, anti-goals, and exemplars; ask for the material they can show —
355
+ screenshots, links, exemplar products, brand docs, copy they love or hate. Treat
356
+ every artifact as testimony to curate, never truth to copy verbatim. Repo-bound
357
+ reality can be recorded as `materials` on the node whose prose explains its
358
+ purpose.
359
+
360
+ ### 5. Write sparse nodes
361
+
362
+ Add the smallest useful set of nodes, each a purpose-coherent prose truth
363
+ answering why, with what, or how it is assembled, named `<kind>.<slug>.md` or a
364
+ bare slug. Draft only what the
365
+ human said or showed. State conditions as situations in the prose. Prefer a few
366
+ high-confidence truths over a noisy catalog. Hold each draft to the node prose
367
+ stances and score it before curation; a node below the gate returns to the
368
+ interview. Ask the human to keep, soften,
369
+ reject, or re-title important claims before treating draft nodes as durable.
370
+
371
+ ### 6. Validate
372
+
373
+ ```bash
374
+ ghost validate .ghost
375
+ ```
376
+
377
+ `validate` checks artifact shape, per-node validity, glossary kind prefixes,
378
+ material locators, check references, and Skeleton fence counts.
379
+ Undeclared kind prefixes and malformed Skeleton sections are warnings.
380
+
381
+ ## Never
382
+
383
+ - Never describe any file outside `.ghost/` as canonical package input.
384
+ - Never derive a brand truth from repo code alone; what a codebase repeats may
385
+ be legacy, not stance. Use repo paths as `materials` only when the prose truth
386
+ has been curated.
387
+ - Never draft a node the human neither said nor showed.
388
+ - Never invent a hierarchy, inheritance, or cross-node edges — the package is
389
+ flat.
390
+ - Never file a truth by destination; state its condition in the prose.
391
+ - Never ship a blacklist-only anti-goal; state the replacement and enforce the
392
+ hard line in review.
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: concrete-tiers
3
+ description: Decide which concrete code tiers a fingerprint carries — tokens, skeletons, components, exemplars — and justify every absence.
4
+ handoffs:
5
+ - label: Audit what the package carries today
6
+ command: ghost gather
7
+ prompt: Which nodes carry concrete material, and which of the four tiers does the package cover?
8
+ ---
9
+
10
+ # Recipe: Choose The Concrete Code Tiers
11
+
12
+ **Goal:** decide, deliberately, which tiers of concrete code material a
13
+ fingerprint carries — and be able to say why any tier is absent. Absence
14
+ should be a decision, not a default.
15
+
16
+ Prose states a truth; concrete code makes it the cheapest continuation. A
17
+ package can carry code at four tiers, and each does a different job during
18
+ generation:
19
+
20
+ | Tier | Form | What it buys |
21
+ | --- | --- | --- |
22
+ | Tokens | `materials/tokens.css`, linked from nodes | Named values — the agent stops inventing colors, sizes, and durations. |
23
+ | Skeletons | `## Skeleton` HTML blocks inside pattern nodes | The opening structure — layout is committed before the generic default can win the first tokens. |
24
+ | Components | primitive classes or a class vocabulary in `materials/` | Reusable styling decisions — padding, variants, and states compress into names. |
25
+ | Exemplars | a complete surface with load-bearing moves annotated | Cross-node interactions — the constraints no single node states, demonstrated working together. |
26
+
27
+ Two properties decide whether a tier steers, and they are not the same thing:
28
+
29
+ - **Scope** — what the tier constrains: a token constrains one value, a
30
+ skeleton one block, an exemplar one whole surface.
31
+ - **Delivery** — whether the material is guaranteed to reach the agent.
32
+ Skeleton blocks live in node bodies, so `ghost pull` delivers them with the
33
+ truth. Files behind `materials:` locators reach only agents that spend a
34
+ turn reading them. A tier the agent never sees contributes nothing;
35
+ presence in the package is not presence in context.
36
+
37
+ ## The floor and the earned tiers
38
+
39
+ **Tokens are the floor.** Every package that steers visual output carries a
40
+ token vocabulary, and every other tier repeats those token names. That
41
+ repetition is the one redundancy worth keeping: the same name appearing in
42
+ prose, skeleton, and exemplar is what stops the agent from inventing
43
+ plausible near-miss values.
44
+
45
+ The other three tiers are earned by the package's shape:
46
+
47
+ - **Skeletons** pay when the package specifies few, composition-critical
48
+ surfaces — where the first structural commitment decides everything
49
+ downstream — and when consuming agents may read only pulled bodies.
50
+ - **Components** pay when the package covers many diverse surfaces generated
51
+ often, and the consuming agent reads material files. A class vocabulary
52
+ amortizes across surfaces; for a single surface shape it is dead weight.
53
+ - **Exemplars** pay almost everywhere: they are the cheapest way to show
54
+ tiers interacting. One per distinct surface shape; a package with one
55
+ exemplar and many surface shapes pulls every task toward the demonstrated
56
+ shape.
57
+
58
+ ## Every tier is a copy that can drift
59
+
60
+ Each tier repeats the token truth, and a stale copy steers harder than the
61
+ prose that corrects it. A hardcoded value in an exemplar where a token
62
+ exists is a lie waiting for a rename. Before adding a tier, accept its
63
+ maintenance bill; after any token change, sweep every tier for stranded
64
+ literals.
65
+
66
+ A tier can also fight the package's stance. A package whose truth is
67
+ "compose each surface fresh from the tokens" contradicts itself by shipping
68
+ a component kit; a package whose truth is "compose from the grammar, the
69
+ refs are examples not a framework" hardens toward template convergence if
70
+ every pattern carries a mandatory skeleton. When a tier and the stance
71
+ conflict, the stance wins — that absence is the package expressing itself.
72
+
73
+ ## Annotate whatever code ships
74
+
75
+ Un-annotated code teaches content along with structure. Whatever tier the
76
+ package carries, split the annotation two ways: name the load-bearing moves
77
+ (what makes it this brand — copy these) and mark the incidental content
78
+ (domain, figures, labels — swap these). An exemplar without this split
79
+ teaches the agent that the example's subject matter is the brand.
80
+
81
+ ## The self-check
82
+
83
+ For any package, answer four questions:
84
+
85
+ 1. Where does the value vocabulary live? (If not a token file: why?)
86
+ 2. What forces the opening structure of the package's most
87
+ composition-critical surface? (If nothing: is that surface's structure
88
+ genuinely open?)
89
+ 3. What demonstrates the cross-node constraints working together? (If
90
+ nothing: which interactions is the agent left to infer?)
91
+ 4. For every tier present: will the consuming agent actually have it in
92
+ context when it generates?
93
+
94
+ Any answer may legitimately be "absent, because" — the recipe's only
95
+ requirement is that the "because" exists.
@@ -0,0 +1,36 @@
1
+ ---
2
+ name: recall
3
+ description: Gather and pull the applicable Ghost brand truths for a task.
4
+ ---
5
+
6
+ # Recipe: Recall Ghost Fingerprint
7
+
8
+ 1. Run `ghost gather <ask>` for the actual task. The cover is inlined by gather;
9
+ do not pull it separately. Read the coverage line: all-prose fingerprints are
10
+ weak steering.
11
+ 2. Select against `description`; Ghost never selects for you. Pull every node
12
+ whose stated situation applies and whose truth, material, structure, or
13
+ refusal governs the work. Skip inapplicable nodes. Topic overlap alone is not
14
+ applicability.
15
+ 3. Run `ghost pull <id> [<id>…]`. Prefer `pull` over reading files directly: it
16
+ orders the packet for steering, inlines small local materials, emits
17
+ inspect-pointers for binary materials, extracts Skeletons last, and logs the
18
+ pull to `.ghost/.events`.
19
+
20
+ ## Read order = pull emission order
21
+
22
+ `ghost pull` emits selected nodes in steering order:
23
+
24
+ 1. Cover first, when explicitly selected; normally it is already inlined by
25
+ gather and should not be pulled separately.
26
+ 2. Concrete-material nodes: `materials`, substantial fenced examples, or
27
+ `## Skeleton` sections, with materials inlined or pointed to inspect.
28
+ 3. Prose-only rules: principles, conditions, decisions, and other rules without
29
+ concrete material.
30
+ 4. Skeleton fences dead last: if one matches the surface, start from that
31
+ structure verbatim.
32
+
33
+ Return the selected truths with node ids, how each applies, and where the
34
+ fingerprint is silent. If no node applies, say so and do not invent Ghost-backed
35
+ guidance. If silence is safe, proceed provisionally and label it;
36
+ if it is brand-defining or high-risk, ask or author a node first.
@@ -0,0 +1,114 @@
1
+ ---
2
+ name: schema
3
+ description: The Ghost fingerprint package shape: flat nodes, derived concreteness, Skeletons, probes, and checks.
4
+ ---
5
+
6
+ # Ghost Fingerprint Package Reference
7
+
8
+ Canonical package:
9
+
10
+ ```text
11
+ .ghost/
12
+ manifest.yml ghost.fingerprint-package/v1: schema + id + optional cover
13
+ glossary.md kind vocabulary + meanings
14
+ materials/ bundled materials; never a node source
15
+ <kind>.<slug>.md a brand truth of a declared kind
16
+ <slug>.md a brand truth without a kind
17
+ checks/ optional review assertions; never a node source
18
+ ```
19
+
20
+ Reserved at the root: `manifest.yml`, `glossary.md`, `materials/`, and
21
+ `checks/`. Every other `*.md` is a node.
22
+
23
+ ## Manifest
24
+
25
+ `manifest.yml` declares `schema`, `id`, and optionally `cover`. `cover` is a
26
+ node id. When present and resolved, `ghost gather` inlines that node above the
27
+ menu on every invocation. Use it for what selection cannot reliably retrieve:
28
+ essence, temperature, and brand-only refusals.
29
+
30
+ `ghost validate` enforces the cover contract: a missing referenced cover is an
31
+ error, an undeclared cover is a warning, and a cover body past the one-screen
32
+ budget (1500 bytes) is a warning.
33
+
34
+ ## Nodes
35
+
36
+ A node is markdown with frontmatter and a prose body:
37
+
38
+ ```markdown
39
+ ---
40
+ description: Logo lockups, clearspace, and when the glyph can stand alone.
41
+ materials:
42
+ - brand/logo*.svg
43
+ - https://figma.com/file/example?node-id=logo-lockups
44
+ ---
45
+
46
+ Use the full lockup when recognition matters.
47
+ ```
48
+
49
+ - Identity is the filename minus `.md`.
50
+ - Kind is the first dotted segment of the filename.
51
+ - `description` is the retrieval payload shown by `ghost gather`: what the node
52
+ governs, the observable condition under which it applies, and what it
53
+ contributes where useful. Avoid broad universal wording unless universal
54
+ retrieval is intended.
55
+ - `materials` accepts repo-relative paths/globs plus absolute HTTPS URLs. It is
56
+ a locator list, not guidance.
57
+
58
+ Ghost derives whether a node carries concrete material from structure:
59
+ non-empty `materials`, a fenced code block of at least 3 lines, or a
60
+ `## Skeleton` section. `gather` reports these payload labels for clarity; they
61
+ are not ranking signals.
62
+
63
+ ## Skeleton convention
64
+
65
+ A `## Skeleton` section contains the literal opening structure for a surface.
66
+ It should contain exactly one fenced block; `ghost validate` warns, never fails,
67
+ when a Skeleton section has zero or multiple fences.
68
+
69
+ ```markdown
70
+ ## Skeleton
71
+
72
+ ```tsx
73
+ <section>
74
+ <h1>{status}</h1>
75
+ <button>{nextStep}</button>
76
+ </section>
77
+ ```
78
+ ```
79
+
80
+ `ghost pull` extracts Skeleton fences and emits them dead last under a banner
81
+ instructing the agent to begin from that structure verbatim.
82
+
83
+ ## Checks
84
+
85
+ Checks live under `.ghost/checks/*.md` and are never gathered or pulled:
86
+
87
+ ```markdown
88
+ ---
89
+ name: logo-clearspace-holds
90
+ description: Logo usage preserves clearspace and lockup integrity.
91
+ severity: medium
92
+ references:
93
+ - asset.logo
94
+ probe: pnpm test:logo-clearspace
95
+ ---
96
+
97
+ Grade whether the change preserves the logo guidance in `asset.logo`.
98
+ ```
99
+
100
+ `references` are node ids with optional heading anchors. `probe` is optional: a
101
+ repo-root shell command that `ghost review` runs for offered checks by default
102
+ (timeout 30s; stdout/stderr truncated). Probe output is evidence only, never a
103
+ Ghost pass/fail verdict. Use `ghost review --no-probes` to skip. Trust model:
104
+ probes are the same class as npm scripts; Git review is the boundary.
105
+
106
+ ## Gather / Pull / Review
107
+
108
+ - `ghost gather` emits the cover above Available guidance, then coverage counts.
109
+ The guidance list is complete, unfiltered, and unranked. Checks are invisible.
110
+ - `ghost pull` emits selected nodes in steering order and inlines small local
111
+ materials. Binary local materials become inspect-pointers.
112
+ - `ghost review` matches diff files to local node materials, offers relevant
113
+ checks, embeds probe evidence, and emits a packet for the host agent to
114
+ judge.