Releases: Ashon/supragnosis
Release list
v0.1.6
Changes since v0.1.5.
Highlights
The viewer speaks the landing's design language (candlelight)
supragnosis.dev and the live viewer used to look like two different products; now they are one.
The landing's candlelight theme moves into the viewer wholesale - warm gold on near-black ink,
parchment text, mono chrome with serif prose, a soft glow beneath the transparent canvas and film
grain above it.
- Palette: gold is the accent voice (active toggles/tabs/chips, hovers, the wordmark
asterisk); teal is the success voice (hub health,in sync, session footprint rings, the
canonical ring in a merge preview). Hull fill and edge opacity are retuned for the darker ink. - Typography: UI chrome is the mono stack, prose (descriptions, definitions, rationale, empty
states) is the serif stack - and the canvas node labels are mono too, matching the landing's
hero constellation. Fonts stay self-contained: no webfont fetch, the viewer keeps working
offline on its loopback surface. - Details: the 5-spoke gold asterisk favicon rides along as a data URI; a proposal's
accept
is the landing's solid-gold button (the gate's primary act); the detail panel's close control is
a real icon button (inline SVG X, round-capped strokes like the favicon) instead of a text glyph.
Island panels - the graph continues behind the chrome
The side rails become floating card islands: inset from every screen edge, rounded and
shadowed, so the canvas visibly continues behind and around them instead of ending at two walls.
- Height hugs the content - an empty Proposals tab is a small card, not a full-height empty
column - and caps above the statusbar, with the rail body scrolling inside the card. - The camera controls (
+/-/fit) relocate to the canvas's bottom-right as a vertical
stack (the map-tool convention); their old top-right spot lost its anchor once the rails
stopped being full-height. The right island's height cap reserves that corner, so a full
proposals list can never slide under the zoom buttons. - Auto-fit and centering follow the new geometry - the graph frames itself into the strip
between the islands.
Type definitions where the types are read
Hovering a node-type or edge-type legend chip now shows the type's T-Box definition in the
styled tooltip, next to the existing on-graph highlight. A type with no recorded definition gets
a nudge toward define_type instead of silence - the Principle 8 vocabulary surfaces in the
reading flow, and the gap in it becomes a curation micro-decision (Principle 22) rather than a
separate chore. The glossary is fetched regardless of whether the Types tab is open, so the
vocabulary is always warm.
Reduced motion respected
With prefers-reduced-motion, the viewer skips the settling animation entirely: the layout
simulation burst-steps to convergence within one frame and the graph appears already still - the
same respect the landing pays. Everyone else keeps the calm loader.
Fix: chrome tooltips no longer swallowed
The window-level mousemove handler used to hide the shared tooltip on every pointer move - which
killed the new chip tooltips instantly, and could surface node tooltips for nodes hidden beneath
opaque panels. Node hover now runs only for canvas-targeted moves; dragging and panning still
work across the whole window.
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64, glibc 2.35+); each asset ships a
.sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- Viewer-only release: no storage format, wire format, or MCP surface change - v0.1.5 nodes
and hubs interoperate unchanged. - The named fonts (IBM Plex Mono, Newsreader) render when installed locally; otherwise the viewer
falls back to the system mono/serif stacks by design (no webfont fetch on the loopback surface). - The viewer's opt-in network exposure (
SUPRAGNOSIS_VIZ_PUBLIC=1) remains read-only and remains
broader than the sync share whitelist (aworkspace=*read serves every workspace) - treat it
as "publish this node read-only" until the authenticated read tier (federation Phase 3.5) lands.
See architecture.md Section 14. - 0.x early release - the storage format and surfaces may still change.
v0.1.5
Changes since v0.1.4.
Highlights
Federation goes live (M4 Phase 4) - run a hub, sync your nodes
v0.1.4 shipped the federation library; v0.1.5 wires it into the product. A node can now run as a
sync server (hub) and other nodes can replicate their knowledge to and from it - over TLS, with
per-node bearer/allowlist auth and per-event ed25519 signatures.
- Configuration:
supragnosis.toml(SUPRAGNOSIS_CONFIGor~/.supragnosis/supragnosis.toml)
with[sync](share_workspaces / servers / auth_token / insecure_tls / origin_keys) and
[server](listen / tls_cert / tls_key / allowlist). Unknown keys are rejected loudly - a typo
cannot silently disable a role. No file = a standalone node, zero behavior change. - Node identity: an ed25519 keypair is generated once at
~/.supragnosis/node.key; the
immutable node id derives from the public key.supragnosis identityprints it (and
--hash-tokenprepares an allowlist entry for a peer's bearer token). - CLI:
supragnosis sync(one-shot round: push surplus, pull deficit, apply, re-materialize),
supragnosis reproject(deterministic HLC-ordered re-materialization), and
supragnosis migrate(see below). The[server]role starts alongside the daemon; a
misconfigured server section fails startup loudly instead of silently running without the role. - MCP tools:
sync_status/sync_pull/sync_push(the surface is now 13 tools) - an agent
can inspect the node's version vector, pull missing knowledge, and push local knowledge without
stopping the daemon. Inbound pushes re-materialize automatically on the server.
Federated recall - search the remote ontology when local state lags
search_knowledge gains scope: "local" | "remote" | "both". Local state can lag the remote
store, so a local miss may just mean "not synced yet" - the remote scope queries the configured
sync servers' own recall surfaces (mode-labeled), gated by the same per-node workspace
authorization as sync. Remote hits are a recall aid: sync_pull materializes them locally before
traverse/get_entity - the signed log remains the only transport of knowledge.
Legacy-id migration - pre-0.1.x knowledge can now cross the wire
The content-address formula evolved during 0.x (descriptions, type definitions, proposal events
each extended the assertion encoding), so observations stored under an earlier formula cannot
verify remotely - the receiver recomputes ids, and forged or stale ids never land (working as
designed). supragnosis migrate re-creates such rows under the current formula - content,
assertions, and provenance preserved, with lineage back to the legacy row - after which they sync.
Legacy rows themselves stay local history and are never exported.
Live federation observability
Sync hits stream into the viewer activity feed on both sides: the hub shows who connected
(authenticated node id), which direction (advertise / pull-served / push-received /
search-served), which workspace, and how much; a spoke shows its own rounds. Watching the hub's
viewer during a sync shows the federation working in real time.
Viewer
- Interim read-only network exposure: with the owner's explicit opt-in
(SUPRAGNOSIS_VIZ_PUBLIC=1), the viewer may bind beyond loopback for read-only browsing -
sharing is the creator's decision. Every write endpoint stays gated per connection to loopback
peers (a remote peer gets 403 for verdicts). Superseded by the authenticated read tier
(federation Phase 3.5). - Camera choreography: in follow mode the camera frames an event's whole hit set (pan + zoom)
instead of centering on one node; after synced knowledge lands, the graph re-frames once the
re-layout settles; switching workspaces resets the view state, raises the layout loader
immediately, and reveals the new graph auto-fitted.
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64, glibc 2.35+); each asset ships a
.sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- Single-principal federation: multi-principal workspaces await the governance enforcement
phase (canon-policy artifact, proposal-fold identity checks, the tbox_change gate). Deploy hubs
for one principal's machines for now. - Origin keys are configured manually (
[sync] origin_keys) until the log-borne canon-policy
binding lands. - Embeddings do not sync (they are a node-local recall aid by design): knowledge pulled from a
hub answers keyword search immediately, but semantic recall requires local re-embedding - a
re-embed pass is future work. The federated-recall scope can query the server's (richer) surface
meanwhile. supragnosis sync/migrate/reprojectneed the daemon stopped (single-process store); with a
running daemon use thesync_*MCP tools instead.- A self-signed hub certificate requires
insecure_tls = trueon clients; content authenticity is
still end-to-end (per-event signatures). A real CA or pinned cert is recommended when available. - HTTP daemon (MCP) stays loopback-only; the viewer's network exposure is opt-in and
read-only as above. - 0.x early release - the storage format and surfaces may still change.
v0.1.4
Changes since v0.1.3.
Highlights
Federation foundations (M4 Phases 1-3) - two nodes can now replicate and converge
The groundwork for hub-and-spoke knowledge sharing, specified first
(docs/federation.md: invariants F1-F20 and the convergence propositions
Prop A-D, each pinned to a test) and then built in three phases:
- Node identity and signed attestations (Phase 1): every node holds an ed25519 keypair;
node_idis the public-key fingerprint (self-certifying, immutable). Attestations gain an
optional sync block - origin, per-(node, workspace) sequence, a hybrid logical clock stamp, and
an ed25519 signature that covers the content id and the origin's lineage declaration, so a relay
can forge nothing. Sync metadata lives outside the content address: the same fact observed on two
nodes keeps ONE id and dedups on arrival. - Sync core (Phase 2): export-boundary stamping (backfill covers pre-federation and new
knowledge uniformly), version-vector delta exchange under selective sharing (a workspace leaves
the node only if explicitly shared), and a verify -> dedup/absorb -> re-project apply pipeline
that is idempotent and hole-tolerant.Engine::reprojectre-materializes entities/relations by
replaying the log in HLC order, so last-write-wins fields converge across nodes instead of
depending on local arrival order. - Sync transport (Phase 3, library-level): an HTTP sync API (
/sync/advertise|pull|push) with
in-process rustls TLS and per-node bearer/allowlist wire auth, plus a client that runs a full
sync round (push surplus, pull deficit, apply). A non-loopback bind is refused unless TLS is
enabled and the allowlist is non-empty; the MCP/viewer loopback guard is untouched.
Viewer - reading direction, flow, and context at a glance
- Edge flow animation: the edges of the hovered/focused node animate marching dashes from
source to target - direction reads instantly. - Curved parallel edges: multiple links between the same two nodes fan into arcs - a
bidirectional pair opens into a lens (cycles are visible), several verbs in one direction fan
out, and each curve carries its own relation label (capped, with a "+K more" summary). - Region-style hull labels: co-occurrence context names render like map region labels - sized
by context, collision-culled, crisply stroked - and the hull overlay is now on by default. - Legend hover highlight: hovering a node-type or edge-kind chip lights up the matching
nodes/edges (edge-kind hover animates its edges), labels the highlighted set, and fades
non-matching hulls - render-only, the layout never reheats. - Arrowheads scale with zoom; all graph input is locked behind the loading indicator while the
layout settles.
Release engineering
- Linux release binaries are now built on ubuntu-22.04, so they run on glibc 2.35+ systems
(v0.1.3 binaries required GLIBC 2.38+ and failed on Ubuntu 22.04 servers).
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64); each asset ships a .sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- Federation is library-level in this release: the sync API, client, stamping, and
re-materialization are implemented and tested (in-process and over HTTP), but there are no CLI
commands or config wiring yet -supragnosis sync, the server role, and thesync_*MCP tools
are Phase 4. Nothing changes in a running deployment's behavior. - Federated deployment stays single-principal until the governance enforcement phase lands
(canon-policy artifact, I9/I17 checks in the proposal fold, the tbox_change gate - Phase 5). - Storage-format note: attestations may now carry a sync block (origin/seq/HLC/signature).
Reads are backward compatible (old rows simply have none), but a DOWNGRADED binary that rewrites
a stamped observation will drop the stamps - avoid downgrading after stamping begins. - The MCP tool surface is unchanged (10 tools). HTTP daemon / viewer remain loopback-only
(no auth); remote access to a deployed node is an SSH tunnel until the hub read tier
(Phase 3.5) ships. - The prebuilt binary is keyword + hashing search. For local ONNX semantic search, build
from source withcargo build --release --features fastembed. - 0.x early release - the storage format and surfaces may still change.
v0.1.3
Changes since v0.1.2.
Highlights
Curation and the proposal gate - knowledge management with a human in the loop
The workspace can now surface how its knowledge could be tidied, and every change to the
projected graph goes through a reviewable proposal - it generates, it does not commit.
- Read-only curation signals: a new curation projection points out where the ontology
wants attention - merge candidates (entities that collide on name), grab-bags
(over-large hyperedges), and orphans (unconnected entities). Signals are a pure
projection over the observation log; they suggest, they never mutate (Principle 7:
consolidation generates, it does not commit). - Proposal workflow: new
propose/review/list_proposals/get_proposaltools.
A proposal is itself an observation on the log, and its state (open / merged / rejected /
withdrawn) is a deterministic fold over proposal events - so the audit trail is the source
of truth and nothing is applied out of band. Five proposal kinds are recorded:
entity_merge,claim_promotion,claim_demotion,tbox_change,recall. - Entity merge by projection-time id forwarding: an accepted
entity_mergedoes not
delete or rewrite anything - the graph projection forwards the merged-away id onto the
canonical one, rewires edges (dropping self-loops and deduping), aggregates sources, and
absorbs the merged names as aliases. Append-only, fully reversible in principle (Principles
3/14/15).
Gated consolidation - the design standard, written down first
docs/principles.md: Principle 7 enforcement extended - consolidation generates, does
not commit. Any refine/tidy/recall pass produces proposals for review, never a silent
rewrite.docs/proposal-workflow.md: invariant I18 (consolidation is a source of proposals, not
a sixth commit path) and a new section on the consolidation-and-curation-console flow.
Viewer - curation console and a full layout overhaul
- Curation console: the signals, the proposal list, and a review action live in the
viewer; clicking a proposal previews the merge on the graph (dashed arrow from the
merged-away node to the canonical one, accented incident edges, target and canonical rings)
before you accept it. - Type glossary panel: the workspace T-Box (
define_type) is browsable in the viewer. - Two full-height side rails: left = observe (layers + node/edge legends, stacked),
right = manage (proposals / review / types tabs), with an IDE-style bottom status bar
for stats / session / connection. - Node detail moved to a wide center-bottom panel (two-column outgoing / incoming); the
zoom controls moved to the top-right so the bottom stays clear. Centering accounts for the
open panel height so a focused node stays visible. - Central-axis anchor: a rigid per-frame centroid recenter keeps the whole cluster fixed
to the center - it no longer drifts off to one side as the simulation cools or restarts. - Layout loading indicator: the graph is hidden behind a spinner while the simulation is
violently settling and revealed already fitted once it calms; clicking or focusing a node
no longer reheats the layout.
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64); each asset ships a .sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- Merge effect is projection-time only:
entity_mergeforwards ids in the graph
projection. Other read surfaces (get_entity/traverse/search_knowledge/ the
hypergraph) do not yet apply forwarding consistently - that is the next step. - Only
entity_mergehas a graph effect today; the other proposal kinds
(claim_promotion/claim_demotion/tbox_change/recall) are recorded and
reviewable but not yet enforced. Blocking checks (referential integrity, etc.) are future
work. reviewaccepts a verdict directly (single-user workspace, solo self-attested exception).
There is no un-merge / contradiction signal yet.- The prebuilt binary is keyword + hashing search. For local ONNX semantic search,
build from source withcargo build --release --features fastembed. - HTTP daemon / viewer are loopback-only (no auth) - a local trust surface. Remote
exposure, auth, and TLS are future work. - 0.x early release - the storage format and surfaces may still change.
v0.1.2
Changes since v0.1.1.
Highlights
Ontology descriptions - capture the meaning, not just the label
Knowledge is now more than names and types: you can attach a human-readable explanation to
what you record.
- Per-instance descriptions:
observetakes an optionaldescriptionon each entity and
each relation - what the entity is, or what the connection means and why. Descriptions are
content identity (folded into the observation's content-address), so a different description
is a distinct asserted claim; the projected entity/relation carries the latest one, and the
log keeps the full history. Shown in the live viewer's detail panel (node description; the
relation description on row hover). - Type glossary (T-Box): a new
define_typetool records what an entity type or a
relation type means (e.g.Driver= "a kernel module that ...",depends_on= "X
requires Y at runtime"). A definition is required (a type has no meaning without one), and
the vocabulary is workspace-scoped. Read it back via the new
supragnosis://workspace/{ws}/typesresource. Type definitions ride the observation log
like any other assertion, so the glossary is a deterministic projection.
Viewer - hull rendering overhaul
- The hyperedge cohesion force is on by default now (the baseline layout organizer); the
hullsbutton is a render-only overlay toggle, and group mode takes precedence so the two
organizers never fight. Toggling the overlay no longer reheats the simulation. - Hull areas render as smooth rounded blobs (a single outward-offset path, no overshoot) with
uniform per-hull opacity that no longer floods the canvas; overlapping contexts still blend. - Hovering or focusing a node emphasizes its own hulls (fills and labels) and fades the rest.
- The hull gap encloses the node glyphs, and cohesion/opacity scale with hull size.
CLI - supervisor-aware lifecycle
stop/restart/statusnow detect a launchd-managed daemon (macOS) and drive it via
launchctl(restart =kickstart -k, stop =bootout), falling back to the self-managed
pidfile daemon otherwise. Sosupragnosis restartrestarts the running MCP server + viewer
regardless of who started it.- The launchd label is standardized to
com.supragnosis.daemon;deploy/install.shmigrates
the legacy label automatically.
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64); each asset ships a .sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- Storage-format note: including
descriptionin the observation content-address changes
the id of assertion-bearing observations (text-only observations are unchanged). After
upgrading, such observations will not dedup against ones ingested by an earlier version.
This is acceptable for the 0.x format (which may still change). define_typecurrently validates well-formedness and writes to the workspace T-Box directly
(single-user workspace). The proposal gate and T-Box consistency check are future work.- The prebuilt binary is keyword + hashing search. For local ONNX semantic search,
build from source withcargo build --release --features fastembed. - HTTP daemon / viewer are loopback-only (no auth) - a local trust surface. Remote
exposure, auth, and TLS are future work. - 0.x early release - the storage format and surfaces may still change.
v0.1.1
Changes since v0.1.0.
Highlights
Single-binary CLI (server control)
The supragnosis binary is now driven by subcommands (clap). Running it with no
arguments still starts the stdio MCP server, so MCP clients that launch it as a child
process keep working unchanged.
serve [--http --viz --store --data-dir --host --workspace --embed --session]- foreground
run (stdio by default;--httpstarts the streamable-http daemon,--vizthe live viewer).
Flags take precedence over theSUPRAGNOSIS_*environment variables.start/stop/restart/status- a self-managed background daemon (pidfile
~/.supragnosis/supragnosis.pid+ logs~/.supragnosis/log), so it runs without launchd.
statusalso detects an externally-managed daemon (e.g. launchd) via a port health check
even when there is no pidfile.
English codebase and docs
The entire repository is now English: all source comments and user-facing strings (error
messages, logs, MCP tool/resource descriptions, the live viewer UI, CLI help/output), every
Cargo.toml, the install scripts, and all design docs (architecture, principles,
proposal-workflow, README, deploy). Behavior is unchanged - only prose was translated, and
test-asserted strings were updated in lockstep.
Viewer
Node size and inter-node spacing now scale with neighbor count (degree): hubs are larger and
get more surrounding room, while sparsely-connected nodes stay small and tight.
install.sh
Added --help (usage, options, environment variables) and clearer post-install onboarding
(stdio registration, optional daemon + viewer, docs links).
Install
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | shOr download the platform tar.gz from the assets below, extract it, and put supragnosis
on your PATH. Supported: macOS (arm64 / x86_64), Linux (x86_64); each asset ships a .sha256.
- CLI:
supragnosis --help. Register with an MCP client:claude mcp add supragnosis -- ~/.local/bin/supragnosis.
Notes / limitations
- The prebuilt binary is keyword + hashing search. For local ONNX semantic search, build
from source withcargo build --release --features fastembed. - HTTP daemon / viewer are loopback-only (no auth) - a local trust surface. Remote exposure,
auth, and TLS are future work. - 0.x early release - the storage format and surfaces may still change.
v0.1.0
여러 호스트/작업 공간의 지식을 출처(provenance)를 보존한 채 온톨로지(개념/관계 그래프)로
통합하고 MCP 로 질의/탐색하는, 임베디드/파일 기반 Rust 서버의 첫 릴리스입니다.
supragnosis= supra(위/너머) + gnosis(앎) - 지식 위의 지식(메타지식).
하이라이트
MCP 도구 (LLM 에이전트 표면)
observe- 지식 조각을 불변 관측(진실의 원천)으로 적재하고 엔티티/관계를 온톨로지에 링크search_knowledge- 의미 + 키워드 하이브리드 검색 (응답mode로 degrade 여부 표기)get_entity- 엔티티 + 관계 + 출처 조회 (부재는 거짓이 아니라 미지 - 열린 세계 가정)traverse- 관계 그래프 n-hop 순회workspace_map- 공동출현 맥락(하이퍼엣지)을 이름으로 개관, 검색 전 오리엔테이션- 리소스: 온톨로지 그래프 / 하이퍼그래프 / 관측 역참조(원문 + 출처 + 계보)
지식 모델
- event sourcing - 불변 관측 로그가 진실의 원천, 그래프는 결정적 프로젝션
- 출처 1급 시민 - 위임 사슬 + 신뢰 등급, 콘텐츠 주소(blake3)로 경로 무관 dedup
- 하이퍼그래프(이차 구조) - 한 관측이 공동 주장한 엔티티 집합을 되살려, 이진 관계가
버린 "무엇이 함께 말해졌는가"(맥락)를 회복. 스키마 유도/해소/응고의 결정적 입력 - Cozo/RocksDB 영속 - 관계 + 그래프 + 벡터(HNSW) 통합, 헥사고날 포트-어댑터
실행 모드
- stdio MCP - 에이전트가 자식 프로세스로 기동
- standalone HTTP 데몬 - localhost 상시 데몬 하나가 db 를 잡고 여러 에이전트가 공유
- 라이브 온톨로지 뷰어 - localhost canvas: 하이퍼엣지 hull 오버레이, visibility 토글,
관계 종류별 엣지 색상, 검색/순회 발자국
설치
curl -fsSL https://raw.githubusercontent.com/Ashon/supragnosis/main/scripts/install.sh | sh또는 아래 자산에서 플랫폼 tar.gz 를 직접 내려받아 압축 해제 후 supragnosis 를 PATH 에 둡니다.
- 지원 플랫폼: macOS(arm64 / x86_64), Linux(x86_64). 각 자산에
.sha256체크섬 포함. - 등록 예:
claude mcp add supragnosis -- ~/.local/bin/supragnosis
참고 / 한계
- prebuilt 바이너리는 키워드 + hashing 검색입니다. 로컬 ONNX 의미 검색은 소스에서
cargo build --release --features fastembed로 빌드하세요(무거운 ONNX 런타임 의존이라 제외). - HTTP 데몬 / 뷰어는 loopback 전용(무인증) - 로컬 신뢰 표면. 원격 노출/인증/TLS 는 후속.
- 0.x 초기 릴리스 - 저장 포맷과 표면이 향후 바뀔 수 있습니다.
설계 문서
- 아키텍처:
docs/architecture.md - 설계 원칙:
docs/principles.md - 제안 워크플로:
docs/proposal-workflow.md