Authorship credits

Docs Writing

Authorship credits

The [!authors] directive — crediting a model as a co-author, and the human-authorship pledge it replaces.

Every post carries one of two lines at its foot. By default it is the pledge:

本文由真人撰写,未使用 AI 创作

A post that used a model says so instead, naming which one and what it did. That is what [!authors] is for.

[!authors ai=anthropic/claude-opus-4-6]
[!authors ai=anthropic/claude-opus-4-6 note="重写了迁移那一节的表格"]
Attribute Required Value
ai yes provider/model from the model registry
note no One clause saying what the model did. Max 160 characters.

The directive is meta: the marker is removed from wherever you wrote it and never renders in place. Put it anywhere; the credit lands in the footer.

Model references

ai is a provider/model pair. The provider is part of the reference, not a guess — claude-opus-4-6 exists under anthropic, google-vertex-anthropic, and several resellers, and the credit should say which one actually ran.

Valid references come from src/data/generated/model-registry.json, a snapshot of models.dev written by bun run sync:models. Nothing in it is hand-maintained. If a credit names a model newer than the snapshot, re-run the sync.

An unknown model stops the build. This is the only directive error that is not a warning. Everything else degrades to a skipped marker and a log line; a typo’d model reference would silently drop an authorship claim off a published post, which is worse than a red build.

The note decides how a credit reads.

With a note, the model gets its own sentence with the model as the subject — your clause completes it. Write the predicate, not a full sentence: note="重写了 迁移那一节的表格", not note="Claude 重写了…".

Without a note, the credit joins a single generic line — 本文在 A 和 B 的协 助下完成。 — so “Written with” never repeats down the footer.

Terminal punctuation is added for you, taking its cue from the note’s own last character rather than the blog’s locale: an English note under a Chinese blog gets a full stop, not .

Several credits

Repeat the directive. Order in the footer follows the order the directives appear in the post.

[!authors ai=anthropic/claude-opus-4-6 note="drafted the pipeline diagram"]
[!authors ai=openai/gpt-5 note="checked the numbers"]

The same model credited twice collapses into one entry — a model is never named twice in a footer — and its notes join with a comma in the order written.

Why there are no roles

An earlier design had a closed vocabulary of twenty-two roles, each flagged for whether it was compatible with the human-authorship pledge. It bought a validator that could check the spelling of a claim but never its truth, and twenty-two verbs that still could not describe what a model did on a given post.

note replaces all of it. The author writes the sentence, and is accountable for it.

Derived text

Because a meta marker produces no HTML, it would otherwise survive into anything built from the raw source — the excerpt, the plaintext, the Markdown output, the Open Graph description. Standalone [!authors] markers are stripped from all of those separately, with code fences respected so a post about the syntax keeps its examples.

Notes

  • Implementation: src/features/posts/server/directives/authors.ts, src/data/authorship.ts, src/features/posts/ui/AiCredit.astro.
  • The pledge component is src/features/posts/ui/NotByAI.astro. It is the default; there is no tag or flag to opt into it.