PackLog Baseへ戻る
# PackLog Base Contribution Points

PackLog Baseのポイントは、個人の記録と、他ユーザーが使える共有資産への貢献を見える化するためのものです。

基本方針は次の順で評価します。

1. PLB全体の山DB・キャンプ場DB・Gears DBの品質を上げる貢献
2. 他ユーザーが参考にできる公開データの共有
3. 自分自身のPack・Gear・Field Logの記録

## 公開向け説明

ユーザーへは細かい計算式ではなく、次のような考え方を公開します。

- Pack、Gear、Field Logなどを記録するとポイントが付与されます。
- データを公開して他のユーザーが参考にできる状態にすると、共有貢献としてポイントが付与されます。
- 山DB・キャンプ場DB・Gears DBへの修正提案が承認されると、DB貢献として高めのポイントが付与されます。
- 公式情報や現地確認など、信頼性の高い根拠がある提案はより高く評価されます。
- 公開によって付与されたポイントは、非公開に戻すと取り下げられます。
- 不正確な情報、重複投稿、スパム、権利侵害のある投稿は、ポイント対象外または減点対象になる場合があります。

内部のAI判定閾値、重複検知、スパム検知、細かい重み付けは公開しません。

ポイント付与条件、付与ポイント数、ランク名、必要ポイント数、バッジ表示は、サービス運営、機能追加、不正対策、データ品質改善のために変更される場合があります。
変更する場合は、できるだけユーザーが理解しやすい形で案内します。すでに獲得済みのポイントやランク表示についても、制度変更後の条件に基づいて再集計または表示調整される場合があります。

## ポイントカテゴリ

台帳の `point_category` は以下を使います。

| category | 用途 |
| --- | --- |
| `personal_log` | 自分用の記録作成 |
| `public_share` | 他ユーザーに役立つ公開データ |
| `db_contribution` | 山DB・キャンプ場DB・Gears DBへの承認済み貢献 |
| `quality_bonus` | AI/管理者による品質ボーナス |
| `penalty` | スパム・不正・誤情報などの減点 |
| `admin_adjustment` | 管理者による手動調整 |

## ポイント目安

最初の運用目安です。実装では台帳に記録し、後から調整できるようにします。

### 自分用記録

| action | category | points |
| --- | --- | ---: |
| Pack作成 | `personal_log` | +1 |
| My Gear登録 | `personal_log` | +1 |
| Field Log作成 | `personal_log` | +1 |
| GPX軌跡付きField Log作成 | `personal_log` | +2 |

### 共有貢献

| action | category | points |
| --- | --- | ---: |
| Pack公開 | `public_share` | +2 |
| My Gear公開 | `public_share` | +1 |
| Field Log公開 | `public_share` | +3 |
| GPX付きTravel Log公開 | `public_share` | +5 |

共有を解除した場合、同じ台帳行の `active` を `false` にして合計から外します。
再公開した場合は同じ台帳行を `active = true` に戻します。
同じ対象データで公開/非公開を繰り返しても、二重にポイントは付与しません。

### DB貢献

| action | category | points |
| --- | --- | ---: |
| 軽微な表記修正、タグ、エリア整理 | `db_contribution` | +1 |
| 公式URL・予約URLの追加/修正 | `db_contribution` | +2 |
| 営業期間・水場・トイレ・料金などの補完 | `db_contribution` | +3 |
| 閉鎖・移転・名称変更など重要修正 | `db_contribution` | +5 |
| AI精査で高信頼と判断された提案 | `quality_bonus` | +1 |

重要修正はユーザー影響が大きいため、AI精査だけでなく管理者確認を推奨します。

## 台帳ルール

ポイントは `contribution_point_ledger` に保存します。

重要な列:

- `user_id`: ポイント対象ユーザー
- `target_type`: `pack`, `field_log`, `my_gear`, `mountain_plan`, `campground_plan`, `suggestion`
- `target_id`: 対象データID
- `point_category`: ポイントカテゴリ
- `point_type`: 具体的なアクション種別
- `points`: ポイント数
- `active`: 現在ポイント集計に含めるか
- `reversed_at`: 共有解除などで無効化した日時
- `suggestion_id`: DB修正提案に紐づく場合のID
- `metadata`: AI判定や補足情報

`contribution_scores` は `active = true` の行だけを集計します。

## ランク

