OpenWebring and OpenWiki carry the whole AI Content Disclosure vocabulary (#190)

The W3C AI Content Disclosure community group defines four attributes,
not one: ai-disclosure, ai-model, ai-provider and ai-prompt-url. Both
specs carried only the first, as `disclosure`. They now carry all four,
as `disclosure`, `ai_model`, `ai_provider` and `ai_prompt_url`: which
model, whose, and a page describing how it is used, optional and
meaningful only beside a disclosure other than none. `mixed`, the value
the group's meta tag form allows, is accepted at the site level in
OpenWebring and the page level in OpenWiki.

A ring host copies all of them into the member entry as the member said
them. A wiki carries them on the page and per revision, and a host
rendering a page puts the same four on it as the group's meta tag and
attributes. Both specs are 0.1.1; the wire version stays 0.1, since every
field is additive and absent is still unstated.


Claude-Session: https://claude.ai/code/session_01XYae2mH3khdwiXUVzcVMDw

Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Anthony Ettinger 2026-09-13 06:14:05 -07:00 • committed by GitHub
parent 0395ff12ce
commit ba69f58243
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 33 additions and 13 deletions

View file

@ -2,7 +2,7 @@
OpenWebring is a webring that says who made it. A ring is an ordered set of sites with a link from each to the next, the way rings have worked since 1995; what this adds is one file a ring serves about its members, one file a member may serve about itself, and a declaration on every member of whether the site is made by a person, by AI, or by both. A reader who wants only the human web can follow the ring and get it. A reader who wants to see what agents are writing can follow that ring instead. Nobody has to guess, and nobody has to install a script. It is maintained by Profullstack, Inc. as part of the LogicSRC open-standards surface.
Status: **0.1**. A description of a ring already running, published so any site can host one and any site can join one.
Status: **0.1.1**. A description of a ring already running, published so any site can host one and any site can join one.
Slug: `openwebring`
@ -48,6 +48,9 @@ A member may also serve a descriptor at `/.well-known/openwebring.json`:
},
"made_by": "human",
"disclosure": "ai-assisted",
"ai_model": "gpt-5.1",
"ai_provider": "OpenAI",
"ai_prompt_url": "https://chovy.com/ai-methodology#posts",
"rings": [
{ "ring": "https://rssamplifier.com/ring/small-web", "slug": "chovy" }
],
@ -58,7 +61,8 @@ A member may also serve a descriptor at `/.well-known/openwebring.json`:
- **`site.url`** is the canonical home page, with the trailing slash the site itself uses. It is the identity a ring matches hops against.
- **`site.feed`**, **`lang`**, **`banner`**, **`author`** are what existing rings ask for: a feed so a ring can be read as one river, a language, an 88 by 31 banner for rings that show one, and the person behind the site as an [OpenProfile.md](/openprofile) URL. Absent is unstated.
- **`made_by`** is `human`, `ai` or `both`. `human` means a person makes the content, with tools at most. `ai` means a model or agent makes it, with a person at most pointing it. `both` means a mix the site does not care to split. It is a self-declaration and nothing verifies it; a ring that wants more asks for it in its own terms.
- **`disclosure`** is finer, optional, and uses the vocabulary of the W3C AI Content Disclosure community group verbatim: `none`, `ai-assisted`, `ai-generated`, `autonomous`, so it maps onto the `ai-disclosure` HTML attribute and the IETF `AI-Disclosure` header without translation. A site that says `made_by: human` and `disclosure: ai-assisted` writes its own words and lets a model tidy them, and says so.
- **`disclosure`** is finer, optional, and uses the vocabulary of the W3C AI Content Disclosure community group verbatim: `none`, `ai-assisted`, `ai-generated`, `autonomous`, so it maps onto the `ai-disclosure` HTML attribute and the IETF `AI-Disclosure` header without translation. A site that says `made_by: human` and `disclosure: ai-assisted` writes its own words and lets a model tidy them, and says so. A site whose involvement differs page by page may say `mixed`, the value the group's meta tag form allows, and let each page carry its own attributes.
- **`ai_model`**, **`ai_provider`** and **`ai_prompt_url`** are the rest of that vocabulary, the `ai-model`, `ai-provider` and `ai-prompt-url` attributes under our naming: which model, whose, and a page on the site describing how it is used. Optional, and meaningful only beside a `disclosure` other than `none`. A site that says them on its pages says them here once, and a directory shows them beside the disclosure.
- **`rings`** is the one thing no existing format carries: the site's own statement of which rings it belongs to, each as the ring's URL and the member's slug there. A directory learns a site's rings from the site, and a ring learns a member is still willing from the member.
## The host
@ -117,7 +121,7 @@ And each ring's own file, at `members_url` (a host with one small ring may put `
- **`accepts`** is the ring's policy on `made_by`: which declarations it admits. Absent means all three. A reader filtering rings for the human web looks for `["human"]`.
- **`join`** is where a site asks in. How is the host's business: a form, a sign-in with the site's own URL, a pull request, or the oldest way, putting the links on the page and clicking one.
- **`members`** is the list in ring order. Each member is a subset of the member descriptor plus **`status`** (`active`, `inactive`, `pending`), **`since`**, and **`checked`**, when the host last saw the member's link. Order is the hop order and is stable: a member keeps its place until it leaves.
- **`members`** is the list in ring order. Each member is a subset of the member descriptor, with `made_by`, `disclosure`, `ai_model`, `ai_provider` and `ai_prompt_url` copied as the member said them, plus **`status`** (`active`, `inactive`, `pending`), **`since`**, and **`checked`**, when the host last saw the member's link. Order is the hop order and is stable: a member keeps its place until it leaves.
- **`opml`** is the same members as an OPML 2.0 outline of their feeds, so the ring is a subscription list in one click, and so the tools that already read a ring's OPML read this one.
## Hops
@ -195,6 +199,7 @@ A host is a table of rings, a table of members with a position, three redirect r
| Version | Date | Change |
|---|---|---|
| 0.1 | 2026-09-13 | First publication: the member, the host, the two files, six hop rules, verification, discovery, what a directory owes a ring. |
| 0.1.1 | 2026-09-13 | `ai_model`, `ai_provider` and `ai_prompt_url` beside `disclosure`, the rest of the W3C AI Content Disclosure vocabulary; `mixed` allowed at the site level; a host copies all of them into the member entry. |
## License

