Brand Layer · History
Changelog
Every release of Brand Layer, newest first. Open a row to see what changed and why it mattered.
- Releases
- 50
- Entries
- 262
- Since
- 27.05.2026
Each card on /presentations opens a technical spec dialog like the social layouts: slots, measured geometry, type roles, colours, footer furniture and how to place the text.
web`PresentationSpec` dialog per slide type: intent, limits, never omitted, slot table, geometry table with repeats and measured variant, type roles used, colour roles, footer furniture, text placement, example images and copy spec. Unmeasured types explain how to build instead of an empty table.
content`four-columns` gains its measured card bullet box.
The 16:9 presentation catalog reaches every agent lane with a technical spec per slide type: the 1920x1080 canvas and its type scale from the design source, slots, a must list for all 43 types and measured geometry for 30 of them. Agents no longer derive a deck from the social canvas.
content`presentations.md` gains the measured deck canvas (padding 50, 21 type roles, spacing, colour roles, footer) and, per slide type, `slots`, `must`, `verified` and absolute geometry where the design source is a live layout.
mcp`list_presentation_slides` plans a deck from intent, density and limits; `get_presentation_slide` returns the canvas, or one slide type's slots, must list and boxes. 21 tools.
surfaces`/presentations.json`, a `presentations` block in `/brand.json`, a section in `/llms.txt` and `/llms-full.txt`, every example image in the asset index, and `presentations.md` plus `presentations.json` in `/bundle.zip`. 16 surfaces.
checks`brand:check` validates every presentation type role, fill, slot, variant and box against the canvas.
agentsThe orchestrator skill and the deck intake route a 16:9 deck to the presentation catalog instead of deriving it from the 1080 canvas. The connect prompt and the Gem instructions name it.
webEach card on `/presentations` opens its technical spec with a copy button. The enlarged view fills the screen. The 1080 catalog page is renamed Social layouts.
Every example image on /presentations is now a full 1920 by 1080 export from the design source instead of a 960 by 540 preview.
contentThe 60 images under `public/brand/presentations/` are re-exported at 1920 by 1080 from the design source. File names and ids are unchanged.
A new Presentations page under Design system lists the 16:9 GALTON deck system: 43 slide types in six categories, each with its intent, density, when to use it and the limits it never breaks, plus an example image for every variant. Agent lanes follow in a later release.
content`content/brand/presentations.md` holds the deck rules, the canvas surfaces, six categories and 43 slide types with 60 example images under `public/brand/presentations/`. Geometry is marked as not measured yet.
web`/presentations` shows the catalog with a category filter, a variant switcher on each card and an enlarged view of every example.
The sound library reaches every agent lane. A new MCP tool, a /sound.md surface and sound sections in llms.txt, llms-full.txt, brand.json and the orchestrator skill tell an agent which GALTON track to use for a film, a reel or an event, and where to hotlink it. The offline package drops back to its old size.
mcp`get_sound_guide` returns every track with an absolute MP3 URL, its length, tempo and vocals, the track for each job, the four rules and the 60 second film anatomy. Pass `id` for one track. Waveform peaks stay on the page. `search_design` now searches the sound library too.
surfaces`/sound.md` serves the sound library source. `/brand.json` gains a `sound` block, `/llms.txt` a Sound branding section and an entry under Optional, and `/llms-full.txt` the whole source plus every track in its asset index.
agentsThe orchestrator skill routes video, reels, presentations, events and demos to `get_sound_guide`. The connect prompt and the Gem instructions name the sound library.
docsThe tool count is 19 and the surface count 15 in AGENTS.md, CLAUDE.md, the README and /architecture.
bundle`/bundle.zip` had mirrored all 14 tracks (47 MB) since 2.18.0. Only tracks marked `offline: true` in sound.md ship now, the sound logo for GALTON; the rest are listed by URL, and START-HERE.md says so. MP3 and WAV are stored, not deflated.
The GALTON audio identity gets its own page under Voice: fourteen tracks with a player, a waveform and a download each, and a timeline that shows how they fit a real edit. The home page hero now introduces Brand Layer itself.
content`content/brand/sound.md` describes the sound library: 14 assets in three groups, the 120 BPM house tempo, four rules, a pick-by-job table and a 60 second film anatomy. The MP3 files live in `public/brand/sound/`.
tooling`npm run sound:peaks` measures every file with ffmpeg and writes durations plus 240 RMS peaks to `sound.peaks.json`, so no length or waveform on the page is typed by hand.
site/sound-branding, under Voice in the header. One shared player drives a console with a live radial spectrum, a bar-gridded seekable waveform, a bar and beat counter, loop, volume and keyboard shortcuts; a tracklist with seekable waveforms and downloads; and a floating dock once the console scrolls away.
siteThe How to use it block draws the example film as an edit timeline with the real anthem waveform ducking under the voice, a pick-by-job list that plays through the same player, and the four rules.
siteThe home hero reads "Your brand, read by every AI." with the eyebrow Brand Layer by GALTON Brands, a new lead, and the version and date under the calls to action. Examples moved to the end of the header menu.
siteSection eyebrows use a middle dot instead of an em dash (`01 · Sound library`) on every page.
A Gem given the measured geometry still described slides instead of producing them, because nobody told it what a visual should come out as. In Gemini it should come out as one HTML document, which Canvas renders live. Written down after a real run produced on-brand slides from the catalog's own numbers.
agentsThe Gem instructions gain a visuals section: build a slide, poster or carousel as one self-contained HTML document on the catalog's default canvas, embed the brand webfont, take every colour from the tokens, and anchor bottom-anchored boxes by `fromBottom` so a three-line headline grows upward instead of through the footer rule. The canvas size is read from the layout catalog, not written in.
agentsThe Gem recipe on /agents documents the two settings that matter: leave **Default tool** on No default tool so Canvas stays per-request, and keep **Disable Knowledge Citations** off until you have seen the Gem quote the file. Canvas belongs to a slide, not to a question about a colour.
agentsFor anything that is not a visual, the instructions now say plainly that plain text is the answer, so the Gem stops reaching for HTML because a topic sounds visual.
llms-full.txt exists for readers with no MCP and no way to fetch a URL. It is built by concatenating source files written for readers who have both, and nobody reconciled the two. Twenty-two times it named a tool the reader cannot call, and once it promised that a tool would compute the geometry, which in this lane nothing does.
agentsThe header now carries a generated translation table: every tool name and sibling filename the sources mention, mapped to the section of this file that holds it. Generated from the sections that exist, so a brand without layouts gets no layout row. The prose stays verbatim, which keeps the bundle identical to the surfaces it quotes.
layoutsThe ratio note said "MCP resolves this for you". Off MCP nothing resolves it, and the same note forbids scaling, so any request for the square canvas hit a wall. It now points at the four rules printed directly above it, which were always enough, and still says MCP does it for you when MCP is there.
agentsThe BRAND GUIDE section is titled "identity, voice, logo policy" and carried no logo policy. It does now. The fallback protocol's first step named two MCP tools as the way to look something up; it names the tables in the spec first.
agentsThe size claim was wrong by half: the guides said ~135 KB / ~34k tokens for a file that had grown to 240 KB / 61k when the layout catalog did. `/llms.txt` now measures it per request, and the bundle states its own size in its header, so the number cannot go stale again.
The Gem instructions open with the fact that they are useless without the Knowledge file. That file was two clicks away, up a page the reader had already scrolled past.
agentsThe Gem dialog's footer now carries `llms-full.txt` itself: a download link beside the line telling you to upload it. The instruction and the thing it asks for are finally in the same place.
The Gemini recipe told you to paste the connect-and-remember prompt into a Gem. That prompt leads with an MCP server and a list of URLs, and a Gem can reach neither. It was the one place on the page where the instructions could not do what they said.
agentsA purpose-built Gem, generated from the brand and structured the way Google asks for Gem instructions: persona, what it knows, the rules it never breaks, how to answer, and what to do when the file falls short. It says outright that it cannot browse, so the Gem stops trying to fetch and then guessing.
agentsAn **Open the Gemini Gem** button in the recipe opens the whole thing in a dialog, formatted, with a character count and one-click copy. The preview shows the text exactly as it is copied, character for character, so nothing you read is missing from the paste.
agentsThe Gem is derived, not written: rules, prohibitions, locked values, guided-mode defaults and go-words all interpolate from `content/brand/`, so another brand gets its own Gem with no edit. Prohibitions are quoted verbatim rather than rephrased, which matters on a brand that authors them in its own language.
Every connector guide on /agents was re-verified against the vendors' own docs, a month after the last pass. Four claims had gone wrong, and one of them was telling people to do something OpenAI had switched off three weeks earlier.
agentsMicrosoft 365 Copilot chat moves from "no MCP" to limited: federated MCP connectors reached Copilot Chat, Excel and Researcher in spring 2026 through Copilot Studio, though invocation stays up to Copilot's orchestrator. The Gemini consumer app stays a no, and now says why: custom Connected Apps exist but are Spark-only and partnership-only.
agentsSmaller corrections: the JetBrains **As JSON** control sits behind the dialog's Command dropdown, Cline falls back to SSE and answers 405 when `type` is omitted, and GPT-6 Astra shipped above the GPT-5.6 tiers on 3 Sep 2026. Gemini CLI, Antigravity, Kimi Code, Zed, Cursor, Windsurf, VS Code and Claude Code re-verified unchanged.
agentsOpenAI restricted creating new Custom GPTs to Business, Enterprise and Edu workspaces on 16 Aug 2026. The recipe still offered it to any paid plan. Free, Go, Plus and Pro keep the GPTs they already own; for a new one they now need the developer-mode MCP app or the upload path.
agentsClaude moved custom connectors out of Settings: it is **Customize > Connectors > + > Add custom connector**, and on Team or Enterprise an Owner uses **Organization settings > Connectors > Add > Custom > Web**. One connector now covers Claude, Desktop and Cowork.
agentsThe ChatGPT note claimed Plus and Pro were limited to read-only custom apps. Developer mode gives them full MCP tool support; the plan split described an older beta. Every tool here is read-only regardless.
agentsMistral renamed Le Chat to Vibe on 28 May 2026 and folded the assistant into Work Mode. Perplexity's path is now Account settings, with a risk checkbox, an Enterprise admin toggle and an org-sharing step that were all missing.
Every way in until now asked the reader to set something up: add an MCP server, paste a URL, upload a file, unzip a folder. The clients that most need this brand cannot do the first one at all, so they were paying an upload that goes stale. A page can now hand its tools straight to an agent looking at it.
agentsLane D: every page registers ten of the brand tools on `document.modelContext` (WebMCP, the W3C proposal Chrome and Edge run as an origin trial). An agent built into the browser gets the real design system with nothing to configure. Where WebMCP is missing, nothing registers and nothing breaks.
agents`/api/tool`: the same tools over plain HTTP. GET returns the catalog with a JSON Schema per tool, POST runs one. It is what the in-page lane calls, and it works for any client that can fetch a URL but cannot speak MCP.
agentsA live readout on /agents: the card says whether this browser took the tools, so a reader can tell setup-free access from silence. `NEXT_PUBLIC_WEBMCP_ORIGIN_TRIAL` carries the per-origin trial token.
tooling`npm run webmcp:test`: launches a throwaway headless Chrome with WebMCP enabled and checks lane D end to end, on a page that is not /agents. A stub written from the spec passed while the real browser failed every call, so the browser is the test.
tooling`NEXT_DIST_DIR` overrides the build output directory. `next dev` and `next build` both own `.next`, so proving the production build is clean used to mean taking the dev server down. Now it does not.
architectureThe access-lane invariant is now five lanes, not four, and the lanes diagram, /architecture, AGENTS.md, CLAUDE.md and README say so. The tool definitions are not duplicated: the browser lane replays the same registrations the MCP server uses, so the two cannot drift.
tooling`.vercelignore` keeps an alternate local build output out of the deploy. Vercel ignores `.next` by default and knew nothing about `NEXT_DIST_DIR`, so a leftover build directory went up with the upload and blew the 100 MB file limit.
The brand runs two domains and the record only knew one, so the slide furniture said galton.sk while every generated example signed off galtonbrands.com.
brand`identity.websiteByLanguage` in brand.md: galton.sk for Slovak copy, galtonbrands.com for English copy, galton.sk as the default. Guidance, not a rule, and galton.sk stays the primary domain.
layouts`canvas.furniture.url.byLanguage` carries the same map for slides. The domain follows the language of the copy on the slide, not the audience or the channel. One domain per slide, and one across a carousel.
layoutsThe reference SVGs signed off galtonbrands.com on every layout, including the ones whose placeholder copy is Slovak. Each layout now signs off the domain its own copy calls for, which moves profile, statement, cover-image, statement-cta, step-numeral, title-image, person-round, person-image, event-speaker, event-panel and recruitment to galton.sk.
The catalog held five slide layouts and the design source had grown a board of twenty four more. Every one of them was measured and written down, and the reference SVG for each is now generated from those numbers rather than drawn by hand.
layouts21 layouts measured off the "Autolayouts 2" board: cover-image, cover-image-half, statement-cta, step-numeral, title-image, rule-list, person-round, person-image, graphic-statement, body-cta, bullets-logo, compare-columns, body-payoff, steps-numbered, steps-arrow, definitions-stack, event-speaker, event-panel, recruitment, partnership, guide-cover.
layoutsSeven type roles the five base layouts never needed: display 150, title 120, section 80, lead 50, body 40, meta 30 and the numeral, which is the one place GALTON Thin is used and the one piece of type that is always the accent. A box may now carry its own `size` when a layout sets one the shared role does not.
layoutsThree pieces of furniture: the pill in its filled and outlined finishes, the 48px corner mark, and a supplied logo in the header band. Three header ids (wordmark-center, partner-logo, none) and a footer id (none) for the layouts that deliberately close on a pill instead of the rule.
layoutsEight carousel recipes built from the new layouts: process-carousel, framework-carousel, guide-carousel, speaker-post, panel-post, partnership-post, recruitment-post and team-post.
scriptsbuild-layout-pngs.mjs rasterises a reference SVG to its example PNG. It is a fallback: it skips any layout that already ships a PNG exported from the design source, because the export carries the real photography the SVG only marks as a placeholder. Name a layout to overwrite it deliberately.
layoutsEvery new layout ships its example PNG exported from the design source at 1080x1350, so the gallery shows the real slide rather than a placeholder render. The 21 exports are quantised, which holds the whole example set at 5.3 MB instead of 15.1 MB.
scriptsbuild-layout-svgs.mjs reads the catalog as YAML rather than with a line reader that could not survive a nested colour map, and draws the 21 editorial layouts from one generic driver instead of a function each. The five base layouts keep their hand-written functions and their SVGs are byte-identical.
/architecture was checked by a script for names and paths, not for its sentences, and it explained the repository as much as the system.
architectureThe `brand.css` surface note and the role of the file that builds it name the component classes, the light scope and the responsive queries.
architectureBoth check scripts describe what they check. `brand:check` gained four validators and a rule-copy detector; `style:check` ratchets three characters.
architectureStack trimmed from 14 dependencies in four groups to 9 in three, with roles that describe the system rather than the repository. Invariants from six to four: the two about `content/` and `force-dynamic` were about the codebase.
changelogEntries rewritten as a technical record. The six releases from 2.10.0 carried 62 narrative entries averaging 300 characters; they average 170 now and state the fact rather than the story. `changelog:check` warns when an entry runs long.
architectureThe data-flow diagram said 10 pages and 13 routes; there are 11 and 14. All three counts are read from the same lists the router and the page use.
architectureEight MCP tool descriptions predated 2.10: `get_brand_overview` omitted the text system and the light surface, `get_design_spec` claimed to return the document rather than the index, `get_layout` summaries and a whole canvas rather than ids and a slice, `get_agent_rules` the fallback contract rather than the protocol, `get_component` said nothing about the light rendering.
architectureDropped the "What lives where" section, the tools table's file column and the file names in the data-flow diagram. Page copy 17.2 kB to 10.8 kB, with no repository path left in it.
The single-file lane was a row of download chips with no description and no stated relationship, so "does llms-full.txt already contain the rest" had no answer on the page.
agentsThe single-file section is a list: one line per file saying what it is, a Download, and a Preview that opens the file in place with copy-to-clipboard, size, URL and download. The preview fetches on open; the largest file is 175 kB.
agentsThe list states what is already inside `llms-full.txt`, measured against the served files: `intake.md`, `design.md`, `verbal-identity.md` and `linkedin.md` verbatim, plus the layout catalog, the icon library and the asset URLs. The other three are the same brand in another shape. The sentence naming them is derived from the same list.
agentsThe skill routes rather than teaches: six of seventeen rows were about slides, several re-explaining what the layout payload carries as data. Four rows now.
agentsThe skill contains no em dash and no arrow. It told agents that copy carries neither while using both eleven times.
agentsThe skill measured the design spec instead of quoting a hard-coded "~70 KB". It also stopped restating the text-colour rule in a table cell, and hard rule 2 describes what `get_agent_rules` returns after 2.11.1.
promptsprompts.md keeps no copy of the brand rules. Eight of its ten principles were hand-copied from `agentPrompts.rules` and two had drifted a release behind. It keeps the two about writing a prompt; the page appends the rest from the source. No two content files share a twelve-word span.
Audit of every shipped document, offline package first. The package is clean: 139 files, all digests correct, byte-identical to the network, 144 links with none dead. Four claims did not hold.
llms`llms.txt` lists `integrity.json`. Only the offline package pointed at it, so the URL lane had no way to verify what it read.
docsThe `brand.css` blurb, in three places, predated the `.bl-light` scope and the responsive type queries.
brand`fallback.protocol`, two agent rules and two self-check items reproduced the case and never-invent rules word for word. All five point at their container.
checks`brand:check` compares text, not topic: any string reproducing an eight-word span of a canonical rule without naming its container is reported. `criticalRule` and `description` are exempt.
assets`ASSET-INDEX.md` lists 122 of 122 files. It was built from declared assets while the package mirrors the whole directory, so seven shipped unlisted: five layout example images and the two wordmark lockups design.md names as the formal and print variant.
docsThe package described `llms.txt` as carrying sizes. It carries a token estimate for three long documents.
Second audit pass against live 2.11.0: three wrong statements, one of them shipped by 2.11.0, and the four largest repeated payloads. A five-slide carousel drops from 76 kB to 51 kB.
layouts`get_layout` ships `typeRules` beside the canvas. `canvas.type` is six bare roles otherwise, and the sentence naming the system was a YAML comment.
checks`brand:check` warns when a string claims something a rule container owns without naming it.
docsAGENTS.md carries the rule index: each rule kind, its one container, the tool that projects it. 170 rule statements across 20 containers had no map.
brand`typeScale.note` says what typeScale is: the manual's leading reference, sizes illustrative, ratios the web ones. It claimed to be the slide reference.
brand`typeRules.responsive` scopes the desktop-step rule to web tokens; slide sizes are absolute.
checks`arch:check` matches the shape of a count claim across AGENTS.md, CLAUDE.md and README.md, and checks resources and prompts. It matched two exact sentences before, so a heading reading "Tools (16" passed for two releases.
layouts`get_layout { id }` returns the canvas sliced to what the layout references: its surface, the type roles and furniture its boxes name, the box model. The legends, `ratioAdaptation`, the composition model and the image treatment stay in the argument-free call. 13.4 kB to 7.9 kB per layout. `canvas: 'full'` restores it.
mcp`get_agent_rules` carries rules, not values: the fallback primitives (same as `get_fallback`) and the 1.5 kB aiBrief (same as `get_voice_guide`) are pointers now. 11.0 kB to 9.7 kB.
agentsThe skill no longer restates the nine-step intake protocol, the own-questions boundary and the report example. 14.8 kB to 11.4 kB. It keeps the defaults table, the locked list and the self-check.
brandFive hand-written restatements of the solid-text rule became references to `colorRules.text`.
layoutslayouts.md keeps no copy of the brand colours. `canvas.colors` was `black` / `white` / `yellow` against design.md's `canvas` / `ink` / `primary`, linked only by a "keep in sync" comment. Every colour there is a `{colors.*}` ref resolved at load.
brand`colorRules.onLight` and the slide surface contract point at the `lightSurface` map instead of restating parts of it.
mcp`get_brand_overview` returns one `voice` object instead of `voiceRule`, `voiceEssence`, `voiceHardRules`, `voiceLanguageRule`.
checks`style:check` ratchets the arrow and the ellipsis alongside the em dash, over components, routes and config as well as content. Found 99 arrows and 31 ellipsis characters, 40 arrows in design.md.
brand`typeRules.domains` named two type systems; there are three. A slide headline is `canvas.type` 100px, not `typeScale` 80px. All three named, with what each is for.
branddesign.md `description` said everything is Sentence case and hierarchy is not uppercase, next to a critical rule making H1 and H2 UPPERCASE. It is the first prose in get_brand_overview, brand.json and llms.txt.
docsAGENTS.md said 16 tools and README 17; there are 18. The icon library is three families, not two.
docsRoot `todo.md` moved to `docs/2026-07-22-audit-v2.0.md`. It was a shipped v2.0 audit, 492 lines, still named as a to-do list and still saying 16 tools.
Sixteen findings from 40 live calls against 2.10.0. All the same shape: two representations of one thing, with no link between them in the data.
guided-mode`deck.ratio` and `poster.format` say that 16:9, 4:3 and A3 have no measured geometry and must be derived from the canvas rules. New route-table row for it.
brandNew `lightSurface` map: which colour roles change on a light canvas, which do not, and why. brand.css emits it as a `.bl-light` scope; `get_component` returns the per-component `changes`. Before this, `.bl-card` on white was `rgba(255,255,255,0.04)`.
checks`brand:check`: every non-enum slot resolves to a box or declares `within`; every guided-mode canvas value exists in `layouts.ratios`; the solid-text test also runs over the light-surface overrides.
brandResponsive type ladder is data: `responsive` map per token plus a `breakpoints` block. It lived in a YAML comment, so mobile and tablet sizes reached no surface. brand.css emits the media queries.
brandNew `typeRules` block (`domains`, `responsive`, `case`), attached to every type payload. `typeScale` Headline is 80px and `typography.headline` is 64px, with nothing saying which is which.
layouts`canvas.metrics.verified` defines what `verified` means. It shipped on all five layouts and was documented nowhere, so `type: false` read as a warning.
brandchart.rules states that `axis` and `label` are the same solid value on purpose.
agentsRoute-table row for a deck, which is not the same thing as the 1080-wide carousel layouts.
voiceNew `languageRule` in verbal-identity.md: write in the user's language, Slovak when unstated. It was step 9 of the intake protocol, two calls from the voice.
brandA link on a light surface is ink, not the accent. Yellow on white is approved for large marks only.
brandOne domain: the slide footer prints galton.sk, matching `identity.website`. It printed galtonbrands.com.
mcpOne `resolved` shape. `get_fallback` used `resolvedColors` and left `radius` unresolved, `get_agent_rules` resolved nothing, `get_chart_palette.resolved` omitted `semantic`.
mcp`get_brand_overview` returns sections as `{id, title}`. It returned titles while `get_section` takes ids.
mcp`essentials.text.classes` is an array plus a `stylesheet` field, not one space-joined string.
layoutsEvery layout slot resolves to the geometry that draws it. `profile` offered `tag`, `photo`, `people` and had boxes named `tagPill`, `photoSafeArea`, `person1Name`. Boxes carry `slot:` when the key differs; a slot that is a treatment carries `within:`; `canvas.metrics.slotMapping` states the rule.
guided-mode`social.canvas` default was `"1080x1350 portrait"`, which `get_layout` rejects. Defaults are now the bare ratio; the wording moved to the note.
brand`agentPrompts.rules[0]` was an unquoted YAML scalar with a colon, so it parsed as a mapping and `get_agent_rules` returned nine strings and one object. Quoted, and `brand:check` now fails a mixed array.
assetsAsset group id `icons` (three favicons) renamed to `favicons`; `list_assets` says the icon library is `list_icons`.
brandRemoved the stale `1.125rem -> 1.5rem` ladder on `typography.label`. Form labels are 18px at every breakpoint.
Text colour rules reach the agent. They were written four times in design.md prose and still missed, because brand.css, list_tokens and get_brand_overview hand over values and nothing else.
brandNew `colorRules` block in design.md frontmatter: `text` (solid only), `alpha` (surfaces, lines, chart marks), `onLight`. Data, not a YAML comment, which the parser drops.
mcp`colorRules` attached to every colour payload: `get_brand_overview.essentials.text`, `list_tokens` (category, `ref`, `refs`), `get_agent_rules`, `get_chart_palette`.
brandNew `text` component group: `.bl-text-display`, `.bl-text-headline`, `.bl-text-subhead`, `.bl-text-body`, `.bl-text-caption`, plus a `caption` typography token. Typography tokens carry no colour, so there was no class to reach for.
checksNew `npm run style:check` (part of `npm run build`): fails on alpha or hand-mixed grey in any text colour across CSS and components; em dash ratchet over agent-facing content.
brandbrand.css prints `colorRules` as a header comment and marks the identical whites inside `:root`.
voice`hardRules` moved from `mechanics` to the top level of verbal-identity.md, so the default `get_voice_guide` brief and `get_brand_overview` return them.
brandchart.rules: the alpha ramp is for marks only; axis ticks, data labels and legend entries are solid.
agentsSkill route table: new row for picking a text colour, and the first-step row names the text system.
uiFixed four places in this site rendering text at 32% to 58% ink: inactive tab, accordion meta, support-matrix marks, logo caption.
An agent asking one thing was routinely handed everything. Four tools returned their entire contents by default, the square canvas shipped without geometry so every square slide was recomputed by hand, and reading four token values cost four round trips. Each of those is now one small answer, and the guide that documents them is checked rather than trusted.
layoutsEvery measured box now names the canvas edge its y is anchored to: `top` keeps y, `bottom` carries fromBottom, `center` carries offsetFromCenter, `inset` stretches between two insets, and `free` centres in the space the two blocks leave. The composition turned out to be exactly that regular, so another canvas height is arithmetic rather than judgement.
mcp`get_layout { id, ratio }` returns the geometry already resolved for that canvas. A square cover comes back with its footer rule at y 944 instead of the agent deriving it from 1214, which is the calculation that produced drifted headlines and misplaced footers. Widths never move: the canvas is always 1080 wide.
mcp`list_tokens { refs: [...] }` resolves several token paths in one call. An unknown path comes back as null next to the ones that resolved, rather than failing the batch and costing another round trip.
docs`arch:check` now verifies the AGENTS.md tool table and the tool counts quoted in AGENTS.md and CLAUDE.md against the tools actually registered. The guide had gone two releases out of date without anything noticing: list_layouts shipped and was never written down. Verified by deleting a row and watching the check fail.
mcp`get_design_spec` without arguments returned the whole ~72 KB document, so the cheapest call to type was the most expensive to make. It now returns the section index with sizes, 1 KB, and the full text is behind `full: true`. Slices via `part` and `get_section` are unchanged.
mcp`get_brand_overview` carries an `essentials` block: accent, canvas and ink, the approved surface pairs, the typeface identity, the radii and the logo URLs. That is the handful of values almost every task opens with, which used to cost two or three further calls. The long-form brand prose moved behind `guide: true`.
mcpEVERY JSON reply now carries `v`, the brand version, as its first key: sixteen bytes that let a client tell nothing has changed since it last asked, without a per-tool convention to remember. The two paths that answer with bare markdown stay bare, since their content type is the contract. `get_skill` and `get_brand_overview` dropped their own `version` field, which now duplicated it, and `list_carousel_recipes` returns an object like every other tool instead of a naked array. The two longest tool descriptions were cut roughly in half; every description is sent with every request, so text that only repeated what the payload already says was pure overhead.
mcp`get_voice_guide` returned the whole verbal identity, 18.5 KB, when what shapes a sentence is the brief: essence, personality, positioning, the do/don't principles and the ready-to-paste aiBrief. That is now the default at 5.8 KB, every remaining section is named in `more` and fetched with `part`, and `full: true` still returns all of it.
mcp`get_intake` attached the parameters of all seven output types to every call, so a poster brief also carried the deck, the table, the chart, the copy and the web ones. Without `output` it now returns the protocol plus the list of types with their routing keywords, 7.3 KB instead of 17.3 KB, and the parameters arrive when you name the type you are producing.
mcp`list_tokens` defaulted to `all`, which made the easiest call to write return every category at once. The default is now an index of the categories and their sizes, 437 bytes against 10 KB. `all` is still there for anyone who means it.
mcp`get_layout` without an id repeated the whole layout index that list_layouts already serves. It now returns the shared canvas and the layout ids, which is the part only it can answer.
layoutsThe catalog advertised a 1080x1080 canvas and carried no geometry for it. Every frame in the design source is portrait, so the square was a promise nothing backed. It stays on offer, since guided mode and a tested prompt both use it, but it now resolves through the anchor rule instead of being left to the agent.
mcp`list_icons` answered in two different shapes: a flat icons[] without arguments and a nested sets[].icons[] with a filter. It is now always a flat icons[] carrying its own `set`, so a caller never has to work out which shape it received.
agents`search_design` tagged brand-guide hits with `get_brand_overview`, which no longer returns that prose by default, so following the hit led nowhere. It now points at `get_brand_overview { guide: true }`.
Finding out which layouts exist meant calling get_layout, which serializes the whole shared canvas first: metrics, furniture, surfaces, composition and the type scale, several kilobytes before the first layout name. Browsing now has its own tool, and the icon library got the same treatment.
mcp`list_layouts`: every layout as one flat row with id, name, ratios, surfaces, header and footer anatomy, slot names, element count, example image and rebuildable SVG source. No canvas, no geometry. 1.8 KB against the 9.3 KB of a canvas-carrying get_layout, an 80 percent saving on the call an agent makes first and most often.
mcp`list_icons` without arguments used to return set counts and a hint to call it again with a filter, which cost a round trip to learn nothing. It now returns the whole library, one row per icon with its dark and light hotlink URLs, alongside the style guide and the set index. The filtered path is unchanged and still carries each icon's keywords.
mcpIndex replies serialize compactly rather than pretty-printed. An index is scanned, not read, so the indentation was about a third of the bytes on a flat list of rows. Detail tools are unchanged: they stay readable.
agentsThe orchestrator skill routes browsing to the index first: list_layouts to see what exists, get_layout { id } for the technical spec. The MCP tool count moves from 17 to 18 across the architecture page, the security block, llms.txt and the repository guides.
The measured geometry shipped in 2.7.0 was read as gospel, including the parts that were only ever a measurement of the example. A tag pill whose 139px was the width of the word EVENT stayed 139px wide when the tag read REAL ESTATE. Every box now declares whether its numbers are a constraint or an example.
layouts`canvas.imageTreatment`: guidance for type sitting over a picture. When it does not read, darken the image or lay a flat overlay over the whole panel. The treatment goes on the image rather than as a band behind the words, and the type is left alone: solid ink, full size, no shadow, no outline, no reduced opacity. Nothing here forbids type over imagery; it points at the fix the brand actually uses.
agentsThe rule reaches every lane: a sizing line in llms.txt, a `sizing` block in canvas metrics for MCP and layouts.json, a Sizing column in the /layouts spec dialog and in the copy-spec payload, and a routing row in the orchestrator skill for the case an element will not fit.
layoutsEvery element box now carries `sizing`: `fixed` is exactly the size given, `hug` is sized by its content with the w/h being the example measurement, `wrap` means text wraps inside the width while the height follows the copy. A `hug` box also names the `anchor` edge that stays put while the box grows the other way. This covers the tag pill, both folio labels, the footer URL, the wordmark lockup, the G symbol, the partner logo, the CTA arrow and every name and role in the people row.
layoutsThe tag pill was the worst case: x 877 and w 139 were both measured around the label EVENT, so a longer tag either overflowed the pill or squeezed the type. It now states that the right edge holds at 1016, the width is the label plus 60, and the 24px label and 47px height never change.
Agents kept rebuilding a slide in the right style with the wrong details: elements a little off, the black symbol on a dark surface, a missing divider. The catalog was the cause. It described positions in adjectives, never said which logo file a surface takes, and hid the divider inside a prose sentence. Every layout now carries measured geometry from Figma, a furniture block that resolves the rule and the logo for you, and a rebuildable SVG source.
layoutsEvery archetype now carries `geometry`: each element as absolute x/y/w/h in px on the 1080x1350 canvas, read out of the Figma "Atomic" page, plus the type role or furniture that fills it. Positions are no longer derived from words like "bottom-right".
layouts`canvas.metrics` records how to read those numbers: text boxes are trimmed to cap height, GALTON cap height measured at 0.70 of the type size, and the baseline of line k = y + 0.70 x size + (k - 1) x 1.2 x size. Without it a rebuilt block sits about a quarter of the type size too low.
layouts`canvas.furniture` holds the parts that are never content and never omitted: the rule, the G symbol, the wordmark lockup and the URL. The logo variant is resolved by surface, so the agent picks a file instead of guessing one.
assetsEach layout ships a rebuildable SVG source next to its example image, generated from the catalog geometry by scripts/build-layout-svgs.mjs with the GALTON webfont embedded. Copy it and swap the text: every position, rule, logo and URL is already right. Listed in the asset index, so it reaches all four lanes.
layoutsA fifth layout, `statement-light`: the same frame on the white canvas. It declares `inheritsFrom: statement`, so the loader copies the measured geometry across and the two can never drift apart. `canvas.surfaces` states the contract: light is the same geometry with the roles swapped, the ink and the Venn stroke and the arrow go near-black, and the yellow intersection is unchanged because the accent never inverts.
webEvery layout card on /layouts opens a Technical spec dialog: the geometry table, the never-omitted list, the text placement rule, links to the SVG source, the example and the Figma node, and a copy button that hands the whole spec to a chat with no MCP.
assetsAn arrows icon set: arrow-right, arrow-left, arrow-up-right, arrow-down-right and check, exported from the design source as SVG. Each ships in two finishes like the line icons: `file` is the #FFD700 accent, `fileLight` the same arrow in #1A1A1A ink for the case where it must read as ink rather than accent, as the statement CTA does on a light surface. They reach /assets, list_icons, icons.json, the llms files and the offline package through the existing icon plumbing.
agentsThe orchestrator skill gained a routing row for the case an agent is most likely to get wrong: a slide detail the layout does not name. It points at canvas `metrics`, `furniture` and `surfaces` and at each layout's `geometry`, `must` list and reference SVG, and says plainly that `get_fallback` is for what the brand leaves undefined, not for a number the agent did not look up.
agentsDesign-source identifiers are no longer published. The catalog carried the design file key and a node id per layout, which reached every surface that serves content verbatim: layouts.json, llms-full.txt and the offline package. They are internal, and are now kept out of `content/brand/` and out of `src/`.
webCopy spec now sits on the layout card as well as inside the dialog, and its payload carries both asset URLs: the rebuildable SVG source and the example PNG, plus a pointer to layouts.json.
layoutsstatement claimed `footer: symbol`. The Figma source has no footer at all, and neither does the example image, so an agent following the catalog drew a rule, a symbol and a URL that belong on no statement slide.
layoutsprofile claimed `footer: symbol`. It uses the partner footer: a supplied event or award logo replaces the G symbol. That footer variant is now declared, along with the `partnerLogo` slot, since the brand does not ship the file.
layoutsconcept described its lower text block as GALTON Light 60 Sentence case. It is a second GALTON Light 100 UPPERCASE headline.
layoutsThe slide divider was documented only as the word "hairline". It is a solid 2px line across the 952px content width; the web {colors.hairline} token is white at 12% and disappears at slide scale. The header and footer bands are a fixed 70px.
layoutsThe footer URL is lowercase and had no type role. Added `url` to the slide type scale, the sixth level, matching the Figma typography hierarchy.
assetsFour 3D icons (magnifier, magnet, tag, register) shipped with an opaque white background instead of transparency, so they showed as white cards on the dark canvas. Backgrounds cleared, magnifier replaced with the transparent export, and three unreferenced duplicate exports removed.
layoutsThe profile image slot was a fixed 635 x 990 portrait box. The frame does not require that: the image may be any aspect ratio. It is now `photoSafeArea`, an outer bound of 952 x 990 with `fit: contain` and `align: center`, so the picture is scaled to fit and centred, and the rule that matters is stated: it must never cross the header band, the footer rule or the 64px padding.
assetsThe 3D icons magnet, tag and register were re-synced from the design source. The earlier fix cleared their white background by flood fill, which left hard, unantialiased edges; the frame exports turned out to carry the same white background, so the transparent source uploads underneath were used instead. All 16 icons now carry a real alpha channel with antialiased edges.
The offline package shipped every asset as a file, and then told the agent eight times never to use a local path. The hotlink rule now names its one exception, so an offline build reaches for the file instead of a URL it cannot open.
agentsSTART-HERE.md now points at those rules rather than being the only place the mapping is written down. The exception is authored once, in the skill and the asset index, so the hosted surfaces and the package copies stay byte-identical.
agentsHard rule 3 in the orchestrator skill, and the header of the asset index, now state the exception: inside the unzipped offline package the local path ./brand/X IS the absolute URL, the same file shipped next to the knowledge. Everywhere else the absolute URL still stands. Before this, an agent given the package on a machine with no network followed the louder rule, emitted absolute URLs, and produced a page with missing images and a silent Montserrat fallback.
designThe two strongest do-not-relativise passages in the design spec carry the same exception, phrased so it cannot be read as permission to relativise anywhere else: the local path is the same file, not a copy.
For the teams that can run neither a connector nor a URL fetch: one ZIP, unzip it, hand your agent the folder. It carries the knowledge, the orchestrator skill and every logo, icon and font as a real file.
agentsA fourth access lane, C: the offline package at /bundle.zip. It unzips to a folder whose root holds SKILL.md (the orchestrator, unchanged) and START-HERE.md (the map: what is where, how to load it into a tool, how to verify it), with the prose sources under knowledge/, the JSON projections under data/, and a full mirror of the brand assets under brand/. Nothing to connect, nothing to fetch, nothing to configure.
agentsThe package is the first path that carries the asset FILES. The single-file route (llms-full.txt) can only carry asset URLs, so an agent with no network had to either invent a glyph or drop the requirement. Now the logos, the webfont and both icon families are on disk next to the knowledge that describes them.
securityMANIFEST.json inside the package lists a SHA-256 per file, and /integrity.json now publishes the digest of the archive itself. Every text file in the package is byte-identical to the surface of the same name, so a review compares digests instead of reading two versions of the same document.
agentsThe no-MCP path on /agents leads with the package: a download button, the folder tree it unzips to, and a step-by-step recipe for any tool that reads a folder. The single-file downloads stay for upload boxes that take one document and no folder.
docsllms.txt, the orchestrator skill, the connect-and-remember prompt, /start and /architecture all name the fourth lane, and the access-lanes diagram now draws four rows. The invariant is unchanged: one entry surface per lane, and the routing logic still lives only in the skill. The package ships that skill rather than restating it.
Eleven flat links made everything look equally important, which is the same as making none of it important. Two links and three thematic dropdowns now.
navThe header IA is now a declarative HEADER_MENU in nav.ts rather than an exclusion set. A page missing from it is appended as a top-level link instead of quietly disappearing, so adding a page to PAGES can never hide it.
navThe header is Start, For agents, then three dropdowns: Examples (prompts and guided mode, before and after), Design system (foundations, components, guidelines, logo and assets, layouts) and Voice (verbal identity, LinkedIn). The two plain links are the two things a first-time visitor needs: where to begin and how to wire the brand into their tool. Everything else is reference and groups by the question it answers.
navThe homepage index reads the same config, so the bar and the index cannot disagree about what belongs together. Numbering still runs continuously across the sections, so it reads as one list rather than four.
navThe desktop bar appears from 1100px instead of 1400px. Five entries fit where eleven did not, so laptops get the real menu rather than the hamburger.
navThe overlay menu tracked one open/closed boolean for every group at once. Correct with a single Others dropdown, wrong the moment there were three: opening one opened all of them. It is an accordion now, one group at a time.
The cheat sheet is gone. Everything on it was already on two pages that people actually visit, and a printable one-pager was a surface to keep true for no gain.
cheatsheetThe /cheatsheet page and its print button are removed, along with the print stylesheet they needed. It was added the same day as the onboarding page and never earned its keep: the asks come from prompts.md, the one-word swaps and the locked list come from intake.md, and both are already on /prompts and /start, where somebody is actually looking. /start now points at the tested prompts instead of handing out a sheet.
It was designed for paper and shipped white, which is unreadable inside a dark site. It now wears the canvas on screen and inverts when printed.
cheatsheetThe one-page takeaway rendered on the light surface everywhere, because its destination is a PDF. On screen that made it a white document dropped into a dark site. It now uses the brand canvas on screen and inverts to the light surface only in print, through CSS custom properties and a print media query, with both wordmark variants shipped so the mark follows the surface. Both sets of values are brand tokens, so the two versions cannot drift.
cheatsheetThe printed version ran onto a second page, which defeats the point of a one-pager. Print type and spacing are tightened so it fits one A4, verified by rendering it.
Research notes that live in the repository but never reach the app no longer have to be described as if they were releases.
checkschangelog:check exempts a commit that touches nothing inside the app, the same way it already exempts a commit that only edits the changelog. A memo in docs/ did not ship to anyone, so a product changelog has nothing to say about it. The reachability warning now reads the unfiltered history, otherwise every commit from before the app moved into framework/ would look like a typo in an old entry.
The figures on the architecture page were typed in and two of them had gone wrong. They are counted now.
architectureThe page said eleven surfaces and eight brand files. It is thirteen and nine, and it had also stopped counting /cheatsheet among the pages. Surfaces and tools already came from the source; brand files are now counted from the content folder and the page total accounts for every page outside the nav, so the three figures that can drift no longer can.
The footer had been publishing 06.08. through two releases that changed the brand. Fixed, and now checked, along with every advertised file size.
checksbrand:check now verifies that date instead of trusting it. Git knows when content/brand last changed: uncommitted edits mean the date has to be today, otherwise it may not predate the last commit that touched the folder, and it can never be in the future. A hand-set date that nobody can forget to bump.
llmsllms.txt advertised token counts that were typed in by hand and had drifted: skill.md was listed at half its size, intake.md at a quarter. The counts are measured from the real content now, and the two numbers that cannot be measured cheaply were dropped rather than left to rot. The sizes quoted in AGENTS.md were re-measured too.
brandThe `updated` date in brand.md was two releases behind, so the footer, brand.json and llms.txt all published a date that was not true. It is set to the day the content actually last changed.
Guided mode had a closed list of questions. It now carries a licence for the question nobody wrote down, and the boundary that stops it becoming an interview.
guided-mode`ownQuestions` in intake.md: the agent may ask one question of its own, out of the same maxQuestions budget, when the request needs a fact only the user has (a date, a client or product name, a market), when two readings would produce materially different assets, when the brand genuinely does not cover what was asked, or when the request conflicts with the brand in a way that is a real choice. The boundary is the other half: never anything on the locked list, never anything that already has a default, never anything inferable, never a question whose answer would not change the asset. It reaches every lane the rest of the protocol does, and brand:check fails when ownQuestions.max exceeds maxQuestions.
guided-modeThe protocol now says out loud that the parameter list is a floor, not a ceiling, and a "Room for judgement" panel on /prompts shows both halves: when to ask, and when never to. Four scenarios were run against the new wording before it shipped. A fully specified request still gets zero questions and the asset; a vague one gets exactly the blocking question; a request for a poster for "our event next month" adds the one question about which event; a request for a blue accent and a blue logo gets neither a question nor a blue poster, but a plain statement of what the brand does instead.
promptsThe copy button moved back to the top right, beside the prompt it copies, and the line under it is now italic. It is commentary rather than part of the prompt, and copying it would have been wrong, so it should not read like the same voice.
The brand is written GALTON, always. Plus the two things the first read of v2.3.0 caught: a misaligned prompt panel and an onboarding page that read like a manual.
startThe rollout section was two plans in prose, four bullet lists each. It is now one decision table: six questions somebody has to answer on day one, answered for 5 to 10 people and for 30 to 50. The first-asset steps carry the endpoint and an example sentence to copy, and every step says how often it happens. Roughly half the words, and more of them concrete.
compareScores are no longer one reading. Each pair was re-scored by an independent judge that read both files and the spec, and the published note now states the observed values on each side. The re-run lands at 4 of 40 criteria on brand without the layer and 40 of 40 with it.
brandThe brand name is uppercase everywhere it appears: content, surfaces, the typeface name and the docs. The one exception left cased is Francis Galton, the historical person, whom the verbal identity deliberately keeps at arm's length. The before/after prompts said "Galton Brands" and now say "GALTON Brands", so all ten artefacts were re-run from the corrected prompt rather than edited.
promptsThe three prompt levels sat on double padding, so the text started a gutter further right than the tabs above it and the copy button floated beside a narrow column. The card now owns the gutter, every tab lines up on one left edge, and the copy button sits on the footer row where it does not move between tabs. The first example also opens on load: a page of closed rows hid the thing worth seeing.
showcaseSeveral new panels used ink-at-opacity for secondary text, which the brand forbids outright: text is solid, hierarchy comes from size. Every text colour in the new sections is solid again.
Guided mode: an agent now fills what a short request leaves out from the brand's own defaults, asks at most one question, and reports every choice back. Plus the evidence that it matters, an onboarding path for teams, and the material a security review asks for.
guided-modeGuided mode. A new content file, intake.md, defines seven output types (poster, social post, deck, table, chart, copy, web) with the parameters that shape each one, a safe default for every parameter, the single blocking question worth asking, the report block to append under the delivered asset, the list of things that are never a parameter, and a self-check to run before delivering. It reaches agents through every lane without duplicating the prose: rendered into the orchestrator skill, linked in one line from llms.txt, carried as the first section of llms-full.txt, and served as the get_intake tool, the brand-brief prompt and the /intake.md surface.
promptsEvery example on /prompts now shows the same request at three levels: the one sentence a person actually types, the same ask with two or three parameters named, and the full director brief that produced the artefact. The one-sentence version is the default, because with guided mode it is a complete brief. design.md's agent prompts were shortened to match, with the long form kept beside them as directorPrompt.
compareA /compare page: five ordinary Slovak requests, each run twice on the same model on the same day, once in a fresh chat with no brand knowledge and once with the brand loaded as a single file. Scored against a nine-point checklist rather than by impression, with the artefacts, the guided-mode report and the honest caveats published alongside.
startA /start page for people who have read nothing else: three steps to a first asset, then two rollout plans (5 to 10 people and 30 to 50 people) covering roles, central setup, onboarding, approval tiers and the numbers worth watching, then what to do when the brand version changes. Plus /cheatsheet, a one-page printable takeaway generated from the same content, so it cannot go stale.
securityA security and data-flow block on /agents, written for the review that happens before an outside connector is allowed: what crosses the boundary, what never leaves the user's tool, how the endpoint is built, and an honest position on prompt injection. Backed by two real controls: /integrity.json publishes the size and SHA-256 of every surface as served, and npm run injection:check scans agent-facing content for instruction overrides, credentials, exfiltration, execution, hidden characters and off-domain links. It runs as the first step of the build.
surfacesSurface bodies moved into one registry (lib/brand/surfaces.ts) that owns each path, content type, builder and absence rule. Route files are now a doc comment plus surfaceHandler(). This is what lets /integrity.json hash exactly the bytes that are served instead of re-implementing every body.
navThe site is eleven sub-pages now: /start leads, /compare sits beside the prompts, and Guidelines moves into the header's Others menu to keep the bar compact.
llmsllms-full.txt carried only prose, so the upload lane had no logo, font or icon list. Asked for a post with an icon, an agent correctly refused to invent one. The bundle now ends with a hotlink index: every logo by surface, the webfont, and the whole icon library with its dark and light URLs.
A technical overview of the framework itself, with the diagrams and the file map, checked against the real source so it cannot quietly go stale.
architectureAn /architecture page, linked from the footer rather than the nav. Covers the stack, the MCP server and its 16 tools, the tool-calling order, the 11 machine-readable surfaces, the file map and the structural invariants. Three inline SVG diagrams: the parse-once-project-three-ways flow, the shape of an MCP session, and the three agent access lanes.
core`npm run arch:check`. Compares the documented tool, resource and prompt names against tools.ts, the surfaces against the route folders, the dependency versions against package.json, and every documented file path against the filesystem. Fault-injected on all four to confirm it fails when it should.
The product gets a history page, one versioning scheme instead of two, and a check that fails when either goes stale.
changelogA /changelog page, linked from the footer. Driven by content/changelog.json, which sits outside content/brand/ because product history is not brand data. Rendered as an accordion with the newest shipped release open, so fourteen releases read as an index rather than a scroll.
core`npm run changelog:check`. It fails when a commit reachable from HEAD is described by no entry, and validates release shape, ordering, and that design.md, package.json and the newest release all carry the same version.
docsA written versioning rule in AGENTS.md. One public semver sourced from design.md, with major reserved for contract breaks, minor for new capability, patch for everything else. A `feat:` commit does not automatically make it a minor.
promptsThe pitch-deck showcase artefact grew from six slides to nine, adding a three-slide light-theme section with native charts. deck.pptx, deck.pdf and deck-preview.html regenerated, prompts.md updated to match.
corepackage.json was on 0.3.0 while design.md declared 2.0, which is why the changelog first rendered 0.3.0 above 2.0.0. Both now track the same number.
promptsPitch deck slide 7: two-line chart captions landed on the footer rule, and the third panel faked its missing legend with a hand-tuned margin. The captions now clear the rule, and all three panels share one box model.
seo/sitemap.xml and src/app/sitemap.ts. Every response already carries X-Robots-Tag noindex, so there was nothing to submit to a search engine; agents discover the surfaces through /llms.txt.
Every agent connection guide re-checked against current vendor documentation, and Moonshot's three Kimi products separated out.
agentsKimi (Moonshot AI) coverage, split three ways: Kimi web chat, Kimi Work and Kimi Code CLI. Kimi Work shares mcp.json with the CLI and has no custom-server UI of its own, so it gets a mount-a-folder recipe instead of an MCP recipe.
agentsEvery connect guide re-verified against 2026 vendor docs. The ChatGPT guide was wrong: custom MCP connectors are Developer Mode only.
The largest release. Tool surface consolidated to 16, a tested-prompt catalog added, and the whole system audited for stale references left behind by the consolidation.
promptsA /prompts page: realistic prompts run against the layer, each shown with the unedited artefact it produced. Agent prompts moved off /agents.
promptsEight more tested use cases, a product-launch card on the profile layout, a citylight replacing the banner set, and an Audio & video category with a 30-second script plus a local AI voice-over.
agentsAn MCP-vs-no-MCP mode switch on /agents. Both branches stay server-rendered; the switch only toggles the hidden attribute.
seonoindex everywhere: a meta robots tag on pages plus X-Robots-Tag on every response. Crawling stays allowed so a crawler can read the noindex, and AI agents keep full read access.
coreSystem-wide simplification and an AI-agent reliability overhaul. Breaking: MCP tools were consolidated, and several tool names disappeared.
coresite, origin, base and siteUrl unified to a single `site` name across builder and component signatures.
surfacesFour surfaces still named MCP tools that the 16-tool consolidation had removed: skill.md, llms-full.txt, brand.json and layouts.json comments, layouts.md prose, and the design.md fallback protocol.
promptsLayout pass on the prompt catalog: full-width accordion bodies, prompt and tested-with merged into one editorial card, image results at natural size, category titles as regular h3 headings.
Three new machine-readable surfaces and the orchestrator skill that routes an agent between them.
agents/brand.css, /snippets.json and /llms-full.txt, plus the versioned orchestrator skill served at /skill.md and over MCP as get_skill.
agentsA skill.md preview on /agents, and llms-full.txt named as the load-as-file bundle throughout the UI copy.
docsA design spec for the three quick-win surfaces, with an extension roadmap.
The machine-readable surfaces made safe for unattended agent consumption.
agentsMachine surfaces hardened for AI-agent consumption.
The service got its name, and the mobile header was rebuilt to match galton.sk.
agentsA "Limitations & how to proceed" section, and corrected no-MCP guidance.
brandThe service is now Brand Layer, by GALTON Brands.
assets3D icon set updated.
headerFull-height mobile overlay with galton-devpage menu styles, and the ▾ dropdown caret replaced by the devpage chevron SVG.
coreCleanup pass: dead code, redundant font assets, and stale doc/spec references.
The voice page rebuilt from the brand-voice manual, plus navigation work.
voice/voice rebuilt as Verbal identity, from the GALTON brand-voice manual.
uiIndex-row hover style and an "Others" nav dropdown.
agents/agents reorganised into three clear sections with tabbed tool setup.
The fallback contract, chart palette and agent rules land, alongside the full UI catalogue and the split into a multi-page site.
frameworkThe anti-hallucination layer (fallback contract, chart palette, agent rules), the full UI component catalogue, and the multi-page site structure.
agents/agents rebuilt around accordions, with 2026 connection guides.
uiCopyable anchor links on every sub-page heading.
uiGALTON centred via @font-face metric overrides, so uppercase labels no longer float high in tight boxes. Buttons synced to the galton.sk source.
uiCode and raised surfaces unified on brand tokens, and the last grey text removed. Full-width prose, subhead page lead, blockquote rule, and a single web font.
brandFaithful black-on-white chrome and button border longhands.
The layout catalog and icon libraries finalized against the Figma "Atomic" page.
api/layouts.json and /icons.json served with absolute asset URLs.
iconsWhite-surface icon variants in the showcase.
layoutsLayout catalog and icon libraries finalized from the Figma "Atomic" page, and the slide-canvas spec card redesigned.
iconsThe Simple icon family, and carousel recipes dropped from /layouts.json.
The defining decision: the layer serves brand knowledge and never generates assets.
coreThe render and generation pipeline. The layer is read-only knowledge; the agent produces the asset.
Four new content domains land at once, with MCP tools, showcase sections and a since-removed render pipeline.
brandContent schema, loader and validation for voice, LinkedIn, layouts and icons.
mcpTen read-only MCP tools covering voice, LinkedIn, layouts, icons and rendering, plus the matching agent surfaces.
showcaseBrand voice, LinkedIn, layouts and icons sections in the showcase.
layoutsSlot helpers, ten archetype slide components and a registry; icon-statement and icon-steps layouts; a lightbox; layout example images and a clean 3D icon set.
renderAn HTML slide page and a headless-chromium PNG route, with the bundling config it needed. Removed the following day.
docsVoice, LinkedIn, layouts, icons and the render pipeline documented across 21 tools. Fonts asset description notes the desktop/print and legacy font cuts.
The static HTML manual gives way to a brand-agnostic Next.js app, and the legacy root system is retired.
frameworkA universal, brand-agnostic AI design-system framework on Next.js.
showcaseA black-on-white section, prominent headers, real nav logos and larger type.
apiMCP hardening, robots and sitemap, an accurate last-updated date, and absolute hotlinkable asset URLs with guaranteed /brand CORS.
coreThe legacy root static system. framework/ is the single source of truth, and the root README is now a pointer to it.
coreDead exports, found by adding fallow as a dev dependency.
The original HTML manual: component tokens, the type scale, and the first machine-readable entry point for AI.
brandButtons, corner radii, motion, links, eyebrow and badge tokens.
brandForm and input utilities: form-group, form-label, form-input, form-textarea, form-checkbox, form-select, form-check and form-check-label.
agentsAn llms.txt AI entry point with an asset download directory, a robots.txt that explicitly allows AI crawlers, a sitemap, and DESIGN.md as the design-system spec for AI UI generation.
brandtext-display and text-display-lg utilities, the Montserrat fallback and the official type hierarchy.
brandThe logo restricted to white and black only, with favicons added.
docsDocumentation aligned with the official brand guidelines: radii renamed to border-radius throughout, stale component and button references removed, the extended type scale corrected, and the manual refactored into a client-facing showcase.
brandclamp and vw units replaced by fixed breakpoint values for font sizes, button padding and layout CSS.
brandButton text centring: inline-flex instead of inline-block, an appearance reset, and line-height 1.
brandviewBox added to every SVG use element, fixing the logo aspect ratio.
brandgalton-purple, removed from the entire project including llms.txt. The palette is the five official brand colours.
The GALTON Brands AI asset package.
coreThe GALTON Brands AI asset package.