ポイント合計に応じて、ユーザーのステータスを表示します。

初期ランク定義は `contribution_rank_definitions` で管理します。閾値は運用しながら変更できます。
ランクは貢献状況を楽しく見える化するための表示であり、永続的な権利、特典、金銭的価値を保証するものではありません。

| rank_key | 表示名 | 必要ポイント | 意味 |
| --- | --- | ---: | --- |
| `starter` | Starter | 0 | PLBで記録を始めたユーザー |
| `logger` | Logger | 50 | ギアや旅の記録を継続して残すユーザー |
| `explorer` | Explorer | 200 | 旅、山、キャンプ、ギアを横断して使い込むユーザー |
| `keeper` | Keeper | 500 | 共有や整理でPLBの情報を育てるユーザー |
| `guide` | Guide | 1,200 | 他ユーザーの判断に役立つ情報を継続して届けるユーザー |
| `curator` | Curator | 3,000 | DB品質と共有データの価値を支えるユーザー |
| `architect` | Architect | 7,500 | PLBの文化とデータ基盤を育てる中核ユーザー |
| `legend` | Legend | 15,000 | 長期にわたり圧倒的な貢献を重ねた特別なユーザー |

`contribution_scores` には、合計ポイントに加えて以下も含めます。

- `rank_key`
- `rank_name`
- `rank_min_points`
- `next_rank_key`
- `next_rank_name`
- `next_min_points`
- `points_to_next`

退会申請中、制限中、規約未同意のユーザーは、新しいポイント対象アクションを実行できません。

## AI抽出の月間利用回数

公式URLからギア情報をAI抽出する機能は、サーバー側で月間利用回数を管理します。
保存済みの公式ギアDBから表示できる場合は、AI利用回数を消費しません。OpenAI APIを実際に呼び出す場合だけ1回として記録します。

初期運用目安:

| rank_key | 表示名 | 月間AI抽出回数 |
| --- | --- | ---: |
| `starter` | Starter | 3 |
| `logger` | Logger | 5 |
| `explorer` | Explorer | 10 |
| `keeper` | Keeper | 15 |
| `guide` | Guide | 25 |
| `curator` | Curator | 40 |
| `architect` | Architect | 70 |
| `legend` | Legend | 100 |

AI利用回数、対象機能、ランク別上限、条件は、サービス運用にあわせて変更される場合があります。

## 二重付与防止

共有系・個人記録系は、原則として以下の組み合わせで一意にします。

```text
user_id + target_type + target_id + point_type
```

例:

- Pack Aを公開: `pack / Pack A ID / pack_shared`
- Pack Aを非公開: 同じ行を `active = false`
- Pack Aを再公開: 同じ行を `active = true`

これにより、同じデータを何度も公開/非公開してポイントを稼ぐことを防ぎます。

## 提案制DB編集

山DB・キャンプ場DB・Gears DBの本体はユーザーやAIが直接変更しません。

流れ:

1. ユーザーが `contribution_suggestions` に修正提案を投稿
2. AIが根拠・信頼度・差分を精査
3. 管理者が承認/却下
4. 承認された提案だけ本体DBへ反映
5. 承認済み提案に対してポイントを付与

## ユーザー提案で変更禁止の項目

以下はデータの出典、権限、履歴、ライセンスに関わるため、ユーザー提案では変更禁止です。

- `id`
- `user_id`
- `source`
- `source_id`
- `source_url`
- `source_license`
- `attribution`
- `import_batch`
- `verification_status`
- `created_at`
- `updated_at`
- `is_public`

これらはSQL側でも `contribution_suggestion_has_protected_keys()` で弾きます。

## 慎重に扱う項目

以下はユーザー影響が大きいため、AI精査と管理者確認を推奨します。

- `latitude`
- `longitude`
- `name`
- `official_url`
- `reservation_url`
- `season`
- `fee_note`
- `open_fire`
- `pet`
- `water`
- `toilet`
- `trash`
- `car_access`

## 今後の実装候補

- プロフィール画面に合計ポイント表示
- `DB貢献 / 共有貢献 / 記録 / 品質ボーナス` の内訳表示
- 山DB・キャンプ場DB・Gears DBに「情報修正を提案」ボタン
- 管理者向けの提案レビュー画面
- AI精査ボタン
- 公開/非公開切り替え時の自動ポイント反映
- 公開向けポイントルールページ