Plank help · updated 2026-08-09

Как Plank выдаёт готовые документы

Отчёты, аналитика и сводки выдаются в виде аккуратных самодостаточных HTML-документов, которые автоматически подстраиваются под вашу светлую или тёмную тему, — и как это изменить.

Agents: fetch the raw markdown of this page at /ru/help/deliverables.md

Как Plank выдаёт готовые документы

Когда Plank создаёт что-то, что вам нужно прочитать — отчёт, аналитику, сводку, резюме, — по умолчанию он выдаёт аккуратный самодостаточный HTML-документ, а не сырой markdown. Это один файл, оформленный в фирменном стиле Plank, который выглядит готовым в тот же момент, когда вы его открываете, и продолжает выглядеть правильно, если вы скачаете его или перешлёте.

Эта страница написана и для вас, и для ассистента. Ассистент обращается к ней по адресу https://plank.md/help/deliverables.md перед тем, как создать документ, поэтому каждый документ получается единообразным.

Что считается документом

Выдаётся как оформленный HTML: документы, которые читает человек, — отчёты, аналитика, сводки, резюме, обзоры.

Это не затрагивает:

  • Рабочие заметки, которые ассистент ведёт для порядка (log.md, index.md, папка knowledge/), остаются в markdown — это картотека ассистента, а не документы, которые вы садитесь читать.
  • Таблицы остаются в формате .xlsx, и вы по-прежнему можете попросить файл .pdf или Word. HTML — это формат по умолчанию для текстовых документов, а не замена этим форматам. У презентаций свой фирменный стиль и свои два формата: редактируемый .pptx — или HTML, распечатанный в PDF, когда презентация должна выглядеть как арт-дирекшн, а не переделываться. Выбирает жанр; на той странице написано, чего лишается каждый вариант.

У графиков и дашбордов тоже есть своя страница — Дашборды и графики: выбор типа графика, проверенная палитра и самодостаточные компоненты.

Когда вывод описывает связь, а не число — порядок, передачу из рук в руки, вложенность, распределение времени, — рисунок передаёт её целиком, тогда как абзац заставляет читателя собирать её заново. Об этом страница Схемы: когда схема лучше абзаца или таблицы и когда она явно лишняя, какой блок встроенного SVG вставить в лист и каким требованиям он должен отвечать. Прочитайте её перед тем, как рисовать что-либо в документе: схема, скопированная из обычного редактора схем, несёт зашитые цвета — значит, она невидима в другой теме и безымянна для скринридера, и при отрисовке об этом ничто не сообщит.

Планка качества — это навык, а не правило с этой страницы. Два навыка от Plank — Deliverable Writing (заголовок формулирует вывод, у чисел есть база для сравнения, документ заканчивается решением) и Deliverable Design (смысловая точка, отступы, читаемые графики) — задают стандарт для презентаций, документов и дашбордов. Если хотя бы один установлен в этом рабочем пространстве, вызовите его перед выдачей результата. См. Навыки.

Фирменный стиль

Каждый документ — это один самодостаточный файл .html: всё оформление встроено внутрь, а тема автоматически следует за светлым или тёмным режимом, поэтому файл отображается правильно сам по себе, без чего-либо ещё.

  • Текст набран шрифтом Inter, а цифры в таблицах — JetBrains Mono.
  • Тёплая страница цвета слоновой кости и белый «лист» в светлом режиме; глубокий обсидиан и сланцевый цвет в тёмном.
  • Синий акцент Plank, щедрые, но спокойные отступы, прямые углы — это документ, а не приложение.
  • Автоматически подстраивается под вашу светлую или тёмную тему и переключается в реальном времени, когда вы её меняете: внутри Plank он следует за темой приложения, а сам по себе — за настройкой системы. Никаких переключателей.
  • Адаптивный: на телефоне лист сворачивается на всю ширину экрана.

Канонический шаблон

