Expand description
Markdown-native config: the same A–J model, written as a document.
A .md config is not YAML wearing a markdown hat. Headings are sections,
### headings are entries, bullets are fields, and any prose at column 0 is
documentation that the parser ignores. That means a loop config can explain
itself in place — the reason a goal exists sits next to the goal.
§Shape
# my-loop
- version: 0.1.0
- description: what this loop is for
Prose at the left margin is ignored. Put the reasoning here.
## C. Goals
### ship-it
- description: the thing is shipped and the suite is green
- priority: 1
## F. Stop gates
- max_iterations: 12
- max_cost_usd: 10.0§How it works
The parser does not know about Goal or StopGates. It turns the
document into a serde_yaml::Value and hands that to the same Deserialize
impls the YAML path uses. Every default, alias, and deny_unknown_fields
rule therefore applies identically, and a new config field needs no parser
change at all.
The renderer is the exact inverse, over serde_yaml::to_value. Round-trip
is a property test rather than a hope.