diff --git a/COPY.md b/COPY.md index bea4a98a..15d37e9c 100644 --- a/COPY.md +++ b/COPY.md @@ -9,6 +9,42 @@ The canonical source for skilld's verbal identity. Pages, meta tags and registry from here; when a canonical string changes, change it here first, then propagate. A string that contradicts this file is a bug. +## Brand kit experiment register + +`/brand-kit/experiments` uses exploratory copy. It does not replace the approved tagline or homepage hero. +Use existing product nouns. Label illustrative states without implying measured results or automatic updates. + +- Brand kit: `Explore the visual stories behind skilld.` +- Experiment link: `Five brand experiments`. +- Experiment summary: `Session, bloat, freshness, provenance, and portability.` +- Badge summary: `A small mark that links a README to its Skill or Repository.` +- Experiment title: `Five ways to show what skilld solves.` +- Experiment description: `Each experiment starts with a product limit. These are exploratory visuals, not adopted brand assets.` +- Selectors: `Session`, `Bloat`, `Freshness`, `Provenance`, `Portability`. +- Theme controls: `Light mode`, `Dark mode`. + +| Experiment | Product limit | Review question | +| --- | --- | --- | +| Session | Run a Skill without keeping it. | Can the session boundary become a recognisable brand shape? | +| Bloat | Keep only the Skills you need. | Can a dense weave resolving into one thread show the cost of Skill bloat? | +| Freshness | The source can change while your copy stays still. | Can a visible change seam give watch its own visual language? | +| Provenance | Knowledge has a human source. | Can a continuous thread make source ownership visible? | +| Portability | The Skill stays the same when you change Agents. | Can one stable shape moving across contexts express independence? | + +Specimen strings: + +| Specimen | Heading and explanation | Controls and labels | +| --- | --- | --- | +| Session | `Knowledge for this session.` · `Run a Skill for the current session. Nothing lands in your repository.` | `End session`, `Run again`, `source`, `session`, `no files written`, `SKILL.md` | +| Bloat | `One task. One Skill.` · `Give this task one Skill. Install only what earns a place.` | `Focus one Skill`, `Show all Skills`, `one task · one Skill`, `what does this task need?`, `SKILL.md` | +| Freshness | `See when knowledge moves.` · `The source changes. Your local copy stays still. Watch makes the difference visible.` | `Hide differences`, `Show differences`, `Replay`, `Local copy`, `Illustrative source`, `Kept in your project`, `Changed at the source`, `Watch for changes` | +| Provenance | `Knowledge has an author.` · `A Skill reaches your Agent. The thread leads back to the person who wrote it.` | `Hide source thread`, `Trace the source`, `Replay`, `Your Agent`, `Read the Skill`, `Illustrative source`, `Written by a human.`, `The author keeps the source.`, `Source stays attached.`, `SKILL.md` | +| Portability | `Same Skill. Your Agent.` · `The Agent changes. The knowledge stays yours.` | `Change Agent`, `Claude Code`, `Codex`, `Cursor`, `One Skill`, `SKILL.md`, `skilld`, `{Agent} selected. Same SKILL.md.` | + +Freshness footnote: `Illustration only. Watching reports changes. It does not update your local copy.` +Provenance footnote: `Illustrative source. The thread represents authorship, not a safety claim.` +Accessible state descriptions name the same illustrated transition. They make no additional product claim. + ## Canonical assets Comparison navigation uses “Compare Humanizer, Stop Slop, and No AI Slop” on the homepage, writing track, and featured Skill pages. diff --git a/DESIGN.md b/DESIGN.md index c8703885..c3c5e857 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -68,6 +68,13 @@ components: ## Design Principles +### Brand kit experiments + +`/brand-kit/experiments` explores five product constraints through isolated visual specimens. +New shapes and motion there are exploratory exceptions, not adopted brand assets. +Keep warm stone, rose, readable labels, keyboard controls, and reduced-motion alternatives. +The homepage and shared components retain the existing identity rules. + ### 1. Quiet **"Confidence is quiet. The interface recedes; the content speaks."** diff --git a/app/components/brand-experiments/HumanProvenance.vue b/app/components/brand-experiments/HumanProvenance.vue new file mode 100644 index 00000000..f5c86214 --- /dev/null +++ b/app/components/brand-experiments/HumanProvenance.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/app/components/brand-experiments/KnowledgeFreshness.vue b/app/components/brand-experiments/KnowledgeFreshness.vue new file mode 100644 index 00000000..44ce3e8b --- /dev/null +++ b/app/components/brand-experiments/KnowledgeFreshness.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/app/components/brand-experiments/PortableKnowledge.vue b/app/components/brand-experiments/PortableKnowledge.vue new file mode 100644 index 00000000..7a24195c --- /dev/null +++ b/app/components/brand-experiments/PortableKnowledge.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/app/components/brand-experiments/SessionBoundary.vue b/app/components/brand-experiments/SessionBoundary.vue new file mode 100644 index 00000000..1554c308 --- /dev/null +++ b/app/components/brand-experiments/SessionBoundary.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/app/components/brand-experiments/SkillBloat.vue b/app/components/brand-experiments/SkillBloat.vue new file mode 100644 index 00000000..81134f6b --- /dev/null +++ b/app/components/brand-experiments/SkillBloat.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/app/pages/brand-kit/experiments.vue b/app/pages/brand-kit/experiments.vue new file mode 100644 index 00000000..1d859025 --- /dev/null +++ b/app/pages/brand-kit/experiments.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/app/pages/brand-kit/index.vue b/app/pages/brand-kit/index.vue new file mode 100644 index 00000000..e2651d3e --- /dev/null +++ b/app/pages/brand-kit/index.vue @@ -0,0 +1,36 @@ + + + diff --git a/nuxt.config.ts b/nuxt.config.ts index 5ceedb71..e18b778f 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -604,6 +604,8 @@ export default defineNuxtConfig({ // kit page and Nuxt made it a route. The page went indexable today, so the // empty sibling redirects instead of shipping next to it. '/brand-kit/_GithubBadgePreview': { redirect: { to: '/brand-kit/github-badge', statusCode: 301 } } as any, + '/brand-kit': { headers: { 'x-robots-tag': 'noindex, nofollow' } }, + '/brand-kit/experiments': { headers: { 'x-robots-tag': 'noindex, nofollow' } }, // 2026-08-22: llms-full.txt inlined every page's markdown into one 28.5 MB // file; agents truncate or time out on it. llms.txt now links each page's // .md (aiReady.llmsTxt.markdownLinks), so the dump redirects there. 302 so @@ -806,7 +808,7 @@ export default defineNuxtConfig({ // `/learn` index is a 55-word card list, noindex since 2026-08-22 // (GOOGLE_RECOVERY.md). Articles stay indexable and sitemap-listed; only // the bare index leaves. Global so no child sitemap can re-adopt it. - exclude: ['/learn'], + exclude: ['/learn', '/brand-kit', '/brand-kit/experiments'], sitemaps: { pages: { includeAppSources: true, diff --git a/test/a11y.spec.ts b/test/a11y.spec.ts index 097f0356..2c8e98ea 100644 --- a/test/a11y.spec.ts +++ b/test/a11y.spec.ts @@ -85,6 +85,23 @@ afterEach(() => { }) describe('accessibility: components', () => { + it.each([ + 'SessionBoundary', + 'SkillBloat', + 'KnowledgeFreshness', + 'HumanProvenance', + 'PortableKnowledge', + ])('brand experiment %s has no accessibility violations', async (name) => { + const container = createIsolatedContainer() + const wrapper = await mountSuspended( + await loadComponent(`brand-experiments/${name}`), + { attachTo: container }, + ) + const results = await runAxe(container) + expect(results.violations, formatViolations(results)).toHaveLength(0) + wrapper.unmount() + }) + it('appLogo has no violations', async () => { const container = createIsolatedContainer() const wrapper = await mountSuspended(