Начинайте с этого точного шаблона и заполняйте <article class="sheet"> содержимым документа, используя только нужные элементы (надзаголовок, заголовок, вводный абзац, строку метаданных, сетку показателей, разделы, списки, выноску, таблицу, нижний колонтитул). Не переоформляйте его произвольно — смысл именно в единообразии.

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>{{TITLE}}</title>
    <link rel="preconnect" href="https://fonts.googleapis.com" />
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
    <link
      href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@500&display=swap"
      rel="stylesheet"
    />
    <style>
      :root {
        --ivory: #fafaf7;
        --surface: #ffffff;
        --stone: #f0ede8;
        --mist: #e5e2dc;
        --ink: #0a0a0f;
        --graphite: #3a3a42;
        --muted: #72706b;
        --faint: #aaa69e;
        --blue: #4f6df5;
        --blue-soft: #eef1fe;
        --blue-on: #243fbf;
        --green: #2f9461;
        --green-soft: #edf8f2;
        --shadow: 0 24px 80px rgba(10, 10, 15, 0.08);
      }
      :root[data-theme="dark"] {
        --ivory: #0a0a0f;
        --surface: #16161d;
        --stone: #20202a;
        --mist: #2a2a35;
        --ink: #fafaf7;
        --graphite: #d6d3cc;
        --muted: #918e87;
        --faint: #6a685f;
        --blue: #7d93f8;
        --blue-soft: #1c2030;
        --blue-on: #aab8fb;
        --green: #4cc189;
        --green-soft: #14241c;
        --shadow: 0 24px 80px rgba(0, 0, 0, 0.45);
      }
      * { box-sizing: border-box; }
      body {
        margin: 0;
        background: var(--ivory);
        color: var(--ink);
        font-family: Inter, system-ui, sans-serif;
        font-size: 16px;
        line-height: 1.55;
        -webkit-font-smoothing: antialiased;
        transition: background 0.25s ease, color 0.25s ease;
      }
      .sheet {
        max-width: 760px;
        margin: 40px auto;
        background: var(--surface);
        border: 1px solid var(--mist);
        border-radius: 10px;
        box-shadow: var(--shadow);
        padding: clamp(24px, 5vw, 52px);
      }
      .eyebrow {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        border-radius: 6px;
        background: var(--blue-soft);
        color: var(--blue-on);
        padding: 6px 12px;
        font-size: 12px;
        font-weight: 700;
        letter-spacing: 0.02em;
      }
      h1 {
        margin: 18px 0 0;
        font-size: clamp(30px, 5vw, 44px);
        line-height: 1.05;
        letter-spacing: -0.04em;
        font-weight: 700;
      }
      .lead {
        margin: 14px 0 0;
        color: var(--graphite);
        font-size: 18px;
        line-height: 1.5;
      }
      .meta {
        display: flex;
        flex-wrap: wrap;
        gap: 8px 22px;
        margin-top: 20px;
        padding-top: 18px;
        border-top: 1px solid var(--mist);
        color: var(--muted);
        font-size: 14px;
      }
      .meta b { color: var(--graphite); font-weight: 600; }
      h2 {
        margin: 38px 0 0;
        font-size: 23px;
        letter-spacing: -0.02em;
        font-weight: 600;
      }
      h2 + p, h2 + ul { margin-top: 12px; }
      p { margin: 14px 0 0; color: var(--graphite); }
      ul { margin: 16px 0 0; padding-left: 0; list-style: none; }
      li {
        position: relative;
        padding-left: 26px;
        margin-top: 10px;
        color: var(--graphite);
      }
      li::before {
        content: "";
        position: absolute;
        left: 6px;
        top: 11px;
        width: 6px;
        height: 6px;
        border-radius: 50%;
        background: var(--blue);
      }
      .callout {
        margin-top: 20px;
        border: 1px solid var(--mist);
        border-left: 3px solid var(--blue);
        border-radius: 8px;
        background: var(--ivory);
        padding: 16px 18px;
      }
      .callout strong { color: var(--ink); }
      .stats {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 14px;
        margin-top: 20px;
      }
      .stat {
        border: 1px solid var(--mist);
        border-radius: 8px;
        background: var(--ivory);
        padding: 16px;
      }
      .stat .n {
        font-size: 32px;
        font-weight: 700;
        letter-spacing: -0.04em;
        color: var(--blue);
      }
      .stat .k { margin-top: 4px; color: var(--muted); font-size: 13px; }
      table {
        width: 100%;
        border-collapse: collapse;
        margin-top: 16px;
        font-size: 15px;
      }
      th {
        text-align: left;
        padding: 11px 14px;
        color: var(--muted);
        font-size: 12px;
        font-weight: 700;
        letter-spacing: 0.04em;
        text-transform: uppercase;
        border-bottom: 1px solid var(--mist);
      }
      td {
        padding: 10px 14px;
        border-bottom: 1px solid var(--stone);
        color: var(--graphite);
      }
      td.num { font-family: "JetBrains Mono", monospace; text-align: right; }
      .tag {
        display: inline-flex;
        padding: 3px 9px;
        border-radius: 6px;
        font-size: 12px;
        font-weight: 600;
      }
      .tag.up { background: var(--green-soft); color: var(--green); }
      .tag.flat { background: var(--stone); color: var(--muted); }
      footer {
        margin-top: 36px;
        padding-top: 18px;
        border-top: 1px solid var(--mist);
        color: var(--faint);
        font-size: 13px;
      }
      @media (max-width: 640px) {
        .sheet { margin: 0; border-radius: 0; border-left: 0; border-right: 0; }
        .stats { grid-template-columns: 1fr; }
        body { font-size: 15px; }
      }
    </style>
  </head>
  <body>
    <article class="sheet">
      <!-- содержимое документа: eyebrow, h1, lead, meta, stats, h2-разделы,
           списки, callout, таблица, footer — используйте только то, что нужно документу -->
    </article>

    <script>
      // Тема автоматически следует за окружением — без ручного переключателя.
      // • Внутри Plank она отслеживает тему приложения (которая может отличаться от системной)
      //   и обновляется в реальном времени, когда вы переключаете тему при открытом файле.
      // • Сам по себе (скачанный или присланный) файл следует за настройкой системы и
      //   реагирует в реальном времени, если вы меняете тему системы.
      (function () {
        var root = document.documentElement;
        // Тема, заданная приложением; когда она задана, она важнее системной настройки.
        var override = null;
        var mql =
          window.matchMedia &&
          window.matchMedia("(prefers-color-scheme: dark)");
        function apply() {
          root.setAttribute(
            "data-theme",
            override || (mql && mql.matches ? "dark" : "light"),
          );
        }
        apply();
        if (mql) {
          var onChange = function () { apply(); };
          if (mql.addEventListener) mql.addEventListener("change", onChange);
          else if (mql.addListener) mql.addListener(onChange);
        }
        window.addEventListener("message", function (e) {
          var d = e && e.data;
          if (
            d &&
            d.type === "plank:set-theme" &&
            (d.theme === "dark" || d.theme === "light")
          ) {
            override = d.theme;
            apply();
          }
        });
      })();
    </script>
  </body>
