以下情境为教学假设,人物与数字不代表经核实的真实案例。
IP 归属问题通常不会在开发时爆发,而是在出售、融资、授权或发行商尽调时爆发。买方会问一句:这些代码、美术、音乐、商标,法律上是不是你的?如果答案里有「应该是」「当时说好了」「外包是我朋友」,交易就会从估值谈判变成补文件谈判。
默认规则和直觉相反:付钱不等于拥有。员工在职务范围内创作,经济权利通常归雇主;外包方创作,权利通常归外包方,除非合同明确转让;联合开发,权利通常共有,任何一方都不能单独处置;创始人创作,权利归创始人个人,公司不会因为「我是老板」自动获得。四种角色,四种默认,合同的作用是把默认值改成可交易的状态。
这一节只算归属差异的财务后果:没约定时要花多少钱重制或回购,以及出售时这部分资产值多少。它不提供法律意见,也不判断某项转让条款是否有效;所有费用都是教学假设。
默认规则:谁创作,谁拥有
| 角色 | 默认归属 | 能否自由转让 | 风险 | 典型缺口 |
|---|---|---|---|---|
| 员工 | 职务范围内通常归雇主 | 可以 | 低 | 职务外作品、既有 IP 未列明 |
| 外包 | 通常归外包方 | 不可以 | 高 | 只有使用权,没有所有权 |
| 联合开发 | 通常共有 | 需共有人同意 | 高 | 分成、授权、退出未约定 |
| 创始人 | 归创始人个人 | 不可以 | 高 | 未向公司转让,公司只有使用权 |
职务作品的默认规则对雇主有利:员工在职务范围内、使用公司资源完成的作品,经济权利通常归雇主。但「职务范围」不是无限的:员工下班后做的副业、入职前已有的代码、自己买的素材,都可能不在职务范围内。合同如果只写一句「职务作品归公司」,边界仍然要靠作品清单和职务说明来补。
外包的默认规则对发包方不利:外包方保留权利,发包方通常只拿到一份有限的使用许可。除非合同明确写转让(assignment)或职务创作(work for hire),否则你不能把外包美术当成自有资产去卖、去授权、去质押。很多团队以为「我付了钱,图就是我的」,但付款买的是服务,不是权利。
联合开发的默认规则是共有,而共有不等于可以自由使用。共有人通常需要一致同意才能转让或对外独占授权;一方想单独把共同作品授权给客户,另一方可能不同意,或者要求分成。更麻烦的是退出:一方离开后,另一方继续使用共同作品,是否需要补偿、按什么比例补偿,默认规则通常给不出答案。
创始人的默认规则最容易被忽略。公司是独立法律主体,创始人写代码、画图、做品牌,权利默认归创始人个人,不归公司。如果公司要出售、融资或被收购,买方买的是公司的资产;创始人没有把 IP 转让给公司,公司资产表里就没有这块。对一人公司,这不是形式问题,而是交易能不能成立的问题。
外包:一句归属条款值多少钱
Tidecast 的美术是外包的,按资产工作量估算占整体资产的 30%。这个 30% 是本节唯一固定的比例,其余 70% 是代码、音乐授权、商标等,不再拆分。用 14 个月开发机会成本 $84,000 作为资产重置的成本基数(教学假设,不是现金支出),美术部分的重制预算是:
美术重制预算 = $84,000 × 30% = $25,200
重制不是把钱打给外包就结束。重新找人、重新 brief、风格对齐、验收返工都会增加管理成本;教学假设按 20% 加成,管理后的重制成本是 $25,200 × 1.2 = $30,240。如果外包方已经持有权利,回购还要付溢价:教学假设溢价 50% 到 100%,回购区间是 $30,240 × 1.5 = $45,360 到 $30,240 × 2.0 = $60,480。
| 口径 | 金额 | 公式 |
|---|---|---|
| 资产重置基数 | $84,000 | 14 个月开发机会成本,教学假设 |
| 美术占比 | 30% | 本节固定比例 |
| 美术重制预算 | $25,200 | $84,000 × 30% |
| 含管理加成的重制成本 | $30,240 | $25,200 × 1.2 |
| 回购下限(50% 溢价) | $45,360 | $30,240 × 1.5 |
| 回购上限(100% 溢价) | $60,480 | $30,240 × 2.0 |
回购区间比裸重制贵 $20,160 到 $35,280,这就是「没写归属条款」的价格。合同里加一句转让条款的成本接近于零;事后回购的成本是五位数美元,而且还要看外包方是否愿意配合、权利是否已经被转卖给第三方。归属条款不是法务洁癖,它是资产可交易性的前置条件。
把镜头拉到出售场景,缺口更大。Tidecast 的整体出售锚是 1.8× 年收入 = $248,708;如果买方按资产占比把美术部分整体打折,30% 对应 $74,612。这个数字不是估值结论,而是说明量级:一句归属条款的缺失,可能对应出售价的近三成。回购区间 $45,360 到 $60,480 占这个锚的 18.2% 到 24.3%,仍然足以改变交易的现金结构。
联合开发:共有不等于可自由使用
联合开发的默认结果是共有,而共有在商业上有三个约束。第一,转让通常需要共有人同意;第二,对外独占授权通常需要共有人同意;第三,收益分配没有默认比例,除非合同写明。三个约束里,最影响交易的是第二个:买方要的是可以自由使用的资产,不是一份需要另一个共有人签字的权利。
| 安排 | 权利状态 | 能否单独转让 | 是否需要对方同意 | 商业风险 |
|---|---|---|---|---|
| 默认共有 | 双方共有 | 通常不可以 | 是 | 高,授权与退出都可能卡住 |
| 转让给一方 | 一方所有 | 可以 | 转让时一次同意 | 低,但需补偿对价 |
| 独占许可 | 一方使用,所有权仍共有 | 不可以 | 是 | 中,出售时资产仍不在表内 |
| 共同转让给公司 | 公司所有 | 可以 | 双方同意 | 低,适合准备融资或出售 |
联合开发最容易被低估的是「独占许可不等于转让」。独占许可给了你排他使用权,但所有权还在共有人手里;出售公司时,这项资产仍然不在公司资产表里。买方要么要求补转让,要么把这项资产从估值里扣掉。和 7.2 的开源许可证一样,使用权和所有权是两件事,不能用一个「可以用」掩盖「不能卖」。
联合开发的退出也需要提前写。两位创作者各占一半,一方退出时,另一方是买断、继续共有,还是把项目停掉?如果没有约定,退出谈判的筹码不是贡献比例,而是谁更需要这个项目。买断价格、支付周期、后续版本的权利,都应该在合作开始时写清楚,而不是等一方要离开时再谈。
转让链:出售时 IP 能不能跟着走
出售公司时,买方买的不是「你会做什么」,而是「公司拥有什么」。IP 转让链要能回答三个问题:每项资产是谁创作的、通过什么文件转到公司、转让是否覆盖后续修改。三个问题里任何一个断掉,资产就会在尽调里被标红。
| 资产 | 谁创作 | 当前权利 | 出售时的缺口 |
|---|---|---|---|
| 代码 | 创始人 | 若未转让,归个人 | 公司只有使用权,需补转让 |
| 外包美术 | 外包方 | 默认归外包方 | 需补转让或回购 |
| 音乐 | 外部作者 | 买断授权,不得转授权 | 不能自由转让,需重新授权 |
| 商标 | 公司或创始人 | 注册在谁名下 | 注册人与出售主体不一致需变更 |
Tidecast 的音乐是买断授权,不是自有著作权,而且不得转授权。它随游戏分发没有问题,但出售公司时不能当作可自由转让的资产;买方如果要继续使用,可能需要重新谈授权,或者由卖方保证授权可以随业务转移。IP 组合表里把音乐写成「自有」,会在尽调时变成一条需要解释的缺口。
LedgerLite 的对照更简单:一人公司,代码由创始人创作,服务商标已注册;如果创始人没有把代码转让给 Pte Ltd,公司只有使用权,出售时同样要补转让链。
转让条款还要覆盖「后续修改」。一份只转让「现有版本」的合同,可能不包含后续更新、bug 修复、衍生作品;买方买到的是旧版本,新版本仍在创作者手里。对持续更新的软件,转让条款应覆盖后续创作,或者至少约定后续作品的归属与许可。
代码:归属状态与替换成本
下面的 ownership.ts 把四种角色的默认归属、五种合同条款的结果,以及重制与回购成本固化成函数。defaultOwnership 回答「没约定时归谁」,contractedOwnership 回答「加了一条条款后归谁」,rebuildEstimate 把资产占比、管理加成和回购溢价算成区间,valueAtRisk 把同一比例应用到出售锚上。
// file: src/contract/ownership.ts
// tier: L1
// verify: node --test test/contract/ownership.test.ts
import { type Cents } from "../core/money.ts";
import { type Bps, applyRate } from "../core/rate.ts";
import { type Result, fail, ok } from "../core/result.ts";
export type CreatorRole = "employee" | "contractor" | "joint" | "founder";
export type ContractTerm =
| "none"
| "work_for_hire"
| "assignment"
| "exclusive_license"
| "joint_ownership";
export type Owner = "company" | "creator" | "shared";
export type RiskLevel = "low" | "medium" | "high";
export type OwnershipState = {
owner: Owner;
transferable: boolean;
consentRequired: boolean;
risk: RiskLevel;
note: string;
};
function isRole(value: string): value is CreatorRole {
return (
value === "employee" ||
value === "contractor" ||
value === "joint" ||
value === "founder"
);
}
function isTerm(value: string): value is ContractTerm {
return (
value === "none" ||
value === "work_for_hire" ||
value === "assignment" ||
value === "exclusive_license" ||
value === "joint_ownership"
);
}
/**
* Defaults are commercial rules of thumb, not legal advice. The common failure
* is assuming that paying someone means owning the output: contractors usually
* keep their rights unless they assign them.
*/
export function defaultOwnership(role: CreatorRole): OwnershipState {
if (role === "employee") {
return {
owner: "company",
transferable: true,
consentRequired: false,
risk: "low",
note: "职务范围内通常归雇主;职务外创作与既有 IP 要单独列明",
};
}
if (role === "contractor") {
return {
owner: "creator",
transferable: false,
consentRequired: true,
risk: "high",
note: "外包方默认保留权利;没有转让条款时,公司通常只有有限使用权",
};
}
if (role === "joint") {
return {
owner: "shared",
transferable: false,
consentRequired: true,
risk: "high",
note: "共有人通常需一致同意才能转让或对外独占授权",
};
}
return {
owner: "creator",
transferable: false,
consentRequired: true,
risk: "high",
note: "公司是独立主体;创始人未签转让时,公司不自动拥有 IP",
};
}
/** Apply one contract term on top of the default position. */
export function contractedOwnership(
role: CreatorRole,
term: ContractTerm,
): Result<OwnershipState> {
if (!isRole(role)) {
return fail(`unknown creator role: ${role}`);
}
if (!isTerm(term)) {
return fail(`unknown contract term: ${term}`);
}
if (term === "none") {
return ok(defaultOwnership(role));
}
if (term === "work_for_hire" || term === "assignment") {
return ok({
owner: "company",
transferable: true,
consentRequired: false,
risk: "low",
note:
term === "work_for_hire"
? "合同明确为职务创作,经济权利归公司;人身权与职务外作品另行核对"
: "创作者把经济权利转让给公司;须覆盖既有作品与后续修改",
});
}
if (term === "exclusive_license") {
return ok({
owner: "creator",
transferable: false,
consentRequired: true,
risk: "medium",
note: "独占许可只给使用权,所有权仍在创作者;出售公司时不在资产表内",
});
}
return ok({
owner: "shared",
transferable: false,
consentRequired: true,
risk: "high",
note: "共有安排要写清分成、授权同意与退出买断",
});
}
export type RebuildInput = {
baseCostCents: Cents;
assetShareBps: Bps;
managementOverrunBps: Bps;
buyoutPremiumLowBps: Bps;
buyoutPremiumHighBps: Bps;
};
export type RebuildEstimate = {
assetReplacementCents: Cents;
managedReplacementCents: Cents;
buyoutLowCents: Cents;
buyoutHighCents: Cents;
};
/**
* If an asset was never assigned, the company may have to rebuild it or buy it
* back. The rebuild budget is the full asset base; the share is the portion at
* risk; the overrun covers re-briefing, review and schedule pressure.
*/
export function rebuildEstimate(input: RebuildInput): Result<RebuildEstimate> {
if (!Number.isInteger(input.baseCostCents) || input.baseCostCents <= 0) {
return fail("base cost must be a positive integer amount in cents");
}
if (
!Number.isInteger(input.assetShareBps) ||
input.assetShareBps <= 0 ||
input.assetShareBps > 10000
) {
return fail("asset share must be between 1 and 10000 bps");
}
for (const [value, label, max] of [
[input.managementOverrunBps, "management overrun", 10000],
[input.buyoutPremiumLowBps, "buyout premium low", 20000],
[input.buyoutPremiumHighBps, "buyout premium high", 20000],
] as Array<[Bps, string, number]>) {
if (!Number.isInteger(value) || value < 0 || value > max) {
return fail(`${label} must be between 0 and ${max} bps`);
}
}
if (input.buyoutPremiumHighBps < input.buyoutPremiumLowBps) {
return fail("buyout premium high must not be below the low end");
}
const assetReplacementCents = applyRate(
input.baseCostCents,
input.assetShareBps,
);
const managedReplacementCents = applyRate(
assetReplacementCents,
10000 + input.managementOverrunBps,
);
return ok({
assetReplacementCents,
managedReplacementCents,
buyoutLowCents: applyRate(
managedReplacementCents,
10000 + input.buyoutPremiumLowBps,
),
buyoutHighCents: applyRate(
managedReplacementCents,
10000 + input.buyoutPremiumHighBps,
),
});
}
/** Value a buyer may discount when a share of the IP cannot be transferred. */
export function valueAtRisk(
anchorCents: Cents,
assetShareBps: Bps,
): Result<Cents> {
if (!Number.isInteger(anchorCents) || anchorCents <= 0) {
return fail("anchor value must be a positive integer amount in cents");
}
if (
!Number.isInteger(assetShareBps) ||
assetShareBps <= 0 ||
assetShareBps > 10000
) {
return fail("asset share must be between 1 and 10000 bps");
}
return ok(applyRate(anchorCents, assetShareBps));
}
Tidecast 的参数跑出来是:资产重置基数 $84,000,美术占比 30%,重制预算 $25,200,含 20% 管理加成 $30,240,回购区间 $45,360 到 $60,480;同一 30% 应用到出售锚 $248,708,得到 $74,612 的价值缺口。代码里的 transferable 和 consentRequired 不是法律判断,而是商业尽调的两个检查项:能不能卖、要不要别人签字。
这组数字的用法不是精确报价,而是排序:先补哪条转让链,取决于缺口金额和交易时间表。美术缺口 $74,612、音乐授权可能无法转让、代码若未转让则覆盖全部产品;三者里,代码的缺口最大,但补起来通常最便宜,因为创始人和公司之间只需要一份转让文件。外包美术的缺口小一些,但谈判对象是外部方,时间和现金成本更高。
小结
- 默认规则与直觉相反:员工职务范围内通常归雇主,外包通常归外包方,联合开发通常共有,创始人创作归个人而不自动归公司。
- 外包没有转让条款时,公司通常只有使用权;付款买的是服务,不是所有权。
- Tidecast 美术占资产 30%,按 $84,000 重置基数算,重制预算 $25,200,含管理加成 $30,240,回购区间 $45,360 到 $60,480。
- 回购比裸重制贵 $20,160 到 $35,280;这就是「没写归属条款」的价格,而条款本身的成本接近于零。
- 出售锚 $248,708 下,30% 资产对应 $74,612 的价值缺口;回购区间占锚的 18.2% 到 24.3%,足以改变交易结构。
- 联合开发的独占许可不等于转让;所有权仍共有,出售时资产仍不在公司表内。
- 转让条款要覆盖后续修改;只转让现有版本的合同,会让新版本继续留在创作者手里。
阅读导航:上一节:7.2 开源许可证的商业边界 · 下一节:8.1 授权类型:独占、排他、普通 。
常见错误与边界
- 以为付钱就等于拥有。 外包付款买的是服务;没有转让条款,权利通常仍归外包方。
- 把职务作品范围当成无限。 下班后的副业、入职前的代码、自购素材都可能不在职务范围内,需要作品清单和职务说明。
- 创始人忘了把 IP 转让给公司。 公司是独立主体;创始人创作不自动归公司,出售时公司资产表里可能没有核心 IP。
- 把独占许可当成转让。 许可给的是使用权,所有权仍在创作者或共有人手里;出售时这项资产不能自由转移。
- 联合开发不写分成和退出。 默认共有通常需要一致同意才能转让或独占授权;退出时没有买断条款,谈判会被对方卡住。
- 转让条款只覆盖现有版本。 后续更新、修复和衍生作品如果没有约定,仍可能留在创作者手里。
- 把买断授权当成自有著作权。 Tidecast 的音乐不得转授权;出售时不能当作可自由转让的资产。
- 用资产数量代替转让链。 有一百个文件不等于权利清楚;尽调看的是每项资产的创作人、转让文件和覆盖范围。
- 等交易发生才补文件。 出售或融资时补转让,谈判筹码在买方手里;归属条款应该在合作开始时就签。
- 把教学假设当成报价。 $84,000 基数、30% 占比、20% 管理加成和 50%–100% 溢价都是用于比较的假设,真实成本必须按项目和谈判重新估算。
IP 归属的财务后果,最终落在两个数字上:补文件要花多少,不补会少卖多少。前者通常是一份合同和一次尽调的成本,后者可能接近出售价的三成。下一节进入授权类型:即使权利归属清楚,授权范围写错,收入仍然会在渠道和期限上漏掉。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。