Linear Custom Fields 究極活用術:メタデータをコードのように支配し、開発ベロシティを極限まで引き上げるアーキテクチャ
エンジニアリング組織がスケールするにつれ、Jiraの「カスタムフィールド地獄」に陥ったチームを幾度となく見てきた。何十個もある任意入力のドロップダウン、誰も見ていないテキストエリア、そして「必須化」されたがために適当な文字列で埋め尽くされるゴミデータ。これらは開発者のコンテキストスイッチを激しく奪い、認知負荷を高め、結果としてデリバリーの速度を殺す。
しかし、LinearのCustom Fieldsの設計思想は異なる。
Linearは、メタデータを「 бюрократия(官僚制)」の道具ではなく、ワークフローを駆動する純粋なプログラムの入力変数として捉えている。
本稿では、LinearのCustom Fieldsを単なる「情報のメモ欄」としてではなく、チームのメトリクスを自動化し、クロスファンクショナルな組織のサイロを破壊する高度なコンポーネントとして骨の髄まで使い倒す方法を解説する。
—
1. Linear Custom Fieldsの内部アーキテクチャと型システム
LinearのCustom Fieldsは、単なるUI上のプロパティではない。GraphQL API層およびインメモリのインデックスにおいて、厳格な型(Type Safety)を持って保持されている。
利用可能な型は以下の通りだ:
- `Text`: 短い文字列
- `Number`: 整数・浮動小数点数
- `Select`: 事前定義されたオプション(単一選択)
- `Boolean`: フラグ(True/False)
なぜこれが強力なのか?
これらのフィールドは、LinearのView(ビュー)のフィルター条件、APIのWebhooks、そして自動化ルール(Automation)のトリガーと完全に統合されている。つまり、Custom Fieldの値の変化を契機に、エンジニアリングパイプライン全体をプログラム通りに駆動できるのだ。
—
2. 組織のサイロを破壊する:非エンジニアリング部門との統合ユースケース
多くの開発組織で「プロダクトマネジメント(PM)」と「カスタマーサポート(CS)」からの要望は、GitHubやLinearのコメント欄という「非構造化データ」の海に沈んでいく。Custom Fieldsを導入することで、これを完全な「構造化データ(Structured Data)」へと昇華させる。
ケース A: カスタマーサポート (CS) からのエスカレーションパイプライン
CS部門からの起票に対し、以下のCustom Fieldsを強制適用(Required)する。
1. `CS Impact Tier` (Select): `Tier 1 (Enterprise Block)` / `Tier 2 (Major Pain)` / `Tier 3 (Minor)`
2. `Affected ARR` (Number): 影響を受ける顧客の年間経常収益(ARR)のドル建て数値
現場の知見:
この2つのフィールドを入れるだけで、トリアージ会議の景色が一変する。「声の大きい営業の案件」ではなく、「実際のARRインパクトに基づく定量的なトリアージ」がLinearのフィルタービュー一発で完了する。さらに、`Affected ARR > 50000` かつ `CS Impact Tier == Tier 1` のIssueが作成された瞬間、自動的にP0ラベルが付与され、Slackの専用チャンネルへ最高優先度の通知が飛ぶ仕組みを構築できる。
ケース B: プロダクトマネジメント (PM) のOKR紐付け
プロダクトのバックログが「やりたいこと」で溢れかえっているチームへ。
1. `Target OKR Key` (Text): 例 `Q3-KR2.1`
2. `Estimated Business Value (1-100)` (Number): 経済的価値のスコア
ビューで `Target OKR Key` ごとにグループ化(Group by)を行えば、現在のスプリントがどの企業目標にどれだけのエンジニアリングリソースを割いているのかが、リアルタイムのグラフとして可視化される。
—
3. 現場で即効性を発揮する運用TIPS
1. 「必須化(Required)」の罠を避ける設計
すべてのフィールドを必須にしてはならない。開発者が疲弊し、意味のない文字(例: `N/A` や `-`)が入力される原因になる。
- 原則: ステータスが `In Progress` や `In Review` に遷移する瞬間、あるいは特定のチーム(例: `Core Platform`)にアサインされた時のみ、Custom Fieldsの入力を必須化するバリデーションをAPI層(後述のスクリプト)で担保する。起票時は極力フリクションをゼロにする。
2. ビュー(Views)の超最適化
Custom Fieldを設定したら、必ず「Saved Views(保存されたビュー)」としてチーム共有すること。
例えば、「今スプリントでアサインされている、ARR $10k以上のバグ」を抽出するビューは、以下のフィルターで作る:
- `State` = In Progress / Todo
- `Team` = Engineering
- `Affected ARR` >= 10000
- `Custom Field: CS Impact Tier` is not empty
これをチームのデフォルトビューにピン留めすることで、開発者は「なぜこのタスクを今やっているのか」のコンテキストを迷いなく得ることができる。
—
4. エキスパート向け:Linear GraphQL API & CLI による完全自動化スクリプト
UIポチポチの設定に満足しているうちは中級者だ。真のエンジニアリング組織は、すべてをコード(As Code)として管理する。
LinearのGraphQL APIを叩き、Custom Fieldsの値に基づいて外部システム(DatadogやJira、社内DBなど)と同期、あるいはバリデーションを行うTypeScriptスクリプトを提示する。
以下のスクリプトは、指定したIssueのCustom Field(例: `Affected ARR`)を動的に更新するボットのコアロジックだ。
import { LinearClient } from ‘@linear/sdk’;
// 環境変数から取得したAPIキーでクライアントを初期化
const linearClient = new LinearClient({ apiKey: process.env.LINEAR_API_KEY });
/
- 指定したIssueのCustom Fieldを更新する関数
- @ 대상 Issue ID
- @param fieldName 更新対象のフィールド名
- @param value 設定する値
/
async function updateCustomField(issueId: string, fieldName: string, value: any): Promise
try {
// 1. チームのCustom Field定義を取得
const issue = await linearClient.issue(issueId);
const team = await issue.team;
const customFields = await team.customFields();
const targetField = customFields.nodes.find(field => field.name === fieldName);
if (!targetField) {
throw new Error(`Custom Field “${fieldName}” not found in team ${team.name}`);
}
// 2. LinearのGraphQLミューテーションを使用してカスタムフィールドの値を更新
// 注: Linear SDKのバージョンやスキーマ定義に応じたプロパティに注意
await linearClient.updateIssue(issueId, {
// Custom Fieldsは内部的にJSONオブジェクトとして保持・更新されるケースが多い
// 実際のスキーマ構造に合わせてペイロードを構築する
customFields: {
[targetField.id]: value
}
});
console.log(`Successfully updated [${fieldName}] for issue ${issueId} to ${value}`);
} catch (error) {
console.error(`Failed to update custom field:`, error);
process.exit(1);
}
}
// 実行例
// updateCustomField(‘ISSUE-1234’, ‘Affected ARR’, 75000);
Webhookと組み合わせた「自己修復するバックログ」のアーキテクチャ
さらに先を行くアーキテクチャとして、Linearの Webhooks をAWS LambdaやCloudflare Workersで受け取り、次のようなパイプラインを組むことを強く推奨する。
1. Trigger: Issueが作成される、またはCustom Fieldの `CS Impact Tier` が更新される。
2. Lambda Processor:
- もし `CS Impact Tier` が `Tier 1` に設定されたが、`Affected ARR` が空の場合:
- Linear APIを叩いて、該当Issueにコメント「警告: Tier 1のエスカレーションにはARRの入力が必須です。」を自動投稿し、ラベルに `Needs Info` を付与する。
3. Result: 人間の手による監視コストをゼロにし、データ品質のガバナンスを完全にコードで担保する。
—
5. まとめ:メタデータを制する者が、開発フローを制す
ツールを入れるだけでは、組織の生産性は1ミリも上がらない。
LinearのCustom Fieldsの本質は、「開発チームの文脈」と「ビジネスサイドの文脈」の共通言語(Schema)を定義することにある。
余計なフィールドを削ぎ落とし、本当にビジネスとエンジニアリングを動かす最小限のメタデータだけを厳選せよ。そして、APIと自動化を駆使してその入力と運用をシステム化せよ。
その先にあるのは、議論の無駄が削ぎ落とされ、圧倒的なスピードで価値をデリバリーし続ける、究極に洗練されたエンジニアリング組織の姿だ。