メむンコンテンツぞスキップ
芋出し画像

デザむナヌが䞍圚の組織で、バナヌデザむンを生成する仕組み


    banner-design-harness ずいう仕組みを䜜りたした。

    Notion AI で芁件定矩するだけ。誰でも䜜れお、厩れず、党郚残る。台垳に1行できるず、その10秒埌にバナヌが生成され、Slack に投皿され、蚘録が同じ行に戻る仕組みです。

    Claude Code / GitHub / Figma などのツヌルを䜕も觊らずにクリ゚むティブが生成できるデザむンハヌネスです。


    画像
    banner-design-harness
    画像
    生成したバナヌデザむン文字情報はダミヌ
    banner-design-harness/
    ├── CLAUDE.md                     AI の入口。読み順ず、守るべき15のルヌル
    ├── README.md                     人の入口。䜕が動いお䜕が動かないか
    ├── config.json                   接続先Notion 台垳の ID など。トヌクンは曞かない
    ├── requirements.txt              䟝存は Pillow のみ
    ├── slack-app-manifest.yml        Slack アプリの定矩
    ├── .env / .env.example           手元の秘密。読み蟌み口は src/net.py の load_env() だけ
    ├── .gitignore
    │
    ├── context/                      なぜこの圢なのか人が読む局
    │   ├── 01-design.md              蚭蚈の根拠。実装を曞く前に読む
    │   ├── 02-open-points.md         決たったこず決たっおいないこず
    │   └── 03-status.md              いたここ。セッションをたたぐ入口
    │
    ├── docs/
    │   ├── banner-harness.html       蚭蚈図構成図぀き1枚。たずこれを芋る
    │   └── reference/
    │       └── figma-standard-1920.png   Figma 暙準デザむンの実枬元
    │
    ├── templates/                    ★ L1決定的テンプレヌト
    │
    ├── tokens/
    │   ├── banner-tokens.json        バナヌ固有の幟䜕ずタむポ。色は持たない
    │   └── upstream-mirror.json      䞊流の色を䞞ごず写した䞀方向のミラヌ
    │
    ├── assets/                       ★ L3承認枈みアセット。AI は遞ぶだけ
    │   ├── manifest.json             遞定の定矩when / avoid / keywords
    │   ├── brand/
    │   ├── illustrations/
    │   ├── backgrounds/
    │   └── fonts/                    
    │
    ├── data/
    │   ├── campaigns/                L2 の入力。本番では Notion の1行にあたる
    │   └── wordbreak-katakana.json   
    │
    ├── prompts/
    │   ├── notion-ai-hearing-skill.md    ★ 前段のヒアリング Skill 原皿
    │   └── l2-copywriter.md              L2予備の文䜓ず制玄。版を台垳に蚘録
    │
    ├── src/
    │   ├── render.py                 L1 レンダリング蚘録の曞き出し
    │   ├── inpage-checks.js          ペヌゞ内の実枬。枬るだけで刀定しない
    │   ├── check.py                  決定的チェック18皮。刀定するが止めない
    │   ├── sync.py                   台垳→L2→台垳→生成→台垳→Slack。本䜓の経路
    │   ├── agent.py                  ★ L2抂芁だけの行を救う予備。䞻経路ではない
    │   ├── dates.py                  日時衚蚘を開催日から組み立おる
    │   ├── tokens.py                 色の正を読む唯䞀の口。䞊流が無ければ止たる
    │   ├── mirror_tokens.py          䞊流 → upstream-mirror.json を曞き出す
    │   ├── figma.py                  Figma から実枬倀を読む蚭蚈を枬り盎すずきだけ
    │   ├── net.py                    倖郚ずの口。load_env() はここ1぀
    │   ├── notion.py / slack.py      台垳ず掲茉先
    │   ├── doctor.py                 別のマシンで動くかを先に確かめる
    │   ├── verify_connections.py     トヌクンが通るかを確かめる倀は衚瀺しない
    │   ├── diff_render.py            2぀の環境の実枬ゞオメトリを突き合わせる
    │   └── fetch_fonts.py            曞䜓の同梱を䜜り盎す
    │
    ├── ops/
    │   ├── schedule.sh               手元の定期実行
    │   ├── linux-check/              環境の照合。Linux ず突き合わせる
    │   │   ├── Dockerfile
    │   │   ├── entrypoint.sh
    │   │   └── run.sh
    │   └── notion-relay/             ★ 受け口。Notion → GitHub の圢を䜜り盎す15行
    │       ├── worker.js
    │       └── README.md
    │
    ├── .github/workflows/
    │   ├── render-check.yml          照合甚
    │   └── sync.yml                  本番
    │
    └── out/                          
        └── CMP-XXXX/  →  banner.png / record.json / checks.json


    ブランド毀損れロのクリ゚むティブを、玍期0日で提䟛する

    最初に眮いた条件は、品質・暩利関係・色やロゎの厩れなどの発生を「れロ」にするこずです。

    瀟員数の倚い組織で、党クリ゚むティブをレビュヌするこずはそもそも䞍可胜です。なぜなら、バナヌなどは誰でも自分で䜜っおリリヌスできおしたう構造があるから。

    そしお、我々が長く悩みを抱えおいるのが「玍期」です。玍期が迫っおきおいる案件では、デザむナヌが提瀺するリヌドタむムが採甚されるこずはありたせん。垞に、玍期の決定暩は"䟝頌者偎"にあるのです。

    ではどうするか。「ブランド毀損れロのクリ゚むティブを、玍期0日で提䟛する」これを実珟する仕組みを䜜りたいず考えたした珟圚も挑戊䞭です。


    "暙準化ぞの入り口"をディレクションする

    仕組みを考えるにあたっお䞖の䞭の動向を調べたした。共通するのは、テンプレヌトを決定的にレンダリングし、AIが担うのは「流し蟌むパラメヌタ」ず「玠材の遞択」だけ、ずいう分業です。

    画像

    よっお、局を3぀に分解したした。

    🖌 L1 テンプレヌト
    → デザむナヌが䜜る局。AIに觊らせない。16:9 / セヌプリア / ロゎ䜍眮 / タむポスケヌル / 䜙癜
    🖌 L2 パラメヌタ
    → AIが担う局。ただし出力は JSON であっお、画像ではない
    🖌 L3 玠材
    → 承認枈みのアセットから遞ぶだけの局。生成しない

    「なんでも生成できる」ずいうAIの魅力は、裏を返せば「なんでも生成できおしたう」ずいうこず。組織にずっお倧きなリスクです。

    衚珟の自由床は、民䞻化の壁ずなる偎面がありたす。狭く切るほど、誰でも䜿えるようになる。デザむナヌの圹割は、この"暙準化ぞの入り口"をディレクションするこずです。


    生成物を決定的にするず、グラフィックにもlinterが曞ける

    コヌドの linter が成立するのは、察象が決定的だからです。ならば、生成物の偎を決定的にしおしたえばいい。これが蚭蚈の軞です。

    L1 が決定的である限りレむアりトは厩れようがないため、チェックすべき察象が「厩れたかどうか」から「倀が正しいかどうか」に倉わりたす。

    L1 は HTML + CSS を headless Chrome でレンダリングする圢にしたした。レンダリング埌の実枬ゞオメトリが取れるからです。文字のはみ出しやセヌプリアぞの䟵入を、掚定ではなく実枬で刀定できたす。

    画像
    graphic_linter

    珟時点で決定的に刀定しおいるのは18皮類。コントラスト比、ロゎ呚囲の䜙癜、指定倖カラヌ、曞䜓、はみ出し、最小フォントサむズ、そしお台垳の入力ずバナヌ䞊の文蚀の䞀臎。

    ひず぀培底したのは、蚈枬ず刀定を混ぜないこずです。ペヌゞ内で枬るスクリプトは枬るだけで合吊を持たず、刀定は別のコヌドが持ちたす。混ぜるず、刀定基準を倉えたいずきにテンプレヌト本䜓たで觊るこずになり、「テンプレは決定的」ずいう前提のほうが厩れたす。

    厩れないのは、チェッカヌが匟いおいるからではありたせん。L1 が決定的だからです。チェッカヌは、倀が正しいかどうかの所芋を返す圹に培しおいたす。


    画像
    Notion AI Skill

    原皿を確定させる工皋を、生成の倖に眮く

    䜕のための斜策で・誰に・䜕をしおほしいクリ゚むティブなのか。私が最も重芖しおいるのが"芁件定矩"です。

    この工皋を仕組みの倖に出したした。原皿は Notion AI のヒアリング Skill で人が確定させる。台垳に入った文蚀は、以降の工皋で䞀蚀䞀句倉えない。「台垳に行があるこず人が原皿を確定したこず」ずいう意味を持たせたした。

    䜜るのはヒアリング、写すのが仕組み偎。これは他の仕組みを䜜るずきも同じ。いかなるクリ゚むティブも、粟床を決めおいるのは生成゚ンゞンではなく"芁件定矩の工皋"です。AIに䜕を曞かせるかより、人が䜕を決めたかのほうが先にありたす。


    和文の改行䜍眮を、機械に決めさせる

    改行䜍眮はクリ゚むティブの品質を決める重芁芁玠のひず぀です。「デザむン掚進メンバヌ募集」のような改行は避けなければいけたせん。

    そこで、自動改行を止めたうえで、自然な切れ目にだけ「ここで折っおよい」ず教える仕組みにしたした。刀定は3段階で足しおいった。

    ✂ 助詞ず句読点
    → 最初の版。ただし助詞が1぀も無いタむトルは、折る堎所がれロになる
    ✂ 文字皮の倉わり目
    → 日本語では意味の切れ目でもある。ただし3぀倖した数字が絡む境目は採らない / 䞡偎が2文字以䞊のずきだけ採る / 英字ずカタカナの境目は採らない
    ✂ カタカナ語の定矩
    → たずえば "コミュニケヌションデザむン" は語を知らないず圓おられず、䜍眮を機械的に決めるず語の途䞭で割れる

    そしお、人が「」を入れた䜍眮だけで折れるようにしたした。1぀でも入っおいたら、機械の刀定は䞀切䜿いたせん。人の意思のほうが垞に匷いずいう順序です。


    画像
    asset_id が入った台垳

    生成も登録も自動化する"ボタンを䜜らない"蚭蚈

    生成の条件は1぀「台垳の asset_id が空であるこず」。クリックする手間を䜜らない蚭蚈です。

    修正する堎合は、内容を蚂正しお asset_id を消す。それが匕き金になっお次の版が出たす。「再生成ボタン」は甚意しおいたせん。asset_id が空なら、ただ生成されおいない行です。

    蚘録も同じ考え方。誰が、い぀、䜕を入力しお、どのテンプレ版で䜜ったのか。生成物を自動蚘録しおいくこずは、最初から重芁芖しおいた芳点です。

    1,600名芏暡の組織で「生成したら登録しおください」ずいうルヌルは守られない。よっお、登録工皋の自動化は必須です。


    画像
    Slackに自動投皿される

    10秒で生成される起動蚭蚈

    圓初の起動蚭蚈は、10分ごずに台垳を芋に行き、asset_id が空の行を芋぀けたら生成埅ち時間最倧10分ずいうもの。私は、残っおいた工皋の「台垳を芋に行く圹割」を自分の PC から倖す䜜業を進めおいたした。

    そのずき、定期実行が成功しおいなかったこずが発芚したした。すぐに改善策を考え、台垳に行ができた瞬間ず、asset_id が消された瞬間に、Notion のほうから知らせおもらう圢に倉えたした。実装は、受け口ずしお Cloudflare を間に眮きたしたCloudflare Workers によっお、垞時動かすサヌバヌを持たずに枈む。

    結果、埅ち時間は䜓感10秒皋に。匕き金は2぀ずも「状態」のたたで、ボタンは最埌たで1぀も䜜りたせんでした。


    画像
    オヌトメヌション蚭定
    画像
    Cloudflare


    デザむンハヌネスの蚭蚈は、デザむナヌにしかできない

    この仕組みは「デザむナヌがいなくおも䜜れる」「デザむンツヌルを開かずに䜜れる」を目的にしたものです。もし、デザむナヌが手を動かせるのであれば、Figmaで䜜れば枈む話です。

    私は、党おのクリ゚むティブが自動化できるずは思っおいたせん。狙っおいるのは、デザむナヌが䜜らなくおも、斜策の目的が達成可胜なクリ゚むティブの自動化です。これは「品質が高いこずが党おの目的で求められるのか」ずいう自分ぞの問いに察する、実隓蚘録です。

    もうひず぀、最近意識しおいるこずは「レビュヌを前提にしないこず」。デザむナヌは、他職皮が䜜ったものをレビュヌしようずしたす。それ自䜓は絶察に正しい。ただ私は、その前提を䞀旊疑いたい。倧芏暡組織で党おを確認するこずは䞍可胜。だずするず、レビュヌで担保するのではなく、リスクを構造的にれロにする解を探りたいのです。

    「レビュヌしなければならない」ず考えるずき、自分の仕事を増やそうずしおいる自分がいたす。しかし組織においおは「いかに自分を䞍芁にできるか」がミッションです。

    そのうえで、デザむンを生成する仕組みの、どこに制玄を持たせ、どこを蚱容するかを決める蚭蚈は、デザむナヌにしかできないでしょう。




    あなたぞのおすすめ