</html>

Изображения и имена файлов

Два простых правила делают HTML-документы переносимыми и удобными для поиска. Они касаются каждого создаваемого вами HTML-файла, а не только дашбордов.

Ссылайтесь на изображения по пути относительно папки самого HTML-файла. chart.png загружается из той же папки, images/q4.png — из подпапки, ../shared/logo.png — на уровень выше. Пути отсчитываются не от корня рабочего пространства, и ведущий слеш (/chart.png) тоже разрешается относительно папки самого файла, а не корня. Поэтому держите изображение рядом с HTML (или в подпапке) и ссылайтесь на него относительным путём; абсолютный или корневой URL тихо не загрузится. (Для дашбордов полные правила по ресурсам есть в разделе Интерактивные HTML-панели.)

Давайте каждому HTML-файлу описательное, отражающее содержимое имяq4-revenue-report.html, acme-invoice.html — а не общий index.html. Рабочее пространство накапливает множество HTML-файлов в множестве папок, и здесь нет соглашения об index.html как точке входа по умолчанию; именно имя помогает различать файлы в списках и поиске.

Проверьте русский перед тем, как передать документ

Русский документ, в котором вместо «ёлочек» стоят "прямые кавычки", вместо тире — дефис, а ё пропущена, читается как чужой, как бы хорошо он ни был написан. Это не вопрос вкуса, поэтому это проверяется, а не запоминается — тем же инструментом, что проверяет презентации: он принимает и HTML-файл:

mkdir -p /workspace/scripts/deck
curl -sSfL -o /workspace/scripts/deck/plank_deck_qa.py https://plank.md/help/assets/plank_deck_qa.py
python3 /workspace/scripts/deck/plank_deck_qa.py квартальный-отчёт.html

В этом режиме ничего не рендерится, поэтому LibreOffice не нужен: инструмент читает видимый текст, пропускает <script>, <style> и <code> и сообщает про кавычки, тире, диапазоны, формат чисел, неразрывные пробелы и пропущенную ё. При ошибке код возврата ненулевой, так что инструмент встраивается в тот же цикл «собрать → проверить → исправить». Чего он не проверяет — это сам текст; что именно оставлено за скобками и почему, написано в разделе Проверка готовой презентации.

Эта же команда проверяет и схемы в файле. Встроенный <svg>, залитый буквальным цветом вместо токена или оставшийся без доступного имени, — это тоже ошибка, причём в английском документе ровно так же, как в русском. Правила собраны на странице Схемы; исправляйте найденное тем же порядком.

Хотите что-то другое?

Это значение по умолчанию, а не правило. Формат всегда под вашим контролем:

  • Нужен markdown (или PDF, или Word)? Просто скажите — «дай мне это в markdown» — и вы это получите.
  • Есть свой фирменный стиль или HTML-шаблон? Укажите Plank на него, и он будет использовать ваш.
  • Хотите, чтобы это закрепилось на всё рабочее пространство? Добавьте строку в файл AGENTS.md этого пространства — например, «Документы: обычный markdown» или «Документы: использовать templates/report.html». Plank читает AGENTS.md и следует вашему предпочтению вместо этого значения по умолчанию каждый раз в этом пространстве.