feat(skills): ship ue-design-skills bundle, licensing and delivery gate
Phase 0 of the handoff plan, as a marketplace rather than a flat skills/ directory. Content moved out of the LyraResearch archive and depersonalised: addresses stay in the archive, recipes ship. - plugins/ue-design-skills: 17 skills, 232 failure-mode entries, each with the six required fields; catalog.json as the harness-neutral source of truth and .claude-plugin/ as one adapter over it. - _gate: 16 rules, one poisoned fixture per rule, plus surface coverage so a declared file cannot silently miss the line rules. - ADR-0002 (harness-neutral bundle behind a marketplace) and ADR-0003 (split licensing: CC BY-ND 4.0 prose, Apache-2.0 code and metadata). - LICENSE files at both levels, CONTRIBUTING.md, docs/licensing-options.md as the material the licence decision grew from. Verified: gate.py 0 violations; test_gate.py 16/16 rules redden on their fixtures with a clean baseline and 2 root files reaching the line rules. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
---
|
||||
status: accepted
|
||||
date: 2026-09-02
|
||||
deciders: project owner
|
||||
consulted: LyraResearch depersonalization pilot
|
||||
informed: future contributors
|
||||
---
|
||||
|
||||
# Harness-neutral skill bundle behind a marketplace
|
||||
|
||||
## Context and Problem Statement
|
||||
|
||||
The `skills/` component of `ue-toolchain` is not speculative work: it already exists as
|
||||
18 skill bundles in the `LyraResearch` archive, grown from a line-by-line audit of a
|
||||
first-party UE 5.6 sample. What is new is turning them into something a stranger can
|
||||
install.
|
||||
|
||||
Two forces pull against each other.
|
||||
|
||||
**Distribution wants a vendor format.** Agent runners discover plugins through their own
|
||||
manifest, in their own directory, with their own rules — component directories must sit
|
||||
at the plugin root, and paths outside it are rejected. Writing to one such format is the
|
||||
only way to get a one-command install today.
|
||||
|
||||
**The product must outlive that vendor.** The owner's constraint is explicit: *"не
|
||||
привязывайся к клоду... инструмент должен нормально работать с любым харнесом или
|
||||
агентом."* A skill that says "run this vendor command" is not portable content, it is a
|
||||
script for one runner.
|
||||
|
||||
There is also a physical question. An agent runner copies the entire plugin root into its
|
||||
cache on install. If the plugin root is the repository root, then the UE C++ plugin, the
|
||||
MCP server and `examples/` are copied too — for a bundle whose actual payload is
|
||||
Markdown. The precedent is measured: the VibeUE plugin copied into the reference project
|
||||
weighs 161 MB.
|
||||
|
||||
## Decision Drivers
|
||||
|
||||
- **Content portability is a property of the files, not of the installer.** It has to be
|
||||
checkable, or it will rot on the first convenient exception.
|
||||
- **One vendor adapter must not become the interface.** Adding a second harness must not
|
||||
require editing a single file under `skills/`.
|
||||
- **The install surface should carry only what it delivers.** Source trees for the editor
|
||||
plugin and the MCP server are not part of a documentation bundle.
|
||||
- **Discoverability without a runtime.** A harness that has never heard of any plugin
|
||||
format still needs to know what is in here and when to reach for each piece.
|
||||
|
||||
## Considered Options
|
||||
|
||||
1. **Whole repository is one plugin.** Vendor manifest at the repo root, `skills/` beside
|
||||
`Engine/` and `mcp-server/`.
|
||||
2. **Separate repository for the skills.** Independent versioning and release cadence.
|
||||
3. **Repository is a marketplace; the bundle is a subdirectory.**
|
||||
|
||||
## Decision Outcome
|
||||
|
||||
Chosen: **option 3**, with a neutral catalog inside the bundle.
|
||||
|
||||
```text
|
||||
ue-toolchain/
|
||||
├── .claude-plugin/marketplace.json one adapter, points at the bundle
|
||||
└── plugins/ue-design-skills/ the bundle, and the whole install surface
|
||||
├── catalog.json source of truth: what is here, when to use it
|
||||
├── .claude-plugin/plugin.json the same adapter, one level down
|
||||
├── skills/<name>/SKILL.md plain Markdown + YAML frontmatter
|
||||
└── _gate/ rules, poisoned fixtures, self-test
|
||||
```
|
||||
|
||||
Three commitments follow:
|
||||
|
||||
**The catalog is the source of truth; the vendor manifest is an adapter.** `catalog.json`
|
||||
lists every skill with `id`, `path`, `entry`, `description`, `use_when` and its
|
||||
references. Any harness can read it, or ignore it and load the directory as context. A
|
||||
second adapter is a new file beside the first, never an edit under `skills/`.
|
||||
|
||||
**Skill content names no harness.** Not the vendor, not its path variables, not its
|
||||
command syntax. The rule holds for everything under `skills/`; the adapter directories are
|
||||
exempt because being vendor-specific is their entire job.
|
||||
|
||||
**Both commitments are enforced, not documented.** They became gate rules P13 and P14 the
|
||||
same hour the decision was made. A portability promise that lives only in an ADR is a
|
||||
promise nobody checks.
|
||||
|
||||
### Consequences
|
||||
|
||||
- Good: the install surface holds only Markdown, JSON and the gate. C++ and examples stay
|
||||
out of the plugin cache.
|
||||
- Good: skills release on their own cadence, before the editor plugin (phase 1) and the
|
||||
MCP server (phase 2) exist.
|
||||
- Good: the neutrality claim is falsifiable — a single grep decides it.
|
||||
- Bad: the layout is one level deeper than the component table in the handoff implies
|
||||
(`plugins/ue-design-skills/`, not `skills/`). The README is updated to match.
|
||||
- Bad: two manifests describe the same bundle. They will drift unless the catalog stays
|
||||
authoritative and adapters are generated or reviewed against it.
|
||||
- Neutral: nothing here prevents later extraction into its own repository. The bundle is
|
||||
self-contained by construction — the gate rejects any link that escapes a skill
|
||||
directory, so it moves with a `mv`. That was verified when it moved out of the archive.
|
||||
|
||||
## Confirmation
|
||||
|
||||
Checked at the time of writing, and required for every later change:
|
||||
|
||||
- `claude plugin validate . --strict` passes at the marketplace root and at the bundle
|
||||
root. *(passing)*
|
||||
- `python _gate/gate.py .` reports zero violations on the bundle. *(passing, 14 rules)*
|
||||
- `python _gate/test_gate.py` reports every rule reddening on its own poisoned fixture
|
||||
with a clean baseline. A rule that never reddens is treated as absent and fails the
|
||||
build. *(passing, 14/14)*
|
||||
- No file under `skills/` matches the harness token list — vendor names, vendor path
|
||||
variables, vendor command syntax. *(P13)*
|
||||
- Every skill directory has a catalog entry whose `path` holds a `SKILL.md`, and the
|
||||
catalog names no skill that is absent. *(P14, both directions)*
|
||||
- Adding a second harness adapter changes no file under `skills/`. *(structural; re-check
|
||||
when the second adapter is written)*
|
||||
|
||||
## Deferred
|
||||
|
||||
- **Which second adapter comes first.** Not guessed. It will be written when a real
|
||||
harness needs it, and it will be the test of whether the catalog was actually enough.
|
||||
- **License.** ~~Still open (handoff question 2). Deliberately *removed* from
|
||||
`catalog.json` and the vendor manifest rather than filled in with the planned value: a
|
||||
license asserted in shipped metadata before it is chosen is a claim with no author.~~
|
||||
**Resolved by [ADR-0003](0003-split-licensing-prose-and-code.md)**: prose CC BY-ND 4.0,
|
||||
code and metadata Apache-2.0, holder named. The original wording is kept struck through
|
||||
rather than deleted — the reason the field was left empty is part of how it was filled.
|
||||
- **Whether the addressed audits are ever published.** For now the delivery carries
|
||||
detection recipes and stable entry identifiers; the source addresses stay in the
|
||||
research archive, where `_tools/resolve_id.py` resolves any identifier back to the file
|
||||
and line it came from.
|
||||
@@ -0,0 +1,147 @@
|
||||
---
|
||||
status: accepted
|
||||
date: 2026-09-03
|
||||
deciders: project owner
|
||||
consulted: licence text review (CC BY-ND 4.0 legal code, Apache-2.0, PolyForm family)
|
||||
informed: future contributors, studios adopting the bundle
|
||||
---
|
||||
|
||||
# Split licensing: CC BY-ND 4.0 for prose, Apache-2.0 for code
|
||||
|
||||
## Context and Problem Statement
|
||||
|
||||
Handoff question 2 has been open since 2026-09-01. ADR-0002 deliberately *removed*
|
||||
`license` from the shipped metadata rather than filling in the planned value, on the
|
||||
grounds that a licence asserted before it is chosen is a claim with no author. That left
|
||||
the bundle shippable but not releasable.
|
||||
|
||||
The owner's requirements, stated directly:
|
||||
|
||||
> Free use by studios · my name credited, including in game credits · no forking my work
|
||||
> into someone else's product without permission, commercial ones especially · no claim
|
||||
> over the games and code built with the tool.
|
||||
|
||||
Translated into licensing terms: a grant on **use** including commercial (R1); attribution
|
||||
triggered by **use** (R2); a restriction on **Share Adapted Material** (R3); an explicit
|
||||
**output** carve-out (R4).
|
||||
|
||||
R1 and R3 are compatible: they govern different acts. Using a work and republishing a
|
||||
modified version of it are separate permissions, and granting the first while withholding
|
||||
the second is an ordinary construction.
|
||||
|
||||
**R2 as stated is not achievable through any licence.** Attribution obligations attach to
|
||||
distribution. A studio that reads the skills, applies them and ships a game has
|
||||
distributed nothing, so no licence term can reach that act. This was measured against the
|
||||
candidate texts rather than assumed, and the owner withdrew the requirement once the
|
||||
mechanism was clear, replacing it with a request in the README.
|
||||
|
||||
## Decision Drivers
|
||||
|
||||
- **The bundle is prose, not software.** ~19 000 lines of hand-written norms and recipes.
|
||||
Licences written for code do not carry the obligations prose needs.
|
||||
- **Phase 1 puts C++ in this repository.** A restriction that is tolerable on a document
|
||||
is expensive on code a studio compiles into its editor. Licences cannot be changed
|
||||
retroactively for those who already took the work.
|
||||
- **Adoption is the point.** A restriction that sends every studio's legal department into
|
||||
review defeats R1 more effectively than a permissive licence defeats R3.
|
||||
- **The bundle's own doctrine constrains the licence.** It instructs the reader to verify
|
||||
every recipe against their own tree. Forbidding publication of the correction would make
|
||||
the delivery contradict its content.
|
||||
|
||||
## Considered Options
|
||||
|
||||
1. **MIT or Apache-2.0 throughout.** Fails R3 explicitly: both permit commercial forks.
|
||||
2. **CC BY 4.0 throughout.** Real attribution on redistribution, but derivatives allowed.
|
||||
3. **CC BY-NC.** Blocks commercial *use*, which is R1's audience. The owner's objection is
|
||||
to commercial forks, not commercial users; NC is aimed at the wrong act.
|
||||
4. **PolyForm Internal Use.** Fits R1 and R3 closely, but is little known; an unfamiliar
|
||||
licence more often produces a refusal than a question.
|
||||
5. **A bespoke four-clause licence.** Delivers R1–R4 including credits, at the cost of
|
||||
mandatory legal review at every adopting studio — the cost falls precisely on R1.
|
||||
6. **Split: CC BY-ND 4.0 for prose, Apache-2.0 for code and metadata.**
|
||||
|
||||
## Decision Outcome
|
||||
|
||||
Chosen: **option 6**, with seven explicit additional permissions.
|
||||
|
||||
Copyright holder: **MagentaDolphin**, a pseudonym under which the owner publishes.
|
||||
Section 3(a)(1)(A)(i) of the licence provides for attribution by pseudonym, so this is a
|
||||
supported form rather than a compromise, and substituting a legal name later refines the
|
||||
same holder rather than changing licence. Publisher: **Kodlo.art**, recorded in
|
||||
`catalog.json`. Collective pseudonyms were rejected for the copyright line: naming a
|
||||
holder that stands for several people asserts joint ownership, and every later act — a
|
||||
relicence, a translation grant, an enforcement — would then require their agreement.
|
||||
|
||||
| Surface | Licence |
|
||||
|---|---|
|
||||
| `plugins/ue-design-skills/` prose: `SKILL.md`, `references/`, `README.md` | CC BY-ND 4.0 |
|
||||
| `catalog.json`, `.claude-plugin/plugin.json` | Apache-2.0 |
|
||||
| `_gate/` | Apache-2.0 |
|
||||
| Shell commands inside `Detect` fields | Apache-2.0 |
|
||||
| Editor plugin, MCP server, installer (phases 1–3) | Apache-2.0 |
|
||||
|
||||
Additional permissions in `plugins/ue-design-skills/LICENSE`, each widening the grant:
|
||||
metadata, gate and Detect commands are Apache-2.0; format adapters may be published;
|
||||
translations may be published under stated conditions; private adaptation is restated as
|
||||
already permitted; contributions via fork-and-pull are permitted.
|
||||
|
||||
**Attribution in game credits is a request in the README, not a licence condition.** It is
|
||||
written as a request so that nobody mistakes it for an obligation they have breached.
|
||||
|
||||
### Consequences
|
||||
|
||||
- Good: R1, R3 and R4 hold. Commercial use is free; republishing modified prose is not;
|
||||
nothing is claimed over what users build.
|
||||
- Good: the carve-outs keep ADR-0002 intact. A second harness adapter is explicitly
|
||||
permitted, so the neutrality commitment is not quietly revoked by the licence.
|
||||
- Good: the code path stays permissive before any code exists, so phase 1 does not force
|
||||
a retroactive change.
|
||||
- Bad: two licences in one repository require explanation. Mitigated by stating the
|
||||
boundary in three places — both `LICENSE` files and both READMEs.
|
||||
- Bad: CC BY-ND is not an OSI-approved open-source licence. Some organisations restrict
|
||||
non-OSI content by policy. This is the accepted price of R3.
|
||||
- Bad: R2 as originally stated is not delivered. Recorded here so that the gap is visible
|
||||
rather than assumed closed.
|
||||
- Neutral: the licence is irrevocable. Anyone who takes the work under these terms keeps
|
||||
them. True of any licence, more expensive to get wrong with a restrictive one.
|
||||
|
||||
## Confirmation
|
||||
|
||||
Checked at the time of writing, and required for every later change:
|
||||
|
||||
- `claude plugin validate . --strict` passes at the marketplace root and the bundle root.
|
||||
*(passing; `publisher` and `license` were rejected inside marketplace `metadata` and
|
||||
moved to `catalog.json`, which is the source of truth per ADR-0002)*
|
||||
- `python _gate/gate.py .` reports zero violations with both LICENSE files in place.
|
||||
*(passing)*
|
||||
- `python _gate/test_gate.py` reports every rule reddening on its own fixture, plus every
|
||||
file in `SCAN_ROOT_FILES` reaching the line-level rules. *(passing, 16 rules, 2 root
|
||||
files)*
|
||||
- The donor name inside the LICENSE `PROVENANCE` banner passes; the same name one line
|
||||
outside it fires P03. *(verified in both directions)*
|
||||
- Licence texts are the canonical ones, fetched from `apache.org` and
|
||||
`creativecommons.org` rather than transcribed.
|
||||
|
||||
### A gate defect found by this work
|
||||
|
||||
`LICENSE` was declared in the gate's `SCAN_ROOT_FILES` from the start, and the line-level
|
||||
rules filtered it out one line later because they matched on file extension and `LICENSE`
|
||||
has none. A `LICENSE` carrying an absolute path, a source citation, the donor name,
|
||||
Cyrillic and a wikilink passed the gate green — verified by poisoning it before the fix.
|
||||
|
||||
This is the gate's own P08 shape: a check whose condition could not become true, on the
|
||||
one file a lawyer reads. The fix treats declared root files as text whatever their suffix,
|
||||
and the self-test now asserts surface coverage separately from rule coverage — proving not
|
||||
just that each rule *can* fire, but that each file the gate *claims* to scan actually
|
||||
reaches the rules. Reverting the fix reddens the suite, which was checked.
|
||||
|
||||
## Deferred
|
||||
|
||||
- **Whether the repository is public.** Handoff question 1, still open. The licence choice
|
||||
does not decide it.
|
||||
- **A legal review of the UE EULA question.** The bundle ships no third-party source, no
|
||||
file addresses and no verbatim excerpts, and the gate enforces the first two. That
|
||||
lowers the risk and is not a legal determination. If the release is public, this needs
|
||||
someone qualified.
|
||||
- **Whether to register the pseudonym to a legal name.** Not required to publish; a
|
||||
refinement of the same holder when it happens.
|
||||
@@ -0,0 +1,236 @@
|
||||
# Выбор лицензии: варианты и что они означают
|
||||
|
||||
**Статус:** ~~решение не принято~~ — **решено 2026-09-03**,
|
||||
[ADR-0003](architecture/decisions/0003-split-licensing-prose-and-code.md): проза
|
||||
бандла CC BY-ND 4.0, код и метаданные Apache-2.0, правообладатель — MagentaDolphin.
|
||||
Документ сохраняется как материал, из которого решение выросло: §§1–6 ниже описывают
|
||||
состояние **до** выбора, включая отсутствовавший тогда `LICENSE`. Читать как разбор
|
||||
вариантов, не как состояние репозитория.
|
||||
**Открытый вопрос:** №2 из `handoff.md` — закрыт.
|
||||
**Это не юридическое заключение.** Автор документа не имеет квалификации его дать.
|
||||
|
||||
---
|
||||
|
||||
## 0. Состояние на сейчас
|
||||
|
||||
| Что | Значение |
|
||||
|---|---|
|
||||
| Файл `LICENSE` в репозитории | отсутствует **[изм]** |
|
||||
| `README.md:25` | «TBD (планируется MIT)» **[изм]** |
|
||||
| `plugin.json` → `author.name` | `"ue-design-skills"` — заглушка, автором значится сам бандл **[изм]** |
|
||||
| Поле `license` в манифестах | отсутствует; удалено намеренно (ADR-0002) **[изм]** |
|
||||
| Правообладатель | **не определён** |
|
||||
|
||||
Лицензируемый объект сегодня — бандл `plugins/ue-design-skills`: ~19 000 строк
|
||||
авторской прозы, 232 записи с рецептами обнаружения, 335 блоков кода (в
|
||||
подавляющем большинстве — команды поиска и публичный API движка), плюс скрипт
|
||||
гейта `_gate/` на Python.
|
||||
|
||||
Через фазу 1 к этому добавится **C++-модуль UE и MCP-сервер**. Это меняет расчёт
|
||||
и разобрано в §6.
|
||||
|
||||
---
|
||||
|
||||
## 1. Требования владельца, переведённые в лицензионные термины
|
||||
|
||||
Сформулировано владельцем:
|
||||
|
||||
> Свободное использование студиями · упоминание имени, в том числе в титрах ·
|
||||
> никакого форка в чужие продукты без разрешения, тем более коммерческие ·
|
||||
> никаких претензий на игры и код, созданные с помощью инструмента.
|
||||
|
||||
В терминах, которыми оперируют лицензии:
|
||||
|
||||
| № | Требование | Лицензионный термин |
|
||||
|---|---|---|
|
||||
| **R1** | студии, включая коммерческие, пользуются свободно | грант на **use**, без ограничения по коммерческому характеру |
|
||||
| **R2** | имя указано, в том числе в титрах игры | **attribution**, причём с триггером на *использование*, а не на распространение |
|
||||
| **R3** | нельзя форкать в свой продукт без разрешения | запрет на **Share Adapted Material** / **redistribution** |
|
||||
| **R4** | претензий на созданное с помощью инструмента нет | явная **output clause** |
|
||||
|
||||
---
|
||||
|
||||
## 2. Главное различие, вокруг которого всё вращается
|
||||
|
||||
**Использование — не распространение.** Почти все лицензионные обязанности
|
||||
привязаны ко второму.
|
||||
|
||||
- Студия читает скилы, проектирует по ним систему, выпускает игру. **Ничего
|
||||
вашего наружу не ушло.** Ни одна лицензия здесь ничего не требует.
|
||||
- Студия берёт бандл, переписывает под себя и публикует как свой продукт. **Вот
|
||||
здесь** лицензия работает, и здесь живёт R3.
|
||||
|
||||
Отсюда следствие, которое важно принять до выбора строки в таблице:
|
||||
|
||||
> **R1 и R3 совместимы** — они про разные действия. Свободно пользоваться и не
|
||||
> иметь права перевыпускать — нормальная, часто встречающаяся конструкция.
|
||||
>
|
||||
> **R2 в лицензионной форме недостижим.** Ни одна из существующих лицензий не
|
||||
> обязывает упоминать автора в титрах игры, при создании которой инструмент
|
||||
> просто использовали. Обязанность атрибуции срабатывает при распространении
|
||||
> копии, а копия здесь не распространяется. **[выв]**
|
||||
|
||||
Это не придирка к формулировке. Это разница между «в лицензии написано» и «есть
|
||||
механизм, который заставит».
|
||||
|
||||
---
|
||||
|
||||
## 3. Требование R2: чем его закрывают на практике
|
||||
|
||||
Раз лицензия не даёт, перечислю то, что даёт — по убыванию силы.
|
||||
|
||||
| Механизм | Как работает | Чего стоит |
|
||||
|---|---|---|
|
||||
| **Договор** | студия подписывает условия использования, где атрибуция в титрах — обязательство | требует переговоров с каждой студией; убивает «скачал и работай» |
|
||||
| **Двойное лицензирование** | бесплатная лицензия с ограничением + платная/свободная по запросу, в обмен на атрибуцию | рабочая схема, но это уже бизнес-процесс, а не файл в репозитории |
|
||||
| **Пункт-рекомендация в README** | «если это помогло — упомяните в титрах» | ноль принуждения, ненулевой эффект; студии этим пользуются добровольно чаще, чем кажется |
|
||||
| **Историческая advertising clause** (BSD-4-Clause) | требовала упоминания «во всех рекламных материалах» | пункт признан вредным и отозван Беркли; вызывает несовместимость и отказ юротделов |
|
||||
| **Атрибуция при распространении** (CC BY / Apache NOTICE) | обязательна, но только когда копию передают дальше | закрывает форки и маркетплейсы, **не** закрывает титры игры |
|
||||
|
||||
Практический вывод: атрибуция в титрах достижима как **норма сообщества плюс
|
||||
условие для тех, кто просит расширенных прав**, а не как строка лицензии. **[выв]**
|
||||
|
||||
---
|
||||
|
||||
## 4. Кандидаты против четырёх требований
|
||||
|
||||
Легенда: ✅ даёт · ⚠️ даёт частично · ❌ не даёт или противоречит.
|
||||
|
||||
| Лицензия | R1 свободное использование | R2 титры | R3 запрет форка | R4 выход свободен | Что это на самом деле означает |
|
||||
|---|---|---|---|---|---|
|
||||
| **MIT** | ✅ | ❌ | ❌ | ✅ | Форк в коммерческий продукт разрешён явно. Прямо противоречит R3 |
|
||||
| **Apache-2.0** | ✅ | ⚠️ `NOTICE` при распространении | ❌ | ✅ | То же, что MIT, плюс патентный грант и пометки об изменениях. R3 не закрывает |
|
||||
| **CC BY 4.0** | ✅ | ⚠️ при распространении | ❌ | ✅ | Сделана для текста, атрибуция реальна — но производные разрешены, включая коммерческие |
|
||||
| **CC BY-SA 4.0** | ✅ | ⚠️ | ⚠️ форк разрешён, но обязан остаться открытым под SA | ✅ | Не запрещает форк, а заражает его. Для внутренних вики студий — стоп-сигнал юротдела |
|
||||
| **CC BY-ND 4.0** | ✅ | ⚠️ при распространении | ✅ | ✅ | **Ближайшее совпадение по смыслу.** В версии 4.0 адаптации создавать *можно*, нельзя **Share** их. Студия правит под себя внутри — законно; публикует свою версию — нет |
|
||||
| **CC BY-NC 4.0** | ❌ | ⚠️ | ⚠️ | ✅ | Запрещает коммерческое использование — отсекает ровно ту аудиторию, которая нужна по R1 |
|
||||
| **PolyForm Noncommercial** | ❌ | ❌ | ✅ | ✅ | Та же ошибка, что у NC: блокирует коммерческие студии |
|
||||
| **PolyForm Internal Use** | ✅ | ❌ | ✅ | ✅ | «Пользуйтесь для своих нужд, но не поставляйте другим». Точно ложится на R1+R3 |
|
||||
| **PolyForm Shield** | ✅ | ❌ | ⚠️ запрещает только конкуренцию с автором | ✅ | Широкое принятие, блокируются лишь прямые конкуренты. Мягче, чем R3 |
|
||||
| **CC0 / public domain** | ✅ | ❌ | ❌ | ✅ | Отказ от всего, включая имя |
|
||||
| **Проприетарная / своя** | по вашему усмотрению | можно вписать | можно вписать | можно вписать | Единственный способ получить ровно R1–R4. Цена — в §5 |
|
||||
|
||||
Замечания к таблице:
|
||||
|
||||
- **CC для кода использовать не следует** — это позиция самой Creative Commons.
|
||||
Если выбор уходит в CC-семейство, гейт и будущий C++-модуль всё равно требуют
|
||||
отдельной строки.
|
||||
- **PolyForm-лицензии не одобрены OSI** — все накладывают ограничение по области
|
||||
использования. То же верно для всех CC, кроме CC0/BY/BY-SA.
|
||||
- **CC BY-ND 4.0 — не то же самое, что ND 3.0.** В 3.0 создание адаптации было
|
||||
за пределами гранта; в 4.0 адаптации явно разрешены, пока их не публикуют.
|
||||
Общая страница CC об этом до сих пор пишет по-старому, авторитетен здесь текст
|
||||
legal code, а не сводка.
|
||||
|
||||
---
|
||||
|
||||
## 5. Три реалистичные комбинации
|
||||
|
||||
### Вариант A — CC BY-ND 4.0 на тексты, Apache-2.0 на код
|
||||
|
||||
Что получает пользователь: читает, применяет, правит под себя внутри студии;
|
||||
опубликовать свою версию бандла не может; код гейта и будущего плагина берёт
|
||||
свободно.
|
||||
|
||||
- **R1** ✅ · **R3** ✅ · **R4** ✅ · **R2** — только атрибуция при
|
||||
распространении, титры остаются просьбой в README.
|
||||
- Готовые тексты, ничего сочинять не нужно.
|
||||
- Минус: нужно объяснять границу «текст/код» в каждом обсуждении. Минус второй:
|
||||
ND-лицензия закрывает и *дружественный* вклад — исправление в вашем тексте
|
||||
нельзя опубликовать даже как pull request-форк.
|
||||
|
||||
### Вариант B — PolyForm Internal Use на бандл, Apache-2.0 на код
|
||||
|
||||
Формулировка «пользуйтесь для внутренних операций своей компании, но не
|
||||
поставляйте другим» ближе к вашей интонации, чем язык авторского права CC.
|
||||
|
||||
- **R1** ✅ · **R3** ✅ · **R4** ✅ · **R2** ❌ полностью.
|
||||
- Минус: лицензия малоизвестна, юротдел студии её читает целиком, а незнакомая
|
||||
лицензия чаще приводит к отказу, чем к вопросу. **[гип]**
|
||||
|
||||
### Вариант C — своя лицензия из четырёх пунктов
|
||||
|
||||
Ровно R1–R4, включая пункт про титры и пункт «на созданное с помощью инструмента
|
||||
претензий нет».
|
||||
|
||||
- **R1–R4** ✅ на бумаге.
|
||||
- Минус, который перевешивает: **каждая студия обязана провести юридическую
|
||||
проверку**, а нестандартная лицензия — типовая причина автоматического отказа
|
||||
во внутренних политиках. Свободное распространение по R1 упирается ровно в это.
|
||||
Плюс текст должен написать юрист, иначе неоднозначность будет толковаться не в
|
||||
вашу пользу.
|
||||
|
||||
---
|
||||
|
||||
## 6. Что изменится в фазе 1 и почему это важно решить сейчас
|
||||
|
||||
Сегодня продукт — текст. После фазы 1 в том же репозитории появится **C++-модуль
|
||||
UE и MCP-сервер**, то есть код, который студия компилирует внутрь своего
|
||||
редактора.
|
||||
|
||||
Отсюда два следствия **[выв]**:
|
||||
|
||||
1. **Ограничительная лицензия на исполняемый код бьёт по принятию сильнее, чем
|
||||
на текст.** Юротдел, спокойно пропускающий документ с ограничениями, обычно
|
||||
гораздо строже к коду, попадающему в сборку.
|
||||
2. **Менять лицензию задним числом нельзя** — те, кто уже взял по прежним
|
||||
условиям, остаются на них. Поэтому раздельная схема «код свободный, тексты
|
||||
ограничены» выгоднее выбрать сразу, чем переигрывать после первого релиза.
|
||||
|
||||
---
|
||||
|
||||
## 7. Правообладатель
|
||||
|
||||
Любой из вариантов начинается со строки `Copyright (c) 2026 <ПРАВООБЛАДАТЕЛЬ>`.
|
||||
|
||||
| Форма | Когда уместна |
|
||||
|---|---|
|
||||
| Настоящее имя физлица | автор один; самая простая и внятная форма |
|
||||
| Псевдоним / handle | если публичность имени нежелательна; авторство труднее доказывать при споре |
|
||||
| Юрлицо | если работа сделана в рамках компании — тогда выбор может быть и не ваш |
|
||||
| `<project> contributors` | принято при нескольких авторах; сейчас это описание будущего, а не факт |
|
||||
|
||||
Имя правообладателя не выводится из содержимого репозитория и не может быть
|
||||
подставлено по умолчанию. Требование R2 — про **это** имя, поэтому пока оно не
|
||||
названо, R2 не реализуемо ни одним из механизмов §3.
|
||||
|
||||
---
|
||||
|
||||
## 8. Слой, который выбором из таблицы не закрывается
|
||||
|
||||
Содержание бандла выведено из разбора Epic Lyra, распространяемого по UE EULA.
|
||||
|
||||
Измерено: в поставке нет кода Epic, нет адресов вида `Файл.ext:строка`, нет имён
|
||||
с префиксом донора вне блоков `Provenance` (правило гейта P03, ноль нарушений).
|
||||
Присутствуют публичные имена API движка — `UPROPERTY`, `TArray`, `FGameplayTag` и
|
||||
подобные — и собственные наблюдения об архитектуре. **[изм]**
|
||||
|
||||
Это существенно снижает риск, но **не является юридическим заключением** и не
|
||||
заменяет его. Если релиз публичный — вопрос адресуется человеку с квалификацией.
|
||||
Обезличивание, уже сделанное, принималось ради качества продукта; то, что оно
|
||||
попутно уменьшает этот риск, — побочный эффект, а не доказательство. **[гип]**
|
||||
|
||||
---
|
||||
|
||||
## 9. Что требуется от владельца, чтобы закрыть вопрос
|
||||
|
||||
1. **Правообладатель** — имя в строку copyright (§7).
|
||||
2. **Комбинация** — A, B, C или иная (§5).
|
||||
3. **Форма требования о титрах** — просьба в README, условие двойного
|
||||
лицензирования, или снятие требования (§3).
|
||||
|
||||
После этого механическая часть — `LICENSE`, поле `license` в `catalog.json` и
|
||||
`plugin.json`, раздел в `README.md`, правило гейта на присутствие файла — делается
|
||||
за один заход.
|
||||
|
||||
---
|
||||
|
||||
## Источники
|
||||
|
||||
- [PolyForm Project — исходные тексты лицензий](https://github.com/polyformproject/polyform-licenses)
|
||||
- [PolyForm Noncommercial License 1.0.0](https://polyformproject.org/licenses/noncommercial/1.0.0)
|
||||
- [License Round-Up — разбор семейства PolyForm](https://writing.kemitchell.com/2021/06/20/License-Round-Up)
|
||||
- [CC BY-ND 4.0 — deed](https://creativecommons.org/licenses/by-nd/4.0/deed.en)
|
||||
- [CC 4.0 — обращение с адаптациями (wiki)](https://wiki.creativecommons.org/wiki/4.0/Treatment_of_adaptations)
|
||||
- [CC — о лицензиях](https://creativecommons.org/share-your-work/cclicenses/)
|
||||
- [CC FAQ](https://creativecommons.org/faq/)
|
||||
Reference in New Issue
Block a user