mirror of
https://github.com/Fission-AI/OpenSpec.git
synced 2026-10-14 05:19:53 +08:00
CommonMark lets an ATX heading end in a closing run of `#`s, so `### Requirement: Late Fees ###` renders as `Late Fees`. Requirement names kept the run, so a REMOVED written that way missed the requirement and archive exited 0 with a false "treating it as already removed" warning, while a closed MODIFIED or RENAMED heading failed as not found. normalizeRequirementName now strips the closing run with the rule scenario names already use: only a run preceded by a space or tab counts, so `C#` keeps its `#`. Every reader goes through it, and the main-spec duplicate check now does too, so a closed and an open heading of one requirement are reported as duplicates.