スキル一覧に戻る

design-serialization-schema

pjt222
更新日 2 days ago
6 閲覧
17
2
17
GitHubで表示
テストwordapiautomationdesigndata

について

このスキルは、開発者がJSON Schema、Protocol Buffers、またはApache Avroを使用してシリアライゼーションスキーマを設計するのを支援します。スキルでは、長期にわたるデータ形式のためのスキーマバージョニング、後方互換性、検証ルール、および進化戦略について説明します。新しいAPI契約を定義する際、既存のスキーマを消費者に影響を与えずに拡張する場合、またはスキーマシステム間で選択する場合にご利用ください。

クイックインストール

Claude Code

推奨
メイン
npx skills add pjt222/agent-almanac -a claude-code
プラグインコマンド代替
/plugin add https://github.com/pjt222/agent-almanac
Git クローン代替
git clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/design-serialization-schema

このコマンドをClaude Codeにコピー&ペーストしてスキルをインストールします

ドキュメント

Design Serialization Schema

Versioned schemas → evolve w/o breaking consumers.

Use When

  • New API contract / data format
  • Add fields w/o break consumers
  • Migrate schema versions
  • Pick schema sys (JSON Schema, Protobuf, Avro)
  • Doc valid. rules → auto-enforce

In

  • Required: Data model (entities, types, constraints)
  • Required: Compat reqs (consumers, old format lifetime)
  • Optional: Existing schema → evolve
  • Optional: Perf reqs (valid. speed, registry)
  • Optional: Target format (JSON, binary, columnar)

Do

Step 1: Pick Schema Sys

SysFormatStrengthBest
JSON SchemaJSONBroad support, flex valid.REST, config
Protocol BuffersBinaryCompact, fast, typed, evo built-ingRPC, micro
Apache AvroBinary/JSONSchema in data, great evoKafka, pipelines
XML Schema (XSD)XMLDeep typing, namespacesEnterprise/SOAP
TypeBox/ZodTypeScriptType inference + runtime valid.TS APIs

→ Schema sys picked → ecosystem + perf + evo reqs. If err: unsure → start JSON Schema (broadest tooling, layers on JSON APIs).

Step 2: Core Schema

JSON Schema ex:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/schemas/measurement/v1",
  "title": "Measurement",
  "description": "A sensor measurement reading",
  "type": "object",
  "required": ["sensor_id", "value", "unit", "timestamp"],
  "properties": {
    "sensor_id": {
      "type": "string",
      "pattern": "^[a-z]+-[0-9]+$",
      "description": "Unique sensor identifier (lowercase-digits format)"
    },
    "value": {
      "type": "number",
      "description": "Measured value"
    },
    "unit": {
      "type": "string",
      "enum": ["celsius", "fahrenheit", "kelvin", "percent", "ppm"],
      "description": "Unit of measurement"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp with timezone"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": true,
      "description": "Optional key-value metadata"
    }
  },
  "additionalProperties": false
}

Protocol Buffers ex:

syntax = "proto3";
package sensors.v1;

import "google/protobuf/timestamp.proto";

// Measurement represents a single sensor reading.
message Measurement {
  string sensor_id = 1;         // Unique sensor identifier
  double value = 2;             // Measured value
  Unit unit = 3;                // Unit of measurement
  google.protobuf.Timestamp timestamp = 4;
  map<string, string> metadata = 5; // Optional key-value metadata
}

enum Unit {
  UNIT_UNSPECIFIED = 0;
  UNIT_CELSIUS = 1;
  UNIT_FAHRENHEIT = 2;
  UNIT_KELVIN = 3;
  UNIT_PERCENT = 4;
  UNIT_PPM = 5;
}

Apache Avro ex:

