GSDFC Docstring Guide
This page is the practical companion to the authoritative GSDFC specification
in the docforge/__init__.py package docstring. It describes how to write
docstrings that render correctly in MkDocs and stay machine-parseable by
doc-forge, MkDocs, and MCP clients.
Overview
- Docstrings are the single source of truth.
doc-forgecompiles docstrings but never rewrites them.- Every public symbol should have a complete, accurate docstring.
- Type hints live in signatures; prose entries repeat the type in parentheses and must match the signature.
Module docstrings
Modules use Markdown headings and --- separators.
Recommended sections:
# Summary— what the subsystem does# Examples— a representative usage snippet# Notes— guarantees, lifecycle, and thread-safety notes
Class docstrings
Recommended sections, in order:
- summary line describing responsibility
Attributes:— instance attributes withname (Type):entriesNotes:— grouped subsections such as Guarantees, LifecycleExample:— indentedpythoncode block
Function and method docstrings
Recommended section order:
Args:Returns:Raises:Yields:Notes:Example:
Formatting rules:
Args:entries arename (Type):followed by an indented description.Returns:entries areType:followed by an indented description.Raises:entries areExceptionType:followed by an indented condition.Yields:replacesReturns:for generators.- Summaries are written in the imperative mood.
- Fenced
pythonblocks are allowed insideExample:sections, indented four spaces.
Property docstrings
Properties document their return values with a Returns: section and, when
meaningful, an Example:.
Example
Keeping stubs in sync
Every .py module ships a matching .pyi stub. When a signature or a public
symbol changes, update both files. Signature annotations in the stub must
match the implementation.
Enforcement
pydoclint (Google style) runs in CI and verifies that Args:/Returns:
sections match function signatures, including types.
allow-init-docstring = true—__init__docstrings are allowed.skip-checking-raises = true—Raises:sections are descriptive and are not required to map to literalraisestatements.check-class-attributes = false—Attributes:sections document instance attributes without class-level annotations.