開発ワークフロー (Comprehensive Procedure)¶
ステータス: Proposed → Accepted 予定 版: v1.0 (2026-04-20) 適用範囲: Willen-Federation org 配下の Recerdo 関連全リポジトリ
1. 概要¶
Recerdo は Scrum / Agile で開発する。Sprint は原則 2 週間、Milestone を M0 (基盤) / M1 (MVP) / M2 (Beta Public) / M3 (GA) の 4 段階で定義する。**全機能はマイクロサービス単位で独立開発**し、Feature Flag で本番反映を制御する。
基本原則¶
- 1 Issue = 1 目的 = 1 PR = 1 Feature Flag (原則)
- 仕様書がないコードは書かない (
docs/の DD が単一真実源) - テスト・フォーマッター・セキュリティ検査を CI で強制 (PASS なしマージ禁止)
- マージ後は Feature Flag OFF で出荷 → 段階的 rollout で ON
2. Milestone / Sprint 運用¶
| Milestone | 目的 | 完了基準 |
|---|---|---|
| Beta M0 — Foundations | 全リポ共通基盤 (CI/CD, Tilt, docker-compose, shared-proto, feature-flag, 認証) | tilt up で全サービス起動, 主要 RPC 疎通 |
| Beta M1 — MVP | album / event / timeline の最小 E2E | iOS から写真アップロード → アルバム → タイムライン表示 |
| Beta M2 — Public Beta | 通知 / 監査 / 管理コンソール / DM | 招待制 Beta ユーザーに公開 |
| Beta M3 — GA Readiness | OCI 移行, SLO 達成, 決済 | 本番昇格判定 |
Sprint: 2 週間。各 Sprint 冒頭に Planning、中間 Mid-Sprint Check、末に Review + Retrospective。
Label での sprint 管理: - sprint:beta-m0 / sprint:beta-m1 / sprint:beta-m2 / sprint:beta-m3 - 次 sprint 候補は sprint:backlog
3. Issue ライフサイクル¶
[Proposal] → [Refined] → [Ready] → [In Progress] → [In Review] → [Done]
↓ ↓ ↓ ↓ ↓ ↓
生成 DD 紐付 見積完了 branch/PR Review merge
CI通過
3.1 Issue 作成時 (Proposal)¶
- タイトル:
[<type>] <short imperative>(例:[feature] album: add bulk upload endpoint) - 本文テンプレ必須: Context / User Story / Design Link / Acceptance Criteria / Out of Scope / Feature Flag
- ラベル:
type:*,priority:P0-P3,area:*,sprint:* - Milestone: 適切な M0-M3 に紐付け
- 仕様書参照:
docs/microservice/*.mdまたはdocs/features/*.mdへのリンクを**必須**
3.2 Refinement (設計詰め)¶
- Acceptance Criteria を検証可能な粒度まで分解
- DD に不足がある場合は docs の PR を先行させる
- 影響範囲: 関連サービス・クライアント・データ移行を明記
3.3 Ready (着手可能)¶
- 見積サイズ:
size:S(< 1d) /M(1-3d) /L(3-5d) /XL(> 5d, 要分割) XLは自動的に Epic 化し sub-issue に分割
3.4 In Progress¶
- 担当者 assign
- branch 作成 (§4 参照)
- progress 更新は Issue comment で日次
3.5 In Review¶
- PR open 時に自動遷移
- PR 本文から
Closes #NNNで Issue 紐付け
3.6 Done¶
- PR merge で自動 close
- Feature Flag 作成済 + デフォルト OFF 確認
4. Branch 戦略¶
Trunk-based development + 短命 feature branch。
| Branch | 用途 | 保護 |
|---|---|---|
main | 常にデプロイ可能 | Protected: PR 必須 / CI 必須 / 1 承認必須 |
feature/<issue-num>-<slug> | 機能開発 | 1 Issue = 1 branch |
fix/<issue-num>-<slug> | バグ修正 | 同上 |
chore/<issue-num>-<slug> | 雑用 (CI 調整, deps bump 等) | 同上 |
docs/<slug> | docs のみ | 同上 |
release/v<x.y.z> | リリース準備ブランチ (hotfix 用) | tag cut 後削除 |
- squash merge のみ。
mainの history を linear に保つ - branch 寿命 ≤ 5 営業日 (超える場合は分割 or stacked PR)
- main へ直 push 禁止 (GitHub branch protection で enforce)
5. PR プロセス¶
5.1 PR 作成¶
- タイトル規約 (Conventional Commits):
feat(album): add bulk upload endpointfix(auth): resolve JWKS cache TTL bugchore(ci): bump golangci-lint to v1.60docs: update album-svc DD- PR テンプレ必須項目:
- Summary (3 行以内)
- Linked Issue (
Closes #NNN) - Test plan (実行した検証)
- Feature Flag key + default (OFF)
- Rollback 手順
5.2 CODEOWNERS¶
/.github/CODEOWNERSに最低 1 名以上の所有者を定義- 変更範囲に応じ自動 reviewer assign
5.3 Review 基準¶
- 仕様書 (DD) と実装が一致するか
- テストが Acceptance Criteria を網羅するか
- Feature Flag で挙動切替可能か
- 観測性 (log / metric / trace) が実装されているか
- セキュリティ要件 (JWT 検証 / 入力バリデーション / PII 取扱) が満たされているか
5.4 マージ後¶
- Issue 自動 close (
Closes #NNN) - Feature Flag が OFF の状態でデプロイ (本番)
- 段階的 rollout (1% → 10% → 50% → 100%)
- 問題なければ Feature Flag を削除 (次回リリースで clean-up issue 作成)
6. CI/CD (GitHub Actions)¶
全リポで共通に 以下 7 workflow を必須とする。テンプレは recerdo-infra/ci-templates/ に配置予定。
| Workflow | Trigger | 内容 |
|---|---|---|
lint.yml | PR, push | 言語別 linter (後述) |
test.yml | PR, push | unit + integration test |
fmt.yml | PR | formatter diff check (違反時 fail) |
build.yml | PR, push | Docker image build (push は main のみ) |
security.yml | PR, weekly cron | SAST + dep audit + secret scan + non-printable char scan |
release.yml | tag push | image tag push + changelog 生成 |
deploy-beta.yml | main push | Beta (XServer VPS) へ自動デプロイ |
6.1 Required checks (branch protection)¶
lint,test,fmt,securityを 必須 status check に設定- Green 未達の PR は merge 不可
7. テスト戦略¶
| Layer | 対象 | 目標カバレッジ | ツール |
|---|---|---|---|
| Unit | 関数・メソッド | ≥ 80% | Go: testing + testify, TS: vitest, Swift: XCTest, Dart: test |
| Integration | サービス内層間 | 主要ユースケース | Go: dockertest + testcontainers, TS: supertest |
| Contract (gRPC/API) | サービス間 | 全 RPC | buf breaking + prism mock |
| E2E | ユーザーシナリオ | Happy path + 主要エラー | Playwright (SPA), XCUITest (iOS) |
| Load | 主要エンドポイント | p95 ≤ SLO | k6 (GitHub Actions scheduled) |
- テスト無しコードはマージ不可 (カバレッジ低下を reject する CI 設定)
- DB テストはモック禁止 →
testcontainersで real MySQL を立てる
8. コードフォーマッター¶
| 言語 | Formatter | Linter | 設定ファイル |
|---|---|---|---|
| Go | gofumpt + goimports | golangci-lint | .golangci.yml |
| TypeScript / JS | prettier | eslint (typescript-eslint) | .prettierrc, eslint.config.js |
| Swift | swiftformat | swiftlint | .swiftformat, .swiftlint.yml |
| Dart (Flutter) | dart format | flutter analyze | analysis_options.yaml |
| Terraform | terraform fmt | tflint + tfsec | .tflint.hcl |
| Markdown / YAML / JSON | prettier | markdownlint | .prettierrc, .markdownlint.json |
| Shell | shfmt | shellcheck | .editorconfig |
- pre-commit hook (
.pre-commit-config.yaml) で CI 同等のチェックをローカル実行可能にする - 違反時は自動修正可能なものは修正、不可なものは PR で reject
9. セキュリティ¶
9.1 CI 必須チェック¶
- SAST: Go
gosec, TSsemgrep, Swiftswiftlintsecurity rules - 依存性監査:
govulncheck,pnpm audit, Swift Package Audit - Secret scan:
gitleaks(GitHub native secret scanning も有効化) - 非可読文字 / Trojan Source 検出:
- 不可視 Unicode (BiDi, ZWJ, 制御文字) を grep で検出
python -c 'import unicodedata; ...'ベースの scan script (recerdo-infra/scripts/scan-non-printable.sh)- コンテナイメージスキャン:
trivy(CRITICAL/HIGH は block)
9.2 PR セキュリティレビュー¶
以下を含む PR は**必須で security:review ラベル + レビュワー 2 名**: - 認証・認可・セッション - 暗号化・署名・鍵管理 - 外部入出力 (API / queue / file upload) - PII を扱う処理 - SQL / NoSQL クエリ生成 - FFmpeg / libheif 等のメディア変換 (供給鏈脆弱性)
9.3 GDPR / PII¶
- ログに PII を書き込まない (
idのみ可、email/phone/name は禁止) - 削除要請は audit-svc 経由で匿名化 (元ログは append-only 保持)
10. Feature Flag ライフサイクル¶
Flipt + OpenFeature を採用 (recerdo-feature-flag)。
[Create with default=OFF] → [Merge PR] → [Staged Rollout] → [100%] → [Clean-up Issue]
1% → 10% → 50% → 100% (flag 削除)
10.1 Flag 命名規約¶
<area>.<feature>.<scope>(例:album.bulk_upload.enabled,notifications.push.ios)- all-lowercase / dot 区切り
10.2 運用ルール¶
- 新機能は 必ず flag 経由でリリース (boolean / percentage / cohort)
- flag 寿命 ≤ 3 ヶ月 → clean-up Issue 作成 → 削除
- Kill Switch 用 flag は
kill-switch:*label を付けて専用管理
11. デプロイ戦略¶
| 環境 | 実行基盤 | 方式 | 起動コマンド |
|---|---|---|---|
| dev (ローカル) | Docker Desktop / Colima | Tilt | cd recerdo-infra/dev && tilt up |
| Beta | XServer VPS + CoreServerV2 | docker-compose + k3s | make beta-deploy (recerdo-infra) |
| Prod | OCI Container Instances | Terraform + OCI CLI | make prod-deploy (recerdo-infra) |
11.1 デプロイ順序¶
shared-proto(変更時)- Backend services (依存 graph に従い bottom-up)
- Gateway (api-gateway)
- Clients (SPA / iOS / Android / Desktop)
11.2 Rollback¶
- 各 service image は 直近 5 tag を保持
make rollback SVC=<name> VERSION=<tag>で即切替- DB migration は forward-only (down migration は書かない) → データ事故時は snapshot リストア
12. Release / Tagging¶
- SemVer:
MAJOR.MINOR.PATCH - Monorepo 分割前 (Recuerdo_Backend): repo 全体の単一 tag
- Monorepo 分割後 (#20 決定時): 各 repo 独立 tag
- Changelog:
CHANGELOG.md自動生成 (release-pleaseorsemantic-release)
13. 観測性 (Observability)¶
全サービスで OTEL + W3C Trace Context を透過的に伝播。Prometheus / Loki / Grafana (Beta), OCI Monitoring (Prod)。
- RED metrics (Rate / Errors / Duration) を全エンドポイントに設定
- SLI / SLO: 主要 UX パス (upload / timeline / notification / auth) に p95/p99 + error budget
- Alerting: Grafana Alertmanager → Slack / Discord
14. ドキュメント要件¶
14.1 必須ドキュメント¶
全リポジトリに以下を配置 (recerdo-infra/templates/ 雛形参照):
README.md— 概要・起動・テスト手順CONTRIBUTING.md— 本 workflow への参照CODEOWNERS(.github/CODEOWNERS).github/ISSUE_TEMPLATE/— feature / bug / chore / docs.github/PULL_REQUEST_TEMPLATE.md.github/workflows/— §6 の 7 workflow.pre-commit-config.yamlLICENSE(private なら省略可)
14.2 変更時の docs 更新¶
- 仕様変更を伴う PR は docs の PR とセット で提出 (2 PR 並行、先に docs)
- ADR は accepted 後は**上書き禁止**。変更時は新 ADR + 旧 ADR を
Superseded by更新
15. インシデント対応¶
15.1 重大度¶
- SEV1: サービス全停止・データ損失・重大セキュリティ侵害
- SEV2: 主要機能停止・SLO 超過
- SEV3: 一部機能低下
- SEV4: UX 劣化
15.2 対応フロー¶
- 検知 (Grafana / FCM エラー / ユーザー報告)
- Kill Switch flag で該当機能を OFF に即時切替 (SEV½)
- Incident issue 作成 (
type:incidentlabel, SEV をpriorityに反映) - 根本原因分析 + 時系列記録
- 修正 PR + 回帰テスト追加
- Postmortem (SEV½ は必須)
16. QA (品質監査)¶
16.1 自動 QA (CI 内)¶
- 全 workflow green 必須
- カバレッジ下限達成必須 (≥ 80% line coverage, ≥ 70% branch coverage)
- contract test (buf breaking) pass 必須
- 空テスト検出 (
detect-empty-tests.sh) PASS 必須 — 空テスト・スキップテストが0件であること - PR body に Red log / Green log / Coverage の 3 点セット含有確認 (
pr-checklist.yml) - ミューテーションテスト (週次 cron) の survivor 率 ≤ 30%
16.2 手動 QA (merge 前 / release 前)¶
- Release checklist (
recerdo-infra/qa/release-checklist.md) を消化 - 対応エラー時: デバッグ → fix → CI 再実行 → 全 green までループ
- 修正 PR には必ず**「修正前の失敗ログ」と「修正後の成功ログ」の両方を添付**する
- 両ログに同一テストケース名が含まれていることを CI で確認する
- 自動編集ポリシー: CI 失敗の自動修正は lint / fmt のみ許可。テスト / ロジックの自動修正は禁止 (人間 review 経由)
- 修正 PR では同一テストケースの「修正前 FAIL」と「修正後 PASS」の両ログを添付する
詳細な TDD プロセス定義: docs/core/tdd-process.md
17. AI 補助開発 (Claude 等)¶
- AI が生成したコードでも**上記の全プロセスに従う** (ラベル / PR / レビュー / テスト)
- AI 生成と明示するため PR の body に
Generated with <tool>を任意記載可 - AI による自動 rename / 大規模リファクタは事前に人間承認必須
- Red / Green / Coverage の証跡が揃わない変更は完了扱いにしない
17.1 TDD 義務 (AI エージェント向け)¶
AIエージェント (Claude 等) が PR を生成する場合、以下を 必ず 実行すること:
- 先行テスト実装 → 実装前にテストを書き、
FAILを確認・記録する - Red ログ取得 → GitHub Actions の失敗 Run URL を PR body に貼付する
- 実装後 Green 確認 →
PASS+ カバレッジを記録し、URL を PR body に貼付する - カバレッジ閾値達成 → line coverage ≥ 80%, branch coverage ≥ 70% を確認する
- 異常系テスト → ネットワーク断 / タイムアウト / 重複 Key 等のエラーパスを必ずテストする
禁止行為: - Red ログなしで「テスト済み」と主張すること - 空テスト・スキップテストを含む PR を提出すること - カバレッジ水増しのために意味のない assertion を追加すること
参照¶
- ADR-0001 命名規約
- Bootstrap Checklist — 各リポの初期セットアップ
- TDD Red-Green プロセス
- ProjectTrackerBoard
- Policy
最終更新: 2026-04-22