Noyalib docs and writing
Skill sebastienrousseau/agtmls/skills/noyalib-docs-and-writing
Maintain noyalib's docs of record and house writing style. Use when authoring or editing README, CHANGELOG, RELEASE-NOTES-vX.Y.Z.md, ADRs under doc/adr/, doc/POLICIES.md, doc/ARCHITECTURE.md, doc/USER-GUIDE.md, GLOSSARY.md, MIGRATION*.md, GETTING_STARTED.md, or crate-level and item-level rustdoc. Covers house rustdoc style (# Examples, # Errors, runnable doctests), commit-message archaeology (Assisted-by trailer, symptom/root-cause bodies), SPDX/REUSE headers per file type, ADR lifecycle (when required, template, post-implementation updates), release-notes template, and the version-refs release audit. Do NOT use for release mechanics (see noyalib-ci-and-release) or competitive positioning (see noyalib-external-positioning).From its SKILL.md
npx -y skills add sebastienrousseau/agtmls --skill noyalib-docs-and-writingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its file declares
Copied from the file, not written here
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
12.3 KB, as published. Nobody here has run it
noyalib-docs-and-writing
House style and process for noyalib's documentation of record.
Repo is v0.0.14 (2026-07-07) on the feat/v0.0.14 branch, on the
0.0.x runway toward v0.1.0. Skill date-stamp: 2026-07-08.
Reference material (the verbatim per-file-type SPDX header shapes, the full ADR process + skeleton, and the release-notes template): see
reference.mdin this directory. This file keeps the docs-of-record inventory, rustdoc / commit-message house style, the writing rules, and the pre-PR self-check.
Provenance checks
Run before authoring to confirm shape hasn't drifted:
head -20 CHANGELOG.md # Keep-a-Changelog shape
ls doc/adr/ # ADR inventory + numbering
ls RELEASE-NOTES-v*.md | tail -5 # release-notes cadence
head -3 crates/noyalib/src/de.rs # .rs SPDX header shape
head -2 RELEASE-NOTES-v0.0.14.md # .md SPDX header shape
head -2 .github/workflows/shared-no-std.yml # .yml SPDX header shape
git log -5 --format='%s%n%b%n---' # commit-body archaeology
grep -n 'missing_docs' crates/noyalib/src/lib.rs
Docs of record — inventory
Every claim in these files is load-bearing. Update in the same PR as the behaviour change, never as a follow-up.
README.md— public promises: install, quick start, capabilities, ecosystem, comparison, benchmarks, features, when-not-to-use. Every claim must stay true.CHANGELOG.md— Keep a Changelog 1.1.0.[Unreleased]rolling section on top, then descending version sections. Each version records lockstep-satellite bumps and links (noyalib-wasm,noyalib-mcp,noyalib-lsp,noya-cli).RELEASE-NOTES-vX.Y.Z.md— per-release narrative, one file per release, SPDX headers inline. Template extracted below fromv0.0.14andv0.0.13.doc/POLICIES.md— engineering law: zero-unsafe, MSRV,#![forbid(unsafe_code)], security posture, DoS-budget defaults. Cite before writing any PR risking an invariant.doc/ARCHITECTURE.md— system shape: parser → loader(s) → serde / Value / CST, streaming fast-path eligibility, module map.doc/USER-GUIDE.md— task-oriented, with feature-gated Cargo.toml snippets (recovery, tokio, sval, …). Version-locked snippets appear here.GLOSSARY.md— precise vocabulary (CST, span, alias, merge key, chomping, DoS budget). Link liberally from other docs.MIGRATION.md(root) — cross-release migration for downstream vendors and pinning consumers.doc/MIGRATION-FROM-*.md— per-competitor playbooks (serde-yaml, serde-yaml-ng, serde-yaml-bw, serde-norway, serde-saphyr, serde-yml, yaml-serde, yaml-spanned).doc/adr/NNNN-*.md— Architecture Decision Records. Immutable once accepted. See ADR process below.GETTING_STARTED.md— 5-minute walkthrough; version-refs live here and must be audited on release.- Reference material —
doc/COMPARISON.md,doc/BENCHMARKS.md,doc/PGO.md,doc/TESTING.md,doc/CII-BEST-PRACTICES.md,doc/pre-commit.md. Date-stamp anything volatile. - Community posture —
CONTRIBUTING.md,SECURITY.md,SUPPORT.md,GOVERNANCE.md,CODE_OF_CONDUCT.md. Rare touch.
Rustdoc house style
Lint is #![warn(missing_docs)] at crates/noyalib/src/lib.rs:343.
Every public item is documented. The ~480 doctests under
cargo test -p noyalib are load-bearing — treat regressions as
test failures.
Rules (extracted from crates/noyalib/src/de.rs,
crates/noyalib/src/ser.rs, crates/noyalib/src/lib.rs):
- Lead one-line summary. Verb-first, no hedging.
- Long-form paragraph explains why / how it routes. Fast-path eligibility, defaults, coupling to nearby types.
# Exampleswith runnable doctests. Prefer runnable overignore/no_run.no_runis acceptable only for I/O, panics, or long-running examples.# Errorson every fallible fn. EnumerateError::Variant — causebullets. Cross-link theParserConfigfield for DoS budgets.- Error-demonstrating doctests parse a reproducer rather than
merely constructing the variant. A
KeyCollisiondoctest includes the two-key YAML that triggers it. - Module-level
//!docs explain WHY, not just what. Seecrates/noyalib/src/lib.rsfor the tone: "Two APIs, one parser", "Pure Rust — native YAML 1.2 scanner and parser." - Comments carry incident context. When a subtle fix lands,
capture the trap next to the code, not just in the commit body.
Canonical in-tree examples:
.github/workflows/shared-no-std.ymllines 12-14 — scopedCARGO_TARGET_DIRprose explains why the defaulttarget/under Swatinem cache poisons the no_std fingerprint.crates/noyalib/src/streaming.rsraw_str_modefield (around line 78 / 142) — why the flag exists on the streaming path.
Formatting: backticks around every identifier, path, feature, or
CLI flag. Intra-doc links via [Foo](crate::Foo). Wrap ~72
columns. No emoji.
Commit-message house style
Commit archaeology is unusually load-bearing here. Each body is a decision record in miniature.
Structure:
<type>(<scope>): <imperative subject, ≤72 chars>
<paragraph 1 — symptom the user or CI observed>
<paragraph 2 — root cause, cited with file paths / line numbers>
<paragraph 3 — the fix, and why this shape over alternatives>
<optional: verification commands and their observed output>
Assisted-by: Claude:<model-id> (or: Claude <[email protected]>)
Real subjects from git log -5:
fix(cst): resolve alias references through to the anchor value spanfeat(no_std): core::error::Error + wasm32 CI bare-metal prooffix(bench): merge_heavy variant needs lifted max_alias_expansionsdocs(release): bump straggler 0.0.14 version refs across docs
Rules:
- Conventional Commits.
feat,fix,perf,refactor,docs,test,ci,chore. Scope is the touched surface (cst,no_std,ci,release,bench). - Body is archaeology. Symptom → root cause → rationale → verification. A memo to the contributor who will hit the same class of bug in 2027.
- Cite specifics. Files, line numbers, error messages,
observed numbers.
git blameshould land on prose that explains itself. - Verification commands + observed output when the change is
behavioural. Copy
cargo test/cargo benchlines verbatim. Assisted-by:trailer when a model contributed. Both in-tree forms are acceptable.- Signed commits.
git commit -S. - Never
--amendafter a hook failure. Fix and add a NEW commit.
SPDX / REUSE discipline
REUSE 3.3 — every file is licensed inline or via REUSE.toml blanket
annotations, and CI has a REUSE gate. The per-file-type header shapes
(.rs, .yml/.yaml, release-notes .md, top-level .md blanket,
config/fixture wildcards) are in reference.md §R1 — use them
verbatim. Copyright year is the current release year; don't rewrite
history on rollover, only new files get the new year.
ADR process
ADRs live under doc/adr/ in Nygard's shape (Context / Decision /
Consequences / Alternatives / References), numbered next-integer
zero-padded to 4 (currently through 0005), immutable once accepted
except for post-implementation pilot-results appends. Add one for a
change to the data model, public API, dependency floor, a core
invariant, or parser/loader output — or any decision a future
contributor might propose the opposite of; skip it for
type-encoded/idiomatic/routine choices (commit body suffices). The full
when-to / when-not-to, status lifecycle, and the verified skeleton are
in reference.md §R2. Update doc/adr/README.md's index after adding
one.
Release-notes template
One file per release, SPDX headers inline, modelled on v0.0.14 /
v0.0.13: headline + "Why this release exists" + "What changed" +
"What did not change" (fights oversell) + "Follow-ups for vX.Y.(Z+1)",
plus a per-satellite channel section when one ships in the same cut.
Full template in reference.md §R3.
Writing rules
-
No oversell. Unproven claims stay labelled
candidateoropen question, or are omitted.#![forbid(unsafe_code)]IS proven — cite freely. "Fastest YAML library" is NOT proven without a matching bench. -
No perf number without a bench in the same PR. Numbers in README must be reproducible from
cargo benchon a stated target. Seebenches/parallel.rsfor the "~1.5× locally on aarch64" pattern. -
Version-refs audit on release. Before saying "release PR is mergeable", grep for stale versions:
git grep -n 'noyalib.*=.*"0\.0\.' -- \ README.md MIGRATION.md GETTING_STARTED.md \ 'doc/**/*.md' 'crates/**/README.md' \ RELEASE-NOTES-*.md CHANGELOG.md git grep -n '0\.0\.[0-9]\+' -- benches examples fuzzRecurring failure mode. Commit
7afa2d31(docs(release): bump straggler 0.0.14 version refs) surfaced stale0.0.8/0.0.11/0.0.13references AFTER the release PR was thought mergeable. Do it before, not after. -
Date-stamp volatile claims. Benchmarks, dep counts, coverage percentages, published-crate lists, satellite status. Use "as of vX.Y.Z (YYYY-MM-DD)" or rotate the number into a per-release doc.
-
Prose voice matches crate-level rustdoc: direct, verb-first, no filler. "noyalib parses YAML 1.2." — not "noyalib is a library that provides parsing for the YAML 1.2 format".
-
Cross-link, don't restate. README links to
doc/POLICIES.mdor the relevant ADR for invariants. One source of truth per fact. -
Never introduce facts a reader can't verify. Every claim points to a test, bench, config field, doc, ADR, or commit.
-
No emoji.
When NOT to use this skill
- Release mechanics (tag cutting,
cargo publish, satellite version cross-check, release workflow debugging) — usenoyalib-ci-and-release. - External positioning (competitor comparisons vs
serde-yaml/serde-saphyr/libyaml, marketing copy) — use
noyalib-external-positioning. - Architecture decisions with API implications coordinate with the code changes themselves; this skill only covers the ADR-writing shape.
Self-check before opening a docs PR
- Every new claim has a citation (test, bench, config, ADR, or code path).
- Version refs match the release target across README, MIGRATION, GETTING_STARTED, per-crate READMEs, and doc/*.md.
- SPDX header present or REUSE.toml covers the file.
- CHANGELOG
[Unreleased](or a new version section) captures the user-visible change. - New public items have one-line summary +
# Examples+# Errors(if fallible). - New doctests are runnable unless there's a specific reason.
- Commit body has symptom → root cause → rationale, with
Assisted-bytrailer where applicable. - Structural / hard-to-reverse change carries a new ADR or a post-implementation update to an existing one.
- No emoji introduced.