View file

@ -2,7 +2,7 @@
OpenWiki is a wiki that is a folder of Markdown files. One file per page, links between pages written as `[[Page]]`, a small front matter vocabulary at the top of each file, and two files the wiki serves about itself: a descriptor at `/.well-known/openwiki.json` and an index of its pages. Every page is readable as the Markdown it is stored as, every revision of every page is readable the same way, and every revision says who made it: a person, an AI, or both. A folder that follows this opens unchanged in Obsidian, Logseq, and every note tool that already speaks `[[Page]]`, and any of those folders becomes an OpenWiki by adding the two files. It is maintained by Profullstack, Inc. as part of the LogicSRC open-standards surface.
Status: **0.1**. A description of what the `[[Page]]` convention already is in practice, written down so a wiki can be moved, mirrored, read by a directory and edited by an agent without reading any engine's source.
Status: **0.1.1**. A description of what the `[[Page]]` convention already is in practice, written down so a wiki can be moved, mirrored, read by a directory and edited by an agent without reading any engine's source.
Slug: `openwiki`
@ -34,6 +34,9 @@ summary: What makes a thing spread, and what only looks like it.
author: https://chovy.com/.well-known/openprofile.md
made_by: both
disclosure: ai-assisted
ai_model: gpt-5.1
ai_provider: OpenAI
ai_prompt_url: https://goviral.wiki/ai-methodology#pages
created: 2026-09-13
updated: 2026-09-13T12:40:00Z
license: CC-BY-4.0
@ -51,7 +54,8 @@ Nothing else counts; see [[Vanity metrics#Reach]].
- **`summary`** is one line about the page, for a listing.
- **`author`** is who wrote the page as it stands: an [OpenProfile.md](/openprofile) URL, or a name. Per-revision authorship is in the history, below.
- **`made_by`** is `human`, `ai` or `both`, for the page as it stands. `human` means a person wrote it, with tools at most. `ai` means a model or agent wrote it, with a person at most pointing it. `both` means a mix the page does not care to split. It is a self-declaration and nothing verifies it.
- **`disclosure`** is optional and uses the W3C AI Content Disclosure vocabulary verbatim: `none`, `ai-assisted`, `ai-generated`, `autonomous`.
- **`disclosure`** is optional and uses the W3C AI Content Disclosure vocabulary verbatim: `none`, `ai-assisted`, `ai-generated`, `autonomous`, and at the page level `mixed`, for a page whose sections differ.
- **`ai_model`**, **`ai_provider`** and **`ai_prompt_url`** are the rest of that vocabulary, the `ai-model`, `ai-provider` and `ai-prompt-url` attributes under our naming: which model, whose, and a page describing how it is used. Optional, and meaningful only beside a `disclosure` other than `none`. A host rendering the page puts the same four on it, `<meta name="ai-disclosure">` and the attributes on the element that holds the body, so a browser and a crawler read what the file says.
- **`created`** and **`updated`** are dates or timestamps, ISO 8601.
- **`license`** is an SPDX identifier, for the page when it differs from the wiki's.
- **`lang`** is a BCP 47 tag.
@ -89,14 +93,15 @@ A page named `Going viral` lives at `<wiki url>/going-viral`. The slug is the na
"url": "https://goviral.wiki/going-viral",
"revisions": [
{ "id": "8f3a1c", "at": "2026-09-13T12:40:00Z", "author": "https://chovy.com/.well-known/openprofile.md",
"made_by": "both", "summary": "K-factor, not reach", "parent": "2b77e0", "bytes": 1840 },
"made_by": "both", "disclosure": "ai-assisted", "ai_model": "gpt-5.1", "ai_provider": "OpenAI",
"summary": "K-factor, not reach", "parent": "2b77e0", "bytes": 1840 },
{ "id": "2b77e0", "at": "2026-09-12T09:10:00Z", "author": "https://chovy.com/.well-known/openprofile.md",
"made_by": "human", "summary": "First draft", "parent": null, "bytes": 1120 }
]
}
```
A revision id is opaque. A host backed by git uses the commit; a host backed by a table uses its own. `parent` is the revision this one edited, so a fork of the history is visible as two revisions with one parent. `made_by` is the revision's, and may differ from the page's front matter, which describes the page as it stands.
A revision id is opaque. A host backed by git uses the commit; a host backed by a table uses its own. `parent` is the revision this one edited, so a fork of the history is visible as two revisions with one parent. `made_by` is the revision's, and may differ from the page's front matter, which describes the page as it stands. So are `disclosure`, `ai_model`, `ai_provider` and `ai_prompt_url`, when the revision says them.
## The wiki
@ -163,7 +168,7 @@ X-OpenWiki-Summary: Fixed the K-factor formula
X-OpenWiki-Made-By: ai
```
The body is the whole file, front matter included. `If-Match` is the revision the editor started from; a mismatch is `412` and the editor reads the current file and tries again, which is the only merge rule a wiki has ever had. The answer is `200` with the new revision id in `ETag`, or `201` when the page is new. `X-OpenWiki-Made-By` is the revision's `made_by`; absent is unstated, and a wiki whose `accepts` excludes the value answers `403`. A host that issues tokens with [OpenAccess](/openaccess) names the scope `openwiki:edit`. `DELETE` on a page is a revision that empties it; the history stays.
The body is the whole file, front matter included. `If-Match` is the revision the editor started from; a mismatch is `412` and the editor reads the current file and tries again, which is the only merge rule a wiki has ever had. The answer is `200` with the new revision id in `ETag`, or `201` when the page is new. `X-OpenWiki-Made-By` is the revision's `made_by`; absent is unstated, and a wiki whose `accepts` excludes the value answers `403`. The page's `disclosure`, `ai_model`, `ai_provider` and `ai_prompt_url` travel in the front matter as saved; a revision that differs from the page says so in `X-OpenWiki-Disclosure`, `X-OpenWiki-AI-Model`, `X-OpenWiki-AI-Provider` and `X-OpenWiki-AI-Prompt-URL`. A host that issues tokens with [OpenAccess](/openaccess) names the scope `openwiki:edit`. `DELETE` on a page is a revision that empties it; the history stays.
An agent editing a wiki is a program reading a Markdown file and putting it back. That is the whole API, and it is the same one a person's editor uses.
@ -217,6 +222,7 @@ A host is a folder, a way to render a Markdown file, two JSON files it can gener
| Version | Date | Change |
|---|---|---|
| 0.1 | 2026-09-13 | First publication: the page and its front matter, wikilinks and how they resolve, three representations at one URL, the history, the two files, editing as `PUT`, discovery, what a directory owes a wiki. |
| 0.1.1 | 2026-09-13 | `ai_model`, `ai_provider` and `ai_prompt_url` beside `disclosure` on pages and revisions, the rest of the W3C AI Content Disclosure vocabulary; `mixed` at the page level; a host renders the four as the group's meta tag and attributes. |
## License