Development record
auditIsMet was narrowed to read the Audit Notes section fence-aware and to refuse a negative count, but it still walks EVERY section whose title is Audit Notes and accumulates the met and not-met counts across all of them, with no first-wins rule and no refusal of a duplicate title. An intent record carrying an honest concerns-only rollup plus a second section with the same title, at any heading level, holding a rollup that reads MET 1 therefore ends with met above zero and not-met still zero, and is lifted onto the homepage feature block: exactly the outcome the fence-awareness was added to prevent, reached by duplication instead of by fencing. Verified by reading the accumulation loop, where the title comparison is an equality test inside a loop over all sections and nothing breaks after the first match. It matters because the record body is the input the site trusts for the one testimonial the homepage carries, and a forged section is no harder to write than a forged fenced line was. Fix direction: read the FIRST Audit Notes section only and treat a second one as malformed, the same way a negative count is already treated as malformed. Detector: an intent whose honest Audit Notes rollup is concerns-only, plus a second section titled Audit Notes carrying a passing rollup, must not be featured, while the same intent with one honest passing rollup still is. Residual of iss-2609081941073604.
auditIsMet was narrowed to read the Audit Notes section fence-aware and to refuse a negative count, but it still walks EVERY section whose title is Audit Notes and accumulates the met and not-met counts across all of them, with no first-wins rule and no refusal of a duplicate title. An intent record carrying an honest concerns-only rollup plus a second section with the same title, at any heading level, holding a rollup that reads MET 1 therefore ends with met above zero and not-met still zero, and is lifted onto the homepage feature block: exactly the outcome the fence-awareness was added to prevent, reached by duplication instead of by fencing. Verified by reading the accumulation loop, where the title comparison is an equality test inside a loop over all sections and nothing breaks after the first match. It matters because the record body is the input the site trusts for the one testimonial the homepage carries, and a forged section is no harder to write than a forged fenced line was. Fix direction: read the FIRST Audit Notes section only and treat a second one as malformed, the same way a negative count is already treated as malformed. Detector: an intent whose honest Audit Notes rollup is concerns-only, plus a second section titled Audit Notes carrying a passing rollup, must not be featured, while the same intent with one honest passing rollup still is. Residual of iss-2609081941073604.
Grounds
- pursued: an intent has one audit, so first-wins plus a duplicate refusal removes the forged-section route onto the homepage without narrowing the honest reading; it would be shown wrong by a real record that legitimately carries two sections of that title, which the committed tree does not and which would surface as a featured intent disappearing rather than as a false feature
Frontmatter
| id | iss-2609090951277880 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2609090951277880-auditismet-sums-every-section-titled.md
open on GitHub ↗ · commit history ↗
mentions2
- iss-2609081941073604auditIsMet says in its comment that it reads the Audit Notes rollup, but the body greps every raw line of the intent file for the substring Acceptance rollup:, fenced blocks and frontmatter included, and parses the count with fmt.Sscanf %d, which accepts negatives. A fenced NOT_MET -1 can therefore cancel a real NOT_MET 1 whenever MET is already above zero, featuring an intent whose acceptance is not met. A lone negative does not feature (notMet == -1), newestMetIntent still requires the shipped/ bucket and a written press release, and site check does not re-grade the rollup. strings.Cut is a substring match, not a section walker; the same package already skips fences when splitting headings (Sections). Fix: scan only the Audit Notes section, fence-aware, reusing Sections, and refuse n < 0. Refusing negatives alone is not enough: a fenced Acceptance rollup: MET 1 with no NOT_MET part can still flip a concerns-only rollup that already has notMet == 0. Detector: an intent whose real rollup is NOT_MET 1 plus a fenced Acceptance rollup: NOT_MET -1 must not be featured, while the same intent carrying only the honest NOT_MET 0 / MET 1 rollup in Audit Notes still is, given the other newestMetIntent conditions. Independent of the releaseOf substring match. Reported as GitHub issue 625 against ec7f40d6.
- iss-2609250955051598internal/core/site keeps a private fence toggle (sections.go isFenceLine, used by Sections, Blocks, and compose.go auditIsMet and releaseOf) that diverges from mdrecord.Mask, the tree's CommonMark reading, and returns wrong sections. isFenceLine matches any line whose trimmed text starts with three backticks and flips a boolean. So it never sees a tilde fence, closes a four-backtick fence on a three-backtick line, closes on a line that carries an info string, and cannot see an HTML comment. Probe at 70daf701 via Sections: a # line inside a ~~~ block becomes a section, and so does a # line inside a three-backtick block quoted in a four-backtick fence (both give sections Doc, a shell comment, Real). A heading parked in <!-- --> becomes the section Parked. An unclosed ~~~ fence is not refused, even though Sections refuses an unclosed backtick fence as its quietest failure. The same walk decides auditIsMet (a ~~~-fenced Acceptance rollup: MET 1 counts as a verdict, the failure iss-2609090951277880 closed for backtick fences) and releaseOf (a ~~~-fenced credit stamps a version). The fix is not a drop-in swap for mdrecord.Mask, because the site deliberately reads fences indented under list items and mdrecord recognises only the 0-3 space indent, so the indent rule needs a decision first.