{"id":51862279,"url":"https://github.com/semanticintent/rune-protocol","last_synced_at":"2026-07-24T09:30:24.385Z","repository":{"id":355323038,"uuid":"1227645657","full_name":"semanticintent/rune-protocol","owner":"semanticintent","description":"A four-sigil reactive binding protocol: @ read · ~ sync · ! act · ? intent","archived":false,"fork":false,"pushed_at":"2026-05-03T01:16:36.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-03T03:20:11.737Z","etag":null,"topics":["ai","bindings","csharp","governance","protocol","react","reactive","sql","typescript"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semanticintent.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","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-05-03T01:00:20.000Z","updated_at":"2026-05-03T01:16:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/semanticintent/rune-protocol","commit_stats":null,"previous_names":["semanticintent/rune-protocol"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/semanticintent/rune-protocol","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semanticintent%2Frune-protocol","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semanticintent%2Frune-protocol/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semanticintent%2Frune-protocol/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semanticintent%2Frune-protocol/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semanticintent","download_url":"https://codeload.github.com/semanticintent/rune-protocol/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semanticintent%2Frune-protocol/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35837268,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-24T02:00:07.870Z","response_time":62,"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":["ai","bindings","csharp","governance","protocol","react","reactive","sql","typescript"],"created_at":"2026-07-24T09:30:23.673Z","updated_at":"2026-07-24T09:30:24.370Z","avatar_url":"https://github.com/semanticintent.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rune Protocol\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20007883.svg)](https://doi.org/10.5281/zenodo.20007883)\n\n**A four-sigil reactive binding protocol for documents.**\n\nRune is a minimal, embeddable protocol that gives any document format four operations: read state, sync state, trigger actions, and declare intent. Nothing more.\n\n```\n@  read      — display a value from state\n~  sync      — two-way binding between input and state\n!  act       — trigger a named action\n?  intent    — annotate meaning for humans and AI\n```\n\n---\n\n## The Protocol in 30 Seconds\n\nEvery interactive document needs the same four things. Rune names them once:\n\n```html\n\u003c!-- A task input that syncs, triggers, displays, and annotates --\u003e\n\u003cfield ~new-task placeholder=\"New task…\"/\u003e          \u003c!-- sync: user types → state updates --\u003e\n\u003cbutton !add-task\u003eAdd\u003c/button\u003e                      \u003c!-- act: explicit trigger --\u003e\n\u003clist @tasks\u003e                                        \u003c!-- read: display state --\u003e\n  \u003citem @item.title/\u003e\n\u003c/list\u003e\n\u003cscreen ?\"mobile task list, minimal, focus on speed\"\u003e \u003c!-- intent: AI metadata --\u003e\n```\n\nNo framework. No runtime dependency. Four characters, complete grammar.\n\n---\n\n## Why Rune Exists\n\nEvery domain that has reactive data reinvents the same four operations from scratch — incompatibly:\n\n| System | Read | Sync | Act | Intent |\n|--------|------|------|-----|--------|\n| React | `{val}` | `onChange` | `onClick` | — |\n| Angular | `[prop]` | `[(ngModel)]` | `(event)` | — |\n| Vue | `:prop` | `v-model` | `@click` | — |\n| Config files | `${ENV}` | — | — | `# comment` |\n| SQL | `@param` | — | — | `-- comment` |\n| **Rune** | `@` | `~` | `!` | `?` |\n\nNone are interoperable. None are complete. None have the fourth operation.\n\n`?` is what makes Rune new. It is not a comment — it is **structured intent** that travels with the binding, is addressable by tooling, and is machine-readable by AI. No existing binding protocol has this.\n\n---\n\n## The Four Runes\n\n| Rune | Name | Direction | Meaning |\n|------|------|-----------|---------|\n| `@` | Read | State → Display | Observe a value. No side effects. |\n| `~` | Sync | State ↔ Input | Bidirectional coupling. Input and state stay in sync. |\n| `!` | Act | User → Behavior | Explicit invocation. Nothing happens without intent. |\n| `?` | Intent | Document → Human/AI | Structured annotation. Ignored at runtime. Read by tools. |\n\nThese four are **complete**. You cannot add a fifth without it being redundant. That bounded completeness is what makes Rune embeddable — it is a protocol, not a framework.\n\n---\n\n## Rune is a Protocol, Not a Runtime\n\nA framework says \"use our runtime.\"  \nA protocol says \"adopt this grammar, implement your own runtime.\"\n\nRune defines the **semantics** of the four runes. Host formats define the **element vocabulary**. Each host provides its own runtime — or embeds the Rune reference runtime.\n\n**Mere** (the workbook format for apps) is Rune's origin and reference implementation.  \nAny format can be a Rune host.\n\n---\n\n## Host Formats\n\nRune has been designed to embed naturally in:\n\n- **UI documents** — application screens, dashboards, forms\n- **Configuration files** — infrastructure, environment, deployment\n- **Publishing formats** — documents, reports, templates\n- **Domain languages** — trading signals, clinical records, legal contracts\n- **API specifications** — interactive docs with live bindings\n\nSee [HOSTS.md](HOSTS.md) for the host implementation guide.\n\n---\n\n## Schema\n\n**`rune.schema.json`** is the canonical binding manifest — the artifact that makes cross-layer contracts enforceable.\n\n```json\n{\n  \"$schema\": \"https://rune.semanticintent.dev/rune.schema.json\",\n  \"$rune\": \"1.1\",\n  \"host\": { \"format\": \"react\", \"source\": \"app.tsx\" },\n  \"bindings\": {\n    \"risk-threshold\": {\n      \"rune\": \"~\",\n      \"type\": \"number\",\n      \"min\": 0.05,\n      \"max\": 0.30,\n      \"intent\": \"approved by risk committee Q1-2025 — review at quarter end\"\n    },\n    \"market-price\":  { \"rune\": \"@\", \"type\": \"number\", \"intent\": \"live NBBO feed — not manually entered\" },\n    \"submit-order\":  { \"rune\": \"!\", \"args\": [{ \"name\": \"order-id\", \"type\": \"string\", \"required\": true }], \"intent\": \"explicit, logged to OMS, irrevocable\" }\n  }\n}\n```\n\nKeys are canonical kebab-case identifiers. Hosts translate to their own conventions — SQL: `risk_threshold`, C#: `RiskThreshold`, React: `'risk-threshold'`. The schema is the arbiter.\n\nSee [examples/task-workbook.rune.json](examples/task-workbook.rune.json) for a complete manifest and [CONTRACTS.md](CONTRACTS.md) for the full cross-layer enforcement model.\n\n---\n\n## Specification\n\n- [SPEC.md](SPEC.md) — Formal definition of the four runes\n- [PHILOSOPHY.md](PHILOSOPHY.md) — Why four, why these four, the completeness argument\n- [INDUSTRY.md](INDUSTRY.md) — How Rune reflects across domains\n- [ADOPTION.md](ADOPTION.md) — What spreading looks like\n- [AI.md](AI.md) — AI inference vs declaration: what AI reads in a Rune-annotated system\n- [CONTRACTS.md](CONTRACTS.md) — Cross-layer contract enforcement: the Rune schema as ground truth\n- [ROADMAP.md](ROADMAP.md) — What's next: tooling, packages, site, ecosystem\n\n## Examples\n\n- [examples/mere.md](examples/mere.md) — Rune in Mere workbooks (origin)\n- [examples/config.md](examples/config.md) — Rune in configuration files\n- [examples/recall.md](examples/recall.md) — Rune in publishing documents\n- [examples/clinical.md](examples/clinical.md) — Rune in healthcare documentation\n- [examples/legal.md](examples/legal.md) — Rune in contract systems\n- [examples/trading.md](examples/trading.md) — Rune in financial/trading systems\n\n## Implementations\n\nReference implementations showing the protocol mapped to host language idioms.\n\n### C#\n- [implementations/csharp/RuneCore.cs](implementations/csharp/RuneCore.cs) — Domain model: `RuneType`, `RuneBinding`, `RuneParser`, all four stores\n- [implementations/csharp/RuneHost.cs](implementations/csharp/RuneHost.cs) — Host wiring: `RuneHost`, attributes, reflection-based `RuneHostBuilder`\n- [implementations/csharp/Example.cs](implementations/csharp/Example.cs) — Three patterns: attribute-based, fluent, template engine simulation\n\n### SQL (PostgreSQL)\n- [implementations/sql/rune_core.sql](implementations/sql/rune_core.sql) — Registry tables, helpers, `rune_intent_all` view\n- [implementations/sql/example_task_workbook.sql](implementations/sql/example_task_workbook.sql) — Task list: views as `@`, columns as `~`, functions as `!`\n- [implementations/sql/example_risk_dashboard.sql](implementations/sql/example_risk_dashboard.sql) — Risk dashboard: audit-logged `!`, compliance `?`, read-only `@` feeds\n\n**The mapping is direct:**\n\n| Rune | C# | SQL |\n|------|-----|-----|\n| `@` | `[RuneComputed]` property / `host.Read()` | `VIEW` or generated column |\n| `~` | `[RuneState]` property / `host.Sync()` | Mutable `TABLE` column |\n| `!` | `[RuneAction]` method / `host.Act()` | `FUNCTION` or `STORED PROCEDURE` |\n| `?` | `[RuneIntent]` attribute / `host.RecordIntent()` | `COMMENT ON` + `rune_intent` table |\n\n---\n\n## Origin\n\nRune grew out of the sigil syntax in [Mere](https://mere.mp) — a workbook format for apps where the file is the app.\n\nThe four sigils were designed for Mere's bounded, AI-native authoring surface. They turned out to be a complete reactive grammar. This document formalises them as a standalone protocol.\n\n**Mere invented it. Rune names it.**\n\n---\n\n*Part of the [Cormorant Foraging](https://cormorantforaging.dev) ecosystem.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemanticintent%2Frune-protocol","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemanticintent%2Frune-protocol","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemanticintent%2Frune-protocol/lists"}