{"id":50614328,"url":"https://github.com/kaikei-e/s4rciv","last_synced_at":"2026-06-06T07:01:18.633Z","repository":{"id":362100116,"uuid":"1257236475","full_name":"Kaikei-e/S4rCiv","owner":"Kaikei-e","description":"sentinel for civic records — a passive, read-only flight recorder for public records, plus a situation-room dashboard for citizens.","archived":false,"fork":false,"pushed_at":"2026-06-02T16:01:11.000Z","size":205,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T16:19:25.703Z","etag":null,"topics":["civic-tech","civictech","docker-compose","golang","rust-lang"],"latest_commit_sha":null,"homepage":"","language":"PLpgSQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kaikei-e.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-02T13:44:58.000Z","updated_at":"2026-06-02T16:02:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Kaikei-e/S4rCiv","commit_stats":null,"previous_names":["kaikei-e/s4rciv"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Kaikei-e/S4rCiv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kaikei-e%2FS4rCiv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kaikei-e%2FS4rCiv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kaikei-e%2FS4rCiv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kaikei-e%2FS4rCiv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kaikei-e","download_url":"https://codeload.github.com/Kaikei-e/S4rCiv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kaikei-e%2FS4rCiv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33972398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-06T02:00:07.033Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["civic-tech","civictech","docker-compose","golang","rust-lang"],"created_at":"2026-06-06T07:01:17.686Z","updated_at":"2026-06-06T07:01:18.616Z","avatar_url":"https://github.com/Kaikei-e.png","language":"PLpgSQL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# S4rCiv\n\n**_sentinel for civic records_** — 公的記録の受動・読取専用フライトレコーダ ＋ 市民のための可視化ダッシュボード\n\n「サーシヴ」と読む。*sentinel for civic* を詰めた綴り（`4r` ＝ \"for\"）。g0v が \"gov-zero\"、Decidim が「決めよう」を名乗るのと同じく、名前そのものに趣意を込めている。\n\n![status](https://img.shields.io/badge/status-in%20development%20(M1%E2%80%93M2)-yellow)\n![license](https://img.shields.io/badge/license-AGPL--3.0-blue)\n[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg)](https://github.com/RichardLitt/standard-readme)\n\n**日本語** | [English](docs/README_EN.md)\n\n\u003e 立法・法令・公金・調達といった日本の**公的一次データ**を継続的に観測し、その**変化（削除を含む）を改ざん耐性のある不変ログに記録**して可視化する、非党派・読取専用のシビックテック基盤。\n\n民主主義の透明性は、「今どうなっているか」を見せるだけでは十分に機能しない。「**いつ・何が・どう変わったのか、そして何が静かに消されたのか**」を、誰もが後から辿れて初めて意味を持つ。S4rCiv は、公開されている一次情報を記録し続ける「フライトレコーダ」と、複数のソースを横断して状況を一望できる「司令室ダッシュボード」を組み合わせ、この**時系列の追跡可能性**を市民の手に届けることを目指す。\n\nS4rCiv は権力と対立するための道具ではない。**説明責任を負う公的主体の「公的な出力」を、誰にでも検証できる形で記録する**ための情報インフラである。記録に意見や評価は加えない。残すのは、観測された事実と、原文へ遡れる出典だけ。何をどの基準で監視するかは公開し、全主体へ同一のパイプラインを適用する。\n\n系譜としては、g0v / Audrey Tang（Plurality）が掲げる「ラディカルな透明性」と「有益な情報流通（beneficial information flows）」、そして米国 EDGI の Web Monitoring（政府ウェブページの差分監視）の現代的な後継に位置づけられる。\n\n## 目次\n\n- [なぜ S4rCiv か](#なぜ-s4rciv-か)\n- [何をするか](#何をするか)\n- [設計原則](#設計原則)\n- [やらないこと](#やらないこと)\n- [アーキテクチャ](#アーキテクチャ)\n- [検証可能性](#検証可能性)\n- [データ源](#データ源)\n- [ステータスとロードマップ](#ステータスとロードマップ)\n- [動かす（ローカル）](#動かすローカル)\n- [関連プロジェクト](#関連プロジェクト)\n- [コントリビュート](#コントリビュート)\n- [ライセンス](#ライセンス)\n- [クレジット・参考](#クレジット参考)\n\n## なぜ S4rCiv か\n\n既存の監視系シビックテックは、情報公開・投票記録・予算といった単機能サイトの縦割りで構成され、その多くが「現在値」のスナップショットしか見せてこなかった。だが公的記録の価値は、**変化の履歴**にこそ宿る。条文がいつ書き換わったのか、契約額がどう推移したのか、公開されていた文書がいつ消えたのか — これらを後から確かめられなければ、透明性は形骸化する。\n\nS4rCiv は「現在値」ではなく「**変化そのもの**」を一次的な記録対象に据える。観測できなくなったこと（沈黙）すら情報として残す。\n\nいま着手する意義は、制度面の追い風が重なっていることにもある:\n\n- **e-Gov 法令API v2**（2025-03 公開、OpenAPI・法令XML/JSON、更新法令一覧あり）で法令の機械可読な差分監視が現実的になった。\n- **官報の電子化**と**告示のベース・レジストリ**提供が 2026 年度中を目途に進行中。\n- **政治資金収支報告書のオンライン提出・ネット公表が 2027-01 から義務化**され、機械可読化が進む。\n- 先行事例である EDGI の Web Monitoring は現在休眠しており、記録・監視側の領域が相対的に空いている。\n\n## 何をするか\n\nS4rCiv のパイプラインは、一貫して三段に整理できる:\n\n1. **継続収集** — 公開エンドポイントへの HTTP GET のみで一次情報を取得する。\n2. **変化の記録** — 取得内容をハッシュ化し、前回との差分を append-only の不変ログに記録する（`ResourceObserved` / `ResourceChanged` / `ResourceVanished` / `ResourceRestored`）。\n3. **可視化** — タイムライン・エンティティ・地図・要約として、出典と鮮度を添えて提示する。\n\n観測の対象は、**制度・公金・公的行為**に限定される:\n\n- 立法プロセス（本会議・委員会の議事、法案、採決、記名投票）\n- 法令・告示・通達・規則の制定改廃\n- 公金（予算、政治資金収支報告書、政党交付金）\n- 公共調達・契約（入札・落札・随意契約）\n- 公職者・政治団体の**公的な**発信・届出\n\n## 設計原則\n\nこれらは努力目標ではなく制約である。原則に反する機能や依存は定義上「誤り」であり、実装する前に矛盾として表面化させる。詳細は [`docs/concepts/CORE_CONCEPT_0001.md`](docs/concepts/CORE_CONCEPT_0001.md) を参照。\n\n1. **受動・読取専用** — 公開エンドポイントへの HTTP GET のみ。認証・送信・書き込み・自動アクションをしない。見張り（sentinel）であって行為者ではない。\n2. **公的一次データのみ** — 出所が公的に公開済みの一次情報だけを扱う。\n3. **append-only 不変ログ** — 削除・改変を含めてすべて残す。ログ自身もハッシュ連鎖で改ざん耐性を持たせる。\n4. **観測面と解釈面の分離** — 改ざん耐性のある ground truth（観測面）と、再計算可能で出典・確信度付きの projection（解釈面）を物理的に分ける。\n5. **標準準拠でサイロを作らない** — Akoma Ntoso（法令・議事）、Popolo（人・役職）、OCDS（調達）。\n6. **AI は要約のみ・判断しない** — スコアリングや論評をせず、すべての要約は原文・差分へリンクし、確信度と出所を併記する。\n7. **出典明記と利用規約の技術的内蔵** — ソース別レート制御・robots.txt 遵守・識別可能な User-Agent・全レコードへの出典／取得時刻付与・可能な場面での Internet Archive 併用。\n\n## やらないこと\n\nS4rCiv の信頼性は、「何をするか」と同じくらい「**何をしないか**」によって担保される。禁止事項の正本は [`DISCIPLINE.md`](DISCIPLINE.md) にある。要点:\n\n- **私人を監視・プロファイリング・晒さない。** 監視の矛先は常に説明責任を負う公的主体（政治家・政党・政治団体・公職者）に固定する。政治資金の少額寄附者などの私人を横断名寄せしない。\n- **党派的に振る舞わない。** 特定政党・思想を標的にせず、全主体へ同一基準・同一パイプラインを適用する。監視対象の選定基準は公開する。\n- **脱コンテキストの差分を結論として出さない。** 差分は必ず周辺コンテキストと全文リンクを伴って提示する（\"gotcha\" 化の防止）。\n- **AI に判断・評価をさせない。** 要約・クラスタリングのみ。原文へのリンク・確信度・出所を欠いた要約を出さない。\n- **自動投稿で個人を狙い撃たない。** アラートは事実・出典リンク付き・opt-in に限る。\n\n## アーキテクチャ\n\n自己ホスト可能な少数のサービス（収集・参照の Go、構造差分の Rust、Web の SvelteKit、Postgres）をアダプタ式に組み合わせる。新しいソースの追加は、新しいアダプタ（収集＋正規化）の追加に等しい。詳細は概念ドキュメント [§8](docs/concepts/CORE_CONCEPT_0001.md) を参照。\n\n```mermaid\nflowchart TB\n  SRC[\"公開 API / ページ (+ Internet Archive)\"]\n  subgraph OBS[\"観測面 — observation plane（不変・append-only・hash-chain）\"]\n    COL[\"ソースアダプタ / 収集\u003cbr/\u003ecollector（Go）\u003cbr/\u003ekokkai · e-Gov 法令 · 参議院記名投票 · 議員名簿\"]\n    LOG[(\"イベントログ CQRS\u003cbr/\u003eappend-only · hash-chain\u003cbr/\u003eground truth\")]\n  end\n  subgraph INT[\"解釈面 — interpretation plane（再計算可能 + provenance / confidence）\"]\n    DIF[\"構造差分 differ\u003cbr/\u003eRust · Connect-RPC · stateless\"]\n    RM[(\"リードモデル\u003cbr/\u003etimeline · 記名投票 · 法令 · 選挙区地図\")]\n  end\n  API[\"api（Go · Connect-RPC · 読取専用）\"]\n  WEB[\"Web — SvelteKit 司令室ダッシュボード\"]\n  SRC --\u003e|HTTP GET のみ| COL --\u003e LOG\n  LOG -. projection .-\u003e DIF --\u003e RM\n  LOG -. projection .-\u003e RM\n  RM --\u003e API --\u003e WEB\n```\n\n正規化の構造差分は独立した **differ** サービス（Rust・Connect-RPC・stateless、ADR-000005）が担い、収集（`collector`）と参照（`api`）はそれぞれ別の Go バイナリ。**観測面（observation plane）** は生スナップショットとハッシュ連鎖の変化イベントからなる不変の ground truth。**解釈面（interpretation plane）** は正規化エンティティ・変化分類・要約からなり、観測面からいつでも再計算できる projection で、各フィールドが出所（provenance）と確信度（confidence）を持つ。解釈を観測面へ書き戻すことはない。\n\nUI の規定は [`docs/design/DESIGN_LANGUAGE.md`](docs/design/DESIGN_LANGUAGE.md) にある（ダーク既定・WCAG 2.2 AA 目標・色は状態のためだけに使う）。\n\n## 検証可能性\n\n観測面のログは append-only で、各イベントは直前スナップショットのハッシュ（`prev_content_hash`）とログ自身のハッシュ連鎖（`log_prev_hash`）を保持する。これにより、ログは**改ざん耐性（tamper-evident）** を持つ — 改ざんが不可能なのではなく、**改ざんがあれば検出できる**。S4rCiv が自らの記録を後から書き換えていないことを、第三者が独立に検証できる。\n\n完全性検証はレコード単位の「検証済み」バッジではなく、事案ページの端末内で**有界**に行う設計とした（直近の署名つきチェックポイントから当該区間だけ再計算する。ADR-000014）。「記録の記録」を名乗る以上、この検証可能性は機能ではなく前提である。可能な場面では Internet Archive（Memento）経由でも取得し、第三者アーカイブとの二重化で証跡を補強する。\n\n## データ源\n\n各ソースはアダプタとして実装し、ソース別のレート制御を既定 ON で運用する（規律の正本は [`DISCIPLINE.md`](DISCIPLINE.md)）。\n\n| ソース | 内容 | エンドポイント | ステータス |\n|---|---|---|---|\n| 国会会議録検索API（国立国会図書館） | 本会議・委員会の議事、発言、記名投票 | `https://kokkai.ndl.go.jp/api/` | 実装済み (M1) |\n| e-Gov 法令API v2（デジタル庁） | 法令XML（憲法・法律・政令・省令等）、更新法令一覧 | `https://laws.e-gov.go.jp/api/2/` | 実装済み (M2) |\n| 参議院 記名投票結果 | 参議院本会議の記名投票（議員別の賛否・選挙区地図の軸） | `https://www.sangiin.go.jp/` | 実装済み (M4) |\n| 両院 公式議員名簿 | 現職議員の会派・選挙区（Popolo 同定、記名投票地図の補助） | `https://www.shugiin.go.jp/` ・ `https://www.sangiin.go.jp/` | 実装済み (M4) |\n| 官報・告示 ベース・レジストリ | 告示等の機械可読構造化データ | 2026 年度中目途 | 将来 |\n| 政治資金収支報告書（総務省） | 政治資金の収支 | 2027-01 ネット公表義務化 | 将来 |\n| 公共調達（調達ポータル） | 入札・落札・契約（OCDS 整形） | `https://www.p-portal.go.jp/` | 将来 |\n\n\u003e 国会会議録は、データベースおよび国立国会図書館職員の発言の著作権が NDL に帰属するため、出典明記が必須。法令・告示・通達は著作権法 13 条により「権利の目的とならない著作物」であり、収集・差分表示・再配布の法的足場が堅い。\n\n## ステータスとロードマップ\n\n**開発中。M1（国会会議録）と M2（e-Gov 法令）の収集・差分・projection・参照 API が動く。** M3／M4 は一部実装、M5／M6 は未着手。公開（M6）には未到達で、運用デプロイの手順はまだ整っていない。現状はローカルの Docker Compose スタックとして動かす（[動かす（ローカル）](#動かすローカル)）。設計の根拠は [`docs/ADR/`](docs/ADR)（000001–000015）に記録している。\n\nマイルストーン（概念ドキュメント §11。状態: ✓ 実装済 / ◐ 一部 / ○ 未着手）:\n\n- **✓ M0 — 骨格**: 三面スキーマ（観測／解釈／control）、append-only ＋ hash-chain のイベントログ、アダプタ interface、観測面／解釈面の分離。\n- **✓ M1 — 立法アダプタ**: 国会会議録 API から議事・発言を取得し、Popolo で議員／会派を projection、記名投票を VoteEvent 化。\n- **✓ M2 — 法令アダプタ**: e-Gov「更新法令一覧」をポーリングし、独立した differ サービスで AKN の構造差分を取る（条・項・号・号の細分・用語定義まで）。\n- **◐ M3 — ダッシュボード v0**: 全 Source 横断のタイムライン（双方向キーセットページング）と議員別記名投票は実装済み。ウォッチ＆アラートは設計のみ（ADR-000007。サーバ push を採らずフィード＋端末内保存）。\n- **◐ M4 — マップ**: 参議院記名投票の選挙区 choropleth（都道府県内訳＋比例パネル＋coverage）を実装。衆院は個人別投票が未公開のため、軸足を参に移している（ADR-000010）。\n- **○ M5 — 要約 v0**: 原文リンク必須の要約を薄く。未着手。\n- **○ M6 — 公開**: ライセンス確定、自己ホスト手順、監視対象の選定基準の公開。未着手。\n\n## 動かす（ローカル）\n\n現状はローカルの Docker Compose スタック（プロジェクト名 `s4rciv`）として動く。前提は Docker と、テストを回すなら Go。\n\n```sh\ncp .env.example .env            # POSTGRES_* / USER_AGENT を設定\n# secrets/db_password.txt に DB パスワードを書く\ndocker compose up -d            # db・migrate(Atlas)・api・collector・differ・web が起動\n# web: http://127.0.0.1:3000 ／ api(Connect-RPC, 読取専用): 127.0.0.1:8080\ncd services/api \u0026\u0026 go test ./...\n```\n\nスタックは空で起動する（監視リストは `discover` でのみ増える設計）。データ投入（`collector discover` 等の subcommand）、proto 再生成・マイグレーション・コンテナ運用の詳細は [`CLAUDE.md`](CLAUDE.md) と `docker-compose` skill を参照。\n\n## 関連プロジェクト\n\nS4rCiv は競合ではなく協調を志向する。標準（AKN / Popolo / OCDS）に準拠することで、これらと接続可能性を保つ。\n\n- **デジタル民主主義2030 / 広聴AI**（参加・熟議側、非党派 OSS） — 相補的。S4rCiv の構造化記録・差分は熟議の入力コンテキストになりうる。\n- **Code for Japan / Code for 選挙**（Popolo、立法トラッカー） — Popolo 相互運用で協調。\n- **政治資金センター / political-finance-database** — 公金側。S4rCiv は時系列差分と横断相関で補完する。\n- **mySociety**（TheyWorkForYou / WhatDoTheyKnow） / **EDGI Web Monitoring** — 海外の系譜であり先行事例。\n\n## コントリビュート\n\nIssue・Discussion を歓迎する。コードや収集アダプタに着手する前に、[`docs/concepts/CORE_CONCEPT_0001.md`](docs/concepts/CORE_CONCEPT_0001.md)（設計の正本）と [`DISCIPLINE.md`](DISCIPLINE.md)（禁止事項の正本）に必ず目を通してほしい。原則と矛盾する提案は、実装ではなく議論として扱う。\n\n## ライセンス\n\nサーバ本体（本リポジトリ）は **[AGPL-3.0](LICENSE)**（mySociety 等のシビックテック慣行に倣い、SaaS フォークもオープンに保つ）。\n\n収集データ・スキーマのライセンス（CC0 または CC BY）と、クライアントライブラリのライセンス（Apache-2.0 / MIT）は、それぞれの成果物が生じた時点で別途決定する（本リポジトリの `LICENSE` の対象外）。\n\n## クレジット・参考\n\n設計思想は次の系譜に多くを負っている: g0v / Audrey Tang（Plurality）、EDGI Web Monitoring、mySociety、AI Objectives Institute の Talk to the City、そして標準仕様 Akoma Ntoso / Popolo / OCDS のコミュニティ。\n\n主要な一次情報源とリンク:\n\n- 国会会議録検索API 仕様 — \u003chttps://kokkai.ndl.go.jp/api.html\u003e\n- e-Gov 法令API v2 — \u003chttps://laws.e-gov.go.jp/api/2/swagger-ui\u003e ／ 更新法令一覧 — \u003chttps://laws.e-gov.go.jp/update/\u003e\n- 参議院（記名投票結果・議員名簿） — \u003chttps://www.sangiin.go.jp/\u003e\n- 政治資金収支報告書（総務省） — \u003chttps://www.soumu.go.jp/senkyo/seiji_s/seijishikin/\u003e\n- 調達ポータル — \u003chttps://www.p-portal.go.jp/\u003e\n- EDGI Web Monitoring — \u003chttps://envirodatagov.org/website-monitoring/\u003e\n- Talk to the City — \u003chttps://www.talktothe.city/\u003e\n- デジタル民主主義2030 — \u003chttps://dd2030.org/\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaikei-e%2Fs4rciv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaikei-e%2Fs4rciv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaikei-e%2Fs4rciv/lists"}