{
  "type": "record",
  "name": "Measurement",
  "namespace": "com.example.sensors",
  "doc": "A sensor measurement reading",
  "fields": [
    {"name": "sensor_id", "type": "string", "doc": "Unique sensor identifier"},
    {"name": "value", "type": "double", "doc": "Measured value"},
    {"name": "unit", "type": {"type": "enum", "name": "Unit", "symbols": ["CELSIUS", "FAHRENHEIT", "KELVIN", "PERCENT", "PPM"]}},
    {"name": "timestamp", "type": {"type": "long", "logicalType": "timestamp-millis"}},
    {"name": "metadata", "type": ["null", {"type": "map", "values": "string"}], "default": null}
  ]
}

→ Schema self-doc → descriptions + constraints + clear types. If err: data model unstable → mark draft, skip registry.

Step 3: Plan Evolution

Compat rules:

ChangeBack Compat?Fwd Compat?Safe?
Add optional fieldYesYesYes
Add required fieldNoYesNo (breaks consumers)
Remove optional fieldYesNoCareful (producers may still send)
Remove required fieldYesNoCareful
Rename fieldNoNoNo (use alias + deprecate)
Change field typeNoNoNo (add new, deprecate old)
Add enum valueYes (if consumers ignore unknown)NoDepends on impl
Remove enum valueNoYesNo

Safe evo:

  1. Only add optional fields w/ defaults
  2. Never remove/rename → deprecate
  3. Version schema in id (v1, v2)
  4. Schema registry for binary (Confluent for Avro/Protobuf)

Protobuf evo rules:

// v1 — original
message Measurement {
  string sensor_id = 1;
  double value = 2;
  Unit unit = 3;
}

// v2 — safe evolution
message Measurement {
  string sensor_id = 1;
  double value = 2;
  Unit unit = 3;
  // NEW: added in v2 — old clients ignore this field
  google.protobuf.Timestamp timestamp = 4;
  // DEPRECATED: use sensor_id instead
  reserved 6;
  reserved "old_sensor_name";
}

JSON Schema versioning:

{
  "$id": "https://example.com/schemas/measurement/v2",
  "allOf": [
    {"$ref": "https://example.com/schemas/measurement/v1"},
    {
      "properties": {
        "location": {
          "type": "string",
          "description": "Added in v2: GPS coordinates"
        }
      }
    }
  ]
}

→ Evo plan documented: safe changes + version reqs. If err: break unavoidable → version (v1 → v2), parallel support during migration.

Step 4: Implement Valid.

# JSON Schema validation (Python)
from jsonschema import validate, ValidationError
import json

schema = json.load(open("measurement_v1.json"))

def validate_measurement(data: dict) -> list[str]:
    """Validate a measurement against the schema. Returns list of errors."""
    errors = []
    try:
        validate(instance=data, schema=schema)
    except ValidationError as e:
        errors.append(f"{e.json_path}: {e.message}")
    return errors

# Usage
errors = validate_measurement({"sensor_id": "s-01", "value": "not_a_number"})
# → ["$.value: 'not_a_number' is not of type 'number'"]
// TypeScript with Zod (runtime + compile-time)
import { z } from 'zod';

const MeasurementSchema = z.object({
  sensor_id: z.string().regex(/^[a-z]+-[0-9]+$/),
  value: z.number(),
  unit: z.enum(['celsius', 'fahrenheit', 'kelvin', 'percent', 'ppm']),
  timestamp: z.string().datetime(),
  metadata: z.record(z.string()).optional(),
});

type Measurement = z.infer<typeof MeasurementSchema>;

// Validation
const result = MeasurementSchema.safeParse(inputData);
if (!result.success) {
  console.error(result.error.issues);
}

→ Valid. on all incoming data at boundaries (API, ingestion). If err: log valid. errs w/ full payload (redact sensitive) for debug.

Step 5: Doc Schema

Schema doc page:

# Measurement Schema (v1)

## Overview
Represents a single sensor reading with metadata.

