@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.
- package/LICENSE +201 -0
- package/README.md +89 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/checks-command.d.ts +9 -0
- package/dist/commands/checks-command.d.ts.map +1 -0
- package/dist/commands/checks-command.js +52 -0
- package/dist/commands/checks-command.js.map +1 -0
- package/dist/commands/command-discovery.d.ts +57 -0
- package/dist/commands/command-discovery.d.ts.map +1 -0
- package/dist/commands/command-discovery.js +220 -0
- package/dist/commands/command-discovery.js.map +1 -0
- package/dist/commands/errors.d.ts +7 -0
- package/dist/commands/errors.d.ts.map +1 -0
- package/dist/commands/errors.js +19 -0
- package/dist/commands/errors.js.map +1 -0
- package/dist/commands/export-command.d.ts +3 -0
- package/dist/commands/export-command.d.ts.map +1 -0
- package/dist/commands/export-command.js +157 -0
- package/dist/commands/export-command.js.map +1 -0
- package/dist/commands/fingerprint-commands.d.ts +10 -0
- package/dist/commands/fingerprint-commands.d.ts.map +1 -0
- package/dist/commands/fingerprint-commands.js +69 -0
- package/dist/commands/fingerprint-commands.js.map +1 -0
- package/dist/commands/gather-command.d.ts +3 -0
- package/dist/commands/gather-command.d.ts.map +1 -0
- package/dist/commands/gather-command.js +214 -0
- package/dist/commands/gather-command.js.map +1 -0
- package/dist/commands/init-command.d.ts +3 -0
- package/dist/commands/init-command.d.ts.map +1 -0
- package/dist/commands/init-command.js +89 -0
- package/dist/commands/init-command.js.map +1 -0
- package/dist/commands/manifest-command.d.ts +9 -0
- package/dist/commands/manifest-command.d.ts.map +1 -0
- package/dist/commands/manifest-command.js +33 -0
- package/dist/commands/manifest-command.js.map +1 -0
- package/dist/commands/pull-command.d.ts +3 -0
- package/dist/commands/pull-command.d.ts.map +1 -0
- package/dist/commands/pull-command.js +230 -0
- package/dist/commands/pull-command.js.map +1 -0
- package/dist/commands/pulse-command.d.ts +3 -0
- package/dist/commands/pulse-command.d.ts.map +1 -0
- package/dist/commands/pulse-command.js +248 -0
- package/dist/commands/pulse-command.js.map +1 -0
- package/dist/commands/review-command.d.ts +3 -0
- package/dist/commands/review-command.d.ts.map +1 -0
- package/dist/commands/review-command.js +78 -0
- package/dist/commands/review-command.js.map +1 -0
- package/dist/commands/skill-command.d.ts +3 -0
- package/dist/commands/skill-command.d.ts.map +1 -0
- package/dist/commands/skill-command.js +96 -0
- package/dist/commands/skill-command.js.map +1 -0
- package/dist/fingerprint.d.ts +5 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +3 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/ghost-core/catalog/assemble.d.ts +26 -0
- package/dist/ghost-core/catalog/assemble.d.ts.map +1 -0
- package/dist/ghost-core/catalog/assemble.js +29 -0
- package/dist/ghost-core/catalog/assemble.js.map +1 -0
- package/dist/ghost-core/catalog/closest.d.ts +16 -0
- package/dist/ghost-core/catalog/closest.d.ts.map +1 -0
- package/dist/ghost-core/catalog/closest.js +63 -0
- package/dist/ghost-core/catalog/closest.js.map +1 -0
- package/dist/ghost-core/catalog/index.d.ts +10 -0
- package/dist/ghost-core/catalog/index.d.ts.map +1 -0
- package/dist/ghost-core/catalog/index.js +9 -0
- package/dist/ghost-core/catalog/index.js.map +1 -0
- package/dist/ghost-core/catalog/menu.d.ts +28 -0
- package/dist/ghost-core/catalog/menu.d.ts.map +1 -0
- package/dist/ghost-core/catalog/menu.js +23 -0
- package/dist/ghost-core/catalog/menu.js.map +1 -0
- package/dist/ghost-core/catalog/types.d.ts +33 -0
- package/dist/ghost-core/catalog/types.d.ts.map +1 -0
- package/dist/ghost-core/catalog/types.js +2 -0
- package/dist/ghost-core/catalog/types.js.map +1 -0
- package/dist/ghost-core/check/index.d.ts +12 -0
- package/dist/ghost-core/check/index.d.ts.map +1 -0
- package/dist/ghost-core/check/index.js +12 -0
- package/dist/ghost-core/check/index.js.map +1 -0
- package/dist/ghost-core/check/lint.d.ts +9 -0
- package/dist/ghost-core/check/lint.d.ts.map +1 -0
- package/dist/ghost-core/check/lint.js +119 -0
- package/dist/ghost-core/check/lint.js.map +1 -0
- package/dist/ghost-core/check/load.d.ts +7 -0
- package/dist/ghost-core/check/load.d.ts.map +1 -0
- package/dist/ghost-core/check/load.js +44 -0
- package/dist/ghost-core/check/load.js.map +1 -0
- package/dist/ghost-core/check/parse.d.ts +12 -0
- package/dist/ghost-core/check/parse.d.ts.map +1 -0
- package/dist/ghost-core/check/parse.js +13 -0
- package/dist/ghost-core/check/parse.js.map +1 -0
- package/dist/ghost-core/check/source-ref.d.ts +27 -0
- package/dist/ghost-core/check/source-ref.d.ts.map +1 -0
- package/dist/ghost-core/check/source-ref.js +58 -0
- package/dist/ghost-core/check/source-ref.js.map +1 -0
- package/dist/ghost-core/check/types.d.ts +48 -0
- package/dist/ghost-core/check/types.d.ts.map +1 -0
- package/dist/ghost-core/check/types.js +4 -0
- package/dist/ghost-core/check/types.js.map +1 -0
- package/dist/ghost-core/errors.d.ts +30 -0
- package/dist/ghost-core/errors.d.ts.map +1 -0
- package/dist/ghost-core/errors.js +33 -0
- package/dist/ghost-core/errors.js.map +1 -0
- package/dist/ghost-core/glob.d.ts +5 -0
- package/dist/ghost-core/glob.d.ts.map +1 -0
- package/dist/ghost-core/glob.js +68 -0
- package/dist/ghost-core/glob.js.map +1 -0
- package/dist/ghost-core/glossary.d.ts +25 -0
- package/dist/ghost-core/glossary.d.ts.map +1 -0
- package/dist/ghost-core/glossary.js +69 -0
- package/dist/ghost-core/glossary.js.map +1 -0
- package/dist/ghost-core/index.d.ts +13 -0
- package/dist/ghost-core/index.d.ts.map +1 -0
- package/dist/ghost-core/index.js +19 -0
- package/dist/ghost-core/index.js.map +1 -0
- package/dist/ghost-core/markdown.d.ts +15 -0
- package/dist/ghost-core/markdown.d.ts.map +1 -0
- package/dist/ghost-core/markdown.js +30 -0
- package/dist/ghost-core/markdown.js.map +1 -0
- package/dist/ghost-core/material-transport.d.ts +43 -0
- package/dist/ghost-core/material-transport.d.ts.map +1 -0
- package/dist/ghost-core/material-transport.js +231 -0
- package/dist/ghost-core/material-transport.js.map +1 -0
- package/dist/ghost-core/materials.d.ts +14 -0
- package/dist/ghost-core/materials.d.ts.map +1 -0
- package/dist/ghost-core/materials.js +52 -0
- package/dist/ghost-core/materials.js.map +1 -0
- package/dist/ghost-core/node/index.d.ts +11 -0
- package/dist/ghost-core/node/index.d.ts.map +1 -0
- package/dist/ghost-core/node/index.js +11 -0
- package/dist/ghost-core/node/index.js.map +1 -0
- package/dist/ghost-core/node/parse.d.ts +16 -0
- package/dist/ghost-core/node/parse.d.ts.map +1 -0
- package/dist/ghost-core/node/parse.js +55 -0
- package/dist/ghost-core/node/parse.js.map +1 -0
- package/dist/ghost-core/node/schema.d.ts +17 -0
- package/dist/ghost-core/node/schema.d.ts.map +1 -0
- package/dist/ghost-core/node/schema.js +49 -0
- package/dist/ghost-core/node/schema.js.map +1 -0
- package/dist/ghost-core/node/serialize.d.ts +12 -0
- package/dist/ghost-core/node/serialize.d.ts.map +1 -0
- package/dist/ghost-core/node/serialize.js +39 -0
- package/dist/ghost-core/node/serialize.js.map +1 -0
- package/dist/ghost-core/node/steering.d.ts +19 -0
- package/dist/ghost-core/node/steering.d.ts.map +1 -0
- package/dist/ghost-core/node/steering.js +68 -0
- package/dist/ghost-core/node/steering.js.map +1 -0
- package/dist/ghost-core/node/types.d.ts +43 -0
- package/dist/ghost-core/node/types.d.ts.map +1 -0
- package/dist/ghost-core/node/types.js +2 -0
- package/dist/ghost-core/node/types.js.map +1 -0
- package/dist/ghost-core/package-manifest.d.ts +19 -0
- package/dist/ghost-core/package-manifest.d.ts.map +1 -0
- package/dist/ghost-core/package-manifest.js +24 -0
- package/dist/ghost-core/package-manifest.js.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts +28 -0
- package/dist/ghost-core/skill-bundle-loader.d.ts.map +1 -0
- package/dist/ghost-core/skill-bundle-loader.js +51 -0
- package/dist/ghost-core/skill-bundle-loader.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/init-payloads/median/cliche.median.md +86 -0
- package/dist/init-payloads/median/median-tells.md +117 -0
- package/dist/init-payloads/skeleton/brand.md +23 -0
- package/dist/init-payloads/skeleton/context.conversation.md +24 -0
- package/dist/init-payloads/skeleton/foundation.color.md +39 -0
- package/dist/init-payloads/skeleton/foundation.composition.md +30 -0
- package/dist/init-payloads/skeleton/foundation.controls.md +29 -0
- package/dist/init-payloads/skeleton/foundation.layout.md +45 -0
- package/dist/init-payloads/skeleton/foundation.motion.md +34 -0
- package/dist/init-payloads/skeleton/foundation.type.md +44 -0
- package/dist/init-payloads/skeleton/foundation.voice.md +29 -0
- package/dist/init-payloads/skeleton/glossary.md +39 -0
- package/dist/init-payloads/vessel-light/anti-goal.median.md +86 -0
- package/dist/init-payloads/vessel-light/anti-goal.tells.md +38 -0
- package/dist/init-payloads/vessel-light/checks/conversation-grammar.md +20 -0
- package/dist/init-payloads/vessel-light/checks/median-tells.md +103 -0
- package/dist/init-payloads/vessel-light/checks/motion-restraint.md +20 -0
- package/dist/init-payloads/vessel-light/checks/relationships.md +33 -0
- package/dist/init-payloads/vessel-light/checks/shape-matches-job.md +43 -0
- package/dist/init-payloads/vessel-light/checks/values.md +51 -0
- package/dist/init-payloads/vessel-light/glossary.md +44 -0
- package/dist/init-payloads/vessel-light/grammar.color-roles.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.conversation.md +30 -0
- package/dist/init-payloads/vessel-light/grammar.deletion.md +35 -0
- package/dist/init-payloads/vessel-light/grammar.hierarchy.md +58 -0
- package/dist/init-payloads/vessel-light/grammar.job.md +54 -0
- package/dist/init-payloads/vessel-light/grammar.motion.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.rhythm.md +27 -0
- package/dist/init-payloads/vessel-light/grammar.surfaces.md +35 -0
- package/dist/init-payloads/vessel-light/index.md +33 -0
- package/dist/init-payloads/vessel-light/manifest.yml +3 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Black.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Bold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-ExtraBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Light.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Medium.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-Regular.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/fonts/HKGrotesk-SemiBold.woff2 +0 -0
- package/dist/init-payloads/vessel-light/materials/primitives.css +351 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.conversation.html +63 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.editorial.html +74 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.form.html +89 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.overlay.html +66 -0
- package/dist/init-payloads/vessel-light/materials/ref/composition.table.html +104 -0
- package/dist/init-payloads/vessel-light/materials/ref/email.html +80 -0
- package/dist/init-payloads/vessel-light/materials/tokens.css +191 -0
- package/dist/init-payloads/vessel-light/register.data-density.md +39 -0
- package/dist/init-payloads/vessel-light/register.editorial.md +41 -0
- package/dist/init-payloads/vessel-light/register.email.md +43 -0
- package/dist/init-payloads/vessel-light/signature.palette.md +45 -0
- package/dist/init-payloads/vessel-light/signature.shape.md +27 -0
- package/dist/init-payloads/vessel-light/signature.temperature.md +44 -0
- package/dist/init-payloads/vessel-light/signature.type.md +37 -0
- package/dist/internal/fs.d.ts +4 -0
- package/dist/internal/fs.d.ts.map +1 -0
- package/dist/internal/fs.js +24 -0
- package/dist/internal/fs.js.map +1 -0
- package/dist/observability-events.d.ts +34 -0
- package/dist/observability-events.d.ts.map +1 -0
- package/dist/observability-events.js +68 -0
- package/dist/observability-events.js.map +1 -0
- package/dist/package-version.d.ts +3 -0
- package/dist/package-version.d.ts.map +1 -0
- package/dist/package-version.js +10 -0
- package/dist/package-version.js.map +1 -0
- package/dist/review/baseline.d.ts +11 -0
- package/dist/review/baseline.d.ts.map +1 -0
- package/dist/review/baseline.js +35 -0
- package/dist/review/baseline.js.map +1 -0
- package/dist/review/diff.d.ts +7 -0
- package/dist/review/diff.d.ts.map +1 -0
- package/dist/review/diff.js +41 -0
- package/dist/review/diff.js.map +1 -0
- package/dist/review/glob.d.ts +2 -0
- package/dist/review/glob.d.ts.map +1 -0
- package/dist/review/glob.js +2 -0
- package/dist/review/glob.js.map +1 -0
- package/dist/review/probes.d.ts +13 -0
- package/dist/review/probes.d.ts.map +1 -0
- package/dist/review/probes.js +45 -0
- package/dist/review/probes.js.map +1 -0
- package/dist/review/resolve.d.ts +28 -0
- package/dist/review/resolve.d.ts.map +1 -0
- package/dist/review/resolve.js +90 -0
- package/dist/review/resolve.js.map +1 -0
- package/dist/review/review-packet.d.ts +41 -0
- package/dist/review/review-packet.d.ts.map +1 -0
- package/dist/review/review-packet.js +128 -0
- package/dist/review/review-packet.js.map +1 -0
- package/dist/scan/check-files.d.ts +23 -0
- package/dist/scan/check-files.d.ts.map +1 -0
- package/dist/scan/check-files.js +75 -0
- package/dist/scan/check-files.js.map +1 -0
- package/dist/scan/check-scaffold.d.ts +8 -0
- package/dist/scan/check-scaffold.d.ts.map +1 -0
- package/dist/scan/check-scaffold.js +53 -0
- package/dist/scan/check-scaffold.js.map +1 -0
- package/dist/scan/constants.d.ts +21 -0
- package/dist/scan/constants.d.ts.map +1 -0
- package/dist/scan/constants.js +21 -0
- package/dist/scan/constants.js.map +1 -0
- package/dist/scan/file-kind.d.ts +12 -0
- package/dist/scan/file-kind.d.ts.map +1 -0
- package/dist/scan/file-kind.js +114 -0
- package/dist/scan/file-kind.js.map +1 -0
- package/dist/scan/fingerprint-package-lint.d.ts +8 -0
- package/dist/scan/fingerprint-package-lint.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-lint.js +284 -0
- package/dist/scan/fingerprint-package-lint.js.map +1 -0
- package/dist/scan/fingerprint-package-loader.d.ts +5 -0
- package/dist/scan/fingerprint-package-loader.d.ts.map +1 -0
- package/dist/scan/fingerprint-package-loader.js +78 -0
- package/dist/scan/fingerprint-package-loader.js.map +1 -0
- package/dist/scan/fingerprint-package.d.ts +66 -0
- package/dist/scan/fingerprint-package.d.ts.map +1 -0
- package/dist/scan/fingerprint-package.js +101 -0
- package/dist/scan/fingerprint-package.js.map +1 -0
- package/dist/scan/index.d.ts +3 -0
- package/dist/scan/index.d.ts.map +1 -0
- package/dist/scan/index.js +3 -0
- package/dist/scan/index.js.map +1 -0
- package/dist/scan/lint.d.ts +15 -0
- package/dist/scan/lint.d.ts.map +1 -0
- package/dist/scan/lint.js +2 -0
- package/dist/scan/lint.js.map +1 -0
- package/dist/scan/node-files.d.ts +25 -0
- package/dist/scan/node-files.d.ts.map +1 -0
- package/dist/scan/node-files.js +112 -0
- package/dist/scan/node-files.js.map +1 -0
- package/dist/scan/package-paths.d.ts +10 -0
- package/dist/scan/package-paths.d.ts.map +1 -0
- package/dist/scan/package-paths.js +49 -0
- package/dist/scan/package-paths.js.map +1 -0
- package/dist/scan/packed-payloads.d.ts +4 -0
- package/dist/scan/packed-payloads.d.ts.map +1 -0
- package/dist/scan/packed-payloads.js +55 -0
- package/dist/scan/packed-payloads.js.map +1 -0
- package/dist/scan/tarball.d.ts +23 -0
- package/dist/scan/tarball.d.ts.map +1 -0
- package/dist/scan/tarball.js +145 -0
- package/dist/scan/tarball.js.map +1 -0
- package/dist/scan/templates.d.ts +42 -0
- package/dist/scan/templates.d.ts.map +1 -0
- package/dist/scan/templates.js +375 -0
- package/dist/scan/templates.js.map +1 -0
- package/dist/skill-bundle/SKILL.md +146 -0
- package/dist/skill-bundle/references/adapting-a-starter.md +104 -0
- package/dist/skill-bundle/references/authoring-scenarios.md +184 -0
- package/dist/skill-bundle/references/blocks.md +179 -0
- package/dist/skill-bundle/references/brief.md +50 -0
- package/dist/skill-bundle/references/capture.md +392 -0
- package/dist/skill-bundle/references/concrete-tiers.md +95 -0
- package/dist/skill-bundle/references/recall.md +36 -0
- package/dist/skill-bundle/references/schema.md +114 -0
- package/dist/skill-bundle/references/self-check.md +65 -0
- package/dist/skill-bundle/references/steering-audit.md +60 -0
- 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.
|