frontmatter spec + dorveille tags + dynamic AI disclosure in templates

- docs/frontmatter.md: canonical frontmatter reference for all content types
- dorveille.md: add tags, ai-disclosure fields
- single.html: AI meta tags now read from frontmatter instead of hardcoded
This commit is contained in:
Vigilio Desto 2026-04-10 18:28:03 +02:00
parent 5a8c39c3a0
commit 4f2b0a67e1
Signed by: vigilio
GPG key ID: 159D6AD58C8E55E9
3 changed files with 154 additions and 4 deletions

View file

@ -5,8 +5,10 @@ description: "The best automation is the kind you never notice. Like good typogr
eyebrow: "Essay"
author: "Wasily"
footer: "This essay was written by a human, edited with the assistance of an LLM, and published during the dorveille."
tags: ["essay", "automation", "ai"]
ai-model: "claude-sonnet-4-5"
ai-provider: "Anthropic"
ai-disclosure: "ai-assisted"
---
There is a particular quality to systems that work well. They recede. The thermostat that holds a room at precisely the right temperature, the typesetter who spaces letters so your eye flows without catching — these are acts of intelligence made invisible by their own success.[^1]

148
docs/frontmatter.md Normal file
View file

@ -0,0 +1,148 @@
# ASW Frontmatter Reference
Canonical reference for frontmatter in `~/projects/asw/content/`. Developer docs — not site content.
---
## Required (all content)
```yaml
title: "Page Title"
description: "One-line summary — drives <meta name=description> and OG tags."
date: 2026-02-01 # ISO 8601
tags: [essay, automation] # Hugo taxonomies, 24 per page
```
---
## Content-type fields
```yaml
type: post # docs | paper | post | vault — selects layout
weight: 10 # sort order within section (used in docs especially)
draft: true # omit from build until ready
author: "Wasily" # human author name (overrides site default)
```
---
## AI transparency layer
Three fields declare how AI was involved in producing the content.
```yaml
ai-disclosure: assisted # assisted | generated | human-only
ai-model: claude-sonnet-4-5
ai-provider: Anthropic
```
Maps to `<meta>` tags in the rendered `<head>`:
```html
<meta name="ai-content-disclosure" content="assisted">
<meta name="ai-model" content="claude-sonnet-4-5">
<meta name="ai-provider" content="Anthropic">
```
Values for `ai-disclosure`:
- `human-only` — no AI involvement
- `assisted` — human-written, AI-edited or AI-reviewed
- `generated` — AI-authored, human-directed
---
## Extended fields (essays / papers)
```yaml
eyebrow: "Essay" # label rendered above <h1> ("Essay", "Paper", "Reference")
abstract: "Longer summary for listing pages and paper headers."
footer: "Published in the dorveille. Written by a human, edited with LLM assistance."
canonical: "https://elsewhere.com/original" # if published elsewhere first
```
---
## Examples by content type
### `type: post` — essay or article
```yaml
---
title: "On the Craft of Invisible Systems"
description: "The best automation is the kind you never notice."
date: 2026-02-01
type: post
eyebrow: "Essay"
author: "Wasily"
tags: [automation, craft, agents]
ai-disclosure: assisted
ai-model: claude-sonnet-4-5
ai-provider: Anthropic
footer: "Written by a human, edited with LLM assistance."
---
```
### `type: docs` — reference documentation
```yaml
---
title: "Frontmatter Reference"
description: "All supported frontmatter fields for ASW content."
date: 2026-04-10
type: docs
weight: 20
tags: [reference, authoring]
ai-disclosure: generated
ai-model: claude-sonnet-4-5
ai-provider: Anthropic
---
```
### `type: paper` — long-form structured writing
```yaml
---
title: "The Agentic Semantic Web"
description: "An agent-first architecture for web publishing."
date: 2026-03-01
type: paper
eyebrow: "Paper"
abstract: "Extended summary for listing pages and the paper's own header section."
tags: [architecture, agents, semantic-web]
ai-disclosure: assisted
ai-model: claude-sonnet-4-5
ai-provider: Anthropic
canonical: "https://trentuna.com/papers/asw"
---
```
### `type: vault` — vault-sourced content (exported notes)
```yaml
---
title: "Dorveille"
description: "The liminal waking hour — a metaphor for autonomous agents."
date: 2026-01-15
type: vault
tags: [concept, agents, metaphor]
ai-disclosure: assisted
ai-model: claude-sonnet-4-5
ai-provider: Anthropic
---
```
---
## Relationship to vault frontmatter
The vault (`~/.napkin/`) and the public site share aligned concepts but use different field names:
| Concept | Vault field | Site field |
|---------|-------------|------------|
| Publication state | `status: draft/active` | `draft: true/false` |
| Related content | `related: ["[[Note]]"]` | Hugo's `related` config (automatic) |
| Discovery keywords | `keywords: [...]` | `tags: [...]` (Hugo taxonomy) |
| Content type | `type:` (free-form) | `type:` (maps to layout) |
| AI involvement | not tracked | `ai-disclosure`, `ai-model`, `ai-provider` |
The vault tracks operational state (`active`, `draft`, `archived`). The site tracks publication state (`draft: true/false`). A vault note exported to the site loses its `status`, `related` wikilinks, and `keywords` — these are replaced by Hugo-native equivalents during the port.

View file

@ -2,10 +2,10 @@
<meta name="description" content="{{ .Description | default .Summary }}">
<meta name="color-scheme" content="dark light">
<meta name="ai-disclosure" content="ai-generated">
<meta name="ai-model" content="{{ .Site.Params.aiModel | default "claude-sonnet-4-5" }}">
<meta name="ai-provider" content="{{ .Site.Params.aiProvider | default "Anthropic" }}">
<meta name="author" content="{{ .Site.Params.author | default .Site.Title }}">
<meta name="ai-disclosure" content="{{ index .Params "ai-disclosure" | default "ai-assisted" }}">
<meta name="ai-model" content="{{ index .Params "ai-model" | default .Site.Params.aiModel | default "claude-sonnet-4-5" }}">
<meta name="ai-provider" content="{{ index .Params "ai-provider" | default .Site.Params.aiProvider | default "Anthropic" }}">
<meta name="author" content="{{ .Params.author | default .Site.Params.author | default .Site.Title }}">
<meta property="og:title" content="{{ .Title }}">
<meta property="og:description" content="{{ .Description | default .Summary }}">