Found while implementing #449 (PR #472, merged as 551ddb9). Out of scope there, filed so it is not rediscovered.
What
check_measurability_adjectives — the FR-side rule that shipped long ago — scans the Functional Requirements section for subjective adjectives (scalable, robust, efficient, responsive, fast) and does not strip HTML comments, fenced code, or tables first.
Its sibling check_nfr_measurability, added in #472, does strip. The two now disagree about what counts as prose.
Why it has never fired
Measured across the 69 PRDs in this repository: 2 adjective hits in FR, 15 in NFR.
All 15 sit inside the PRD template's own guidance —
<!-- BAD: "System should be fast and responsive" -->
— and that guidance happens to live under the NFR heading, not the FR heading. That is the only reason the FR rule stays quiet. Move the BAD examples up, or write a PRD that quotes one in its FR section, and the rule starts flagging text whose only fix is deleting the instructions.
Why it was not fixed in #472
Scope. #472 was about the SPEC validator inversion and the missing NFR rules; touching a long-shipped rule with no observed failures would have widened the diff without evidence that it matters. This issue carries the evidence for whoever picks it up.
Fix
Apply strip_non_prose_for_leakage in check_measurability_adjectives before scanning, mirroring check_nfr_measurability. Expected corpus impact: the 2 FR hits should be re-measured to confirm neither is inside non-prose; if both are real, the rule's behaviour is unchanged and the fix is purely defensive.
Verification it is really fixed
Move the template's BAD-example comment block under ## Functional Requirements in a scratch workspace and confirm the rule stays silent. Without that step the fix is unverified — the rule not firing is its normal state.
crates/forgeplan-core/src/validation/checks.rs
Refs: #449, #472, EVID-171
Found while implementing #449 (PR #472, merged as 551ddb9). Out of scope there, filed so it is not rediscovered.
What
check_measurability_adjectives— the FR-side rule that shipped long ago — scans the Functional Requirements section for subjective adjectives (scalable,robust,efficient,responsive,fast) and does not strip HTML comments, fenced code, or tables first.Its sibling
check_nfr_measurability, added in #472, does strip. The two now disagree about what counts as prose.Why it has never fired
Measured across the 69 PRDs in this repository: 2 adjective hits in FR, 15 in NFR.
All 15 sit inside the PRD template's own guidance —
— and that guidance happens to live under the NFR heading, not the FR heading. That is the only reason the FR rule stays quiet. Move the BAD examples up, or write a PRD that quotes one in its FR section, and the rule starts flagging text whose only fix is deleting the instructions.
Why it was not fixed in #472
Scope. #472 was about the SPEC validator inversion and the missing NFR rules; touching a long-shipped rule with no observed failures would have widened the diff without evidence that it matters. This issue carries the evidence for whoever picks it up.
Fix
Apply
strip_non_prose_for_leakageincheck_measurability_adjectivesbefore scanning, mirroringcheck_nfr_measurability. Expected corpus impact: the 2 FR hits should be re-measured to confirm neither is inside non-prose; if both are real, the rule's behaviour is unchanged and the fix is purely defensive.Verification it is really fixed
Move the template's BAD-example comment block under
## Functional Requirementsin a scratch workspace and confirm the rule stays silent. Without that step the fix is unverified — the rule not firing is its normal state.crates/forgeplan-core/src/validation/checks.rsRefs: #449, #472, EVID-171