## Fields
| Field | Type | Required | Description | Constraints |
|-------|------|----------|-------------|-------------|
| sensor_id | string | Yes | Unique sensor ID | Pattern: `^[a-z]+-[0-9]+$` |
| value | number | Yes | Measured value | Any valid IEEE 754 double |
| unit | enum | Yes | Unit of measurement | One of: celsius, fahrenheit, kelvin, percent, ppm |
| timestamp | string | Yes | Reading time | ISO 8601 with timezone |
| metadata | object | No | Key-value pairs | String keys and values |

## Changelog
| Version | Date | Changes |
|---------|------|---------|
| v1 | 2025-03-01 | Initial schema |

## Compatibility
- **Backwards**: Consumers of v1 will continue to work with future versions
- **Policy**: Only additive, optional field changes between minor versions

→ Docs auto-gen or in sync w/ schema. If err: docs drift → CI check valid. docs vs schema source.

Check

  • Schema sys matches use case (JSON Schema, Protobuf, Avro)
  • All fields: types + desc + constraints
  • Required vs optional explicit
  • Evo strategy documented (safe changes, versioning)
  • Valid. at boundaries
  • Versioned + changelog
  • Round-trip: serialize → deserialize → compare, no data loss

Traps

  • Over-constrain early: Strict valid. on new schema → blocks iteration. Start permissive (additionalProperties: true), tighten later.
  • No defaults: Add required field w/o default → breaks existing data. Always defaults for new fields.
  • Null ignored: Many schemas sloppy on null/missing. Explicit nullable vs optional.
  • Version in URL not payload: Long-lived data (storage, events) → embed ver in data, not just endpoint URL.
  • Enum exhaustive: New enum val crashes consumers w/ exhaustive switches. Doc unknown → handle gracefully.

  • serialize-data-formats — format pick + encode/decode
  • implement-pharma-serialisation — pharma (regulatory schemas)
  • write-validation-documentation — valid. docs for regulated schemas

GitHub リポジトリ

pjt222/agent-almanac
パス: i18n/caveman-ultra/skills/design-serialization-schema
0
agentsagentskillsai-assisted-developmentclaude-codeskillsteams

関連スキル

evaluating-llms-harness

テスト

このClaudeスキルは、lm-evaluation-harnessを実行し、MMLUやGSM8Kなど60以上の標準化学術タスクでLLMをベンチマークします。開発者がモデルの品質を比較し、トレーニングの進捗を追跡し、学術的な結果を報告するために設計されています。このツールはHuggingFaceやvLLMモデルを含む様々なバックエンドをサポートしています。

スキルを見る

cloudflare-cron-triggers

テスト

このスキルは、cron式を使用してWorkersをスケジュールするためのCloudflare Cron Triggersの実装に関する包括的な知識を提供します。定期的なタスクの設定、メンテナンスジョブ、自動化されたワークフローの構築を網羅し、無効なcron式やタイムゾーン問題といった一般的な課題への対処法も含みます。開発者はこれを使用して、スケジュールされたハンドラーの設定、cronトリガーのテスト、WorkflowsやGreen Computeとの連携を構成できます。

スキルを見る

webapp-testing

テスト

このClaude Skillは、Playwrightベースのツールキットを提供し、Pythonスクリプトを通じてローカルWebアプリケーションのテストを可能にします。フロントエンドの検証、UIデバッグ、スクリーンショット撮影、ログ表示を実現し、サーバーライフサイクルを管理します。ブラウザ自動化タスクにご利用いただけますが、コンテキストの汚染を避けるため、スクリプトのソースコードを読むのではなく直接実行してください。

スキルを見る

finishing-a-development-branch

テスト

このスキルは、開発者がテストの合格を確認し、構造化された統合オプションを提示することで、完成した作業を仕上げることを支援します。実装が完了した後のマージ、PR作成、ブランチの整理といったワークフローを案内します。コードが準備できてテスト済みの際に使用し、開発プロセスを体系的に完了させましょう。

スキルを見る