《独立开发者的商业指南·合同、应收与风险》7.3 IP 归属、转让与员工发明

IP 归属不是「谁做的归谁」这么简单。本节拆开职务作品、外包开发、联合开发与创始人创作的默认规则,用 Tidecast 外包美术占 30% 的资产估算重制与回购成本:重制 $25,200,含管理加成 $30,240,回购 $45,360 到 $60,480,并对照出售锚 $248,708 下的 $74,612 价值缺口。

以下情境为教学假设,人物与数字不代表经核实的真实案例。

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,00014 个月开发机会成本,教学假设
美术占比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 授权类型:独占、排他、普通 。

常见错误与边界

  1. 以为付钱就等于拥有。 外包付款买的是服务;没有转让条款,权利通常仍归外包方。
  2. 把职务作品范围当成无限。 下班后的副业、入职前的代码、自购素材都可能不在职务范围内,需要作品清单和职务说明。
  3. 创始人忘了把 IP 转让给公司。 公司是独立主体;创始人创作不自动归公司,出售时公司资产表里可能没有核心 IP。
  4. 把独占许可当成转让。 许可给的是使用权,所有权仍在创作者或共有人手里;出售时这项资产不能自由转移。
  5. 联合开发不写分成和退出。 默认共有通常需要一致同意才能转让或独占授权;退出时没有买断条款,谈判会被对方卡住。
  6. 转让条款只覆盖现有版本。 后续更新、修复和衍生作品如果没有约定,仍可能留在创作者手里。
  7. 把买断授权当成自有著作权。 Tidecast 的音乐不得转授权;出售时不能当作可自由转让的资产。
  8. 用资产数量代替转让链。 有一百个文件不等于权利清楚;尽调看的是每项资产的创作人、转让文件和覆盖范围。
  9. 等交易发生才补文件。 出售或融资时补转让,谈判筹码在买方手里;归属条款应该在合作开始时就签。
  10. 把教学假设当成报价。 $84,000 基数、30% 占比、20% 管理加成和 50%–100% 溢价都是用于比较的假设,真实成本必须按项目和谈判重新估算。

IP 归属的财务后果,最终落在两个数字上:补文件要花多少,不补会少卖多少。前者通常是一份合同和一次尽调的成本,后者可能接近出售价的三成。下一节进入授权类型:即使权利归属清楚,授权范围写错,收入仍然会在渠道和期限上漏掉。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「books」更多文章

  1. 《移动游戏产品的架构·商业化与发行工程》附录 C 商业化与发行评审清单
  2. 《移动游戏产品的架构·商业化与发行工程》附录 B 双案例商业化事实表
  3. 《移动游戏产品的架构·商业化与发行工程》附录 A 商业化与发行术语速查