docs(benchmarks): record the pass-29 dead end and the #8 weak-parent decision

The byte-path close-quote consume candidate measured NEUTRAL in an
interleaved A/B despite the sampler attributing ~4% of parse to the
advance() chain it replaced: decoding one ASCII scalar into a
small-string-backed Character costs about the same as consume's
literal-matching path. Recorded under Known structure of the gap so no
future round redoes it, with the meta-lesson that sample attribution
overstates single-character round trips and only the interleaved A/B
verdict counts.

Also records the #8 decision: the TreeNode weak-parent side-table cost
(~9% of parse) is accepted for now. unowned is rejected outright since a
trap after release contradicts the never-crash posture and the documented
nil-after-release behavior; the arena/index-based tree remains the
designed future path, sequenced after the scanning-architecture work,
which carries ~47% of parse to this finding's ~9%.
This commit is contained in:
Mihaela Mihaljevic 2026-07-12 14:09:37 +02:00
parent 2b6da0d0a0
commit 36f1485f2e

View File

@ -117,6 +117,23 @@ patched.
trap, a public behavior change; `unowned(unsafe)` is a dangling pointer.
Recovering this ~9% requires a design decision (an arena/index-based tree,
or an API-versioned semantics change), not an optimization pass.
**Decided (#8, closed): accept for now.** Switching `parent` to `unowned`
is rejected outright (a trap after release contradicts the never-crash
posture and breaks documented nil-after-release consumers); an
arena/index-based tree is the designed future path but is sequenced AFTER
the scanning-architecture work, because scanning carries ~47% of parse to
this finding's ~9% and the arena is a large, correctness-sensitive change
that should not be taken for the smaller lever first. Reopen #8 when the
scanning lever has landed and the remaining gap justifies it.
- **Dead end, do not redo (measured after pass 28):** replacing
`consumeAttributeValueCloseQuote`'s `advance()` with the byte-path
`consume(_:)` (so the already-byte-confirmed closing quote is consumed
without being decoded into a buffered `Character`) measured NEUTRAL in an
interleaved A/B despite the sampler attributing ~4% of parse to that
`advance()` chain: decoding one ASCII scalar into a small-string-backed
`Character` and dropping it costs about the same as `consume`'s
literal-matching path. Sample attribution at this granularity overstates
single-character round trips; trust only the interleaved A/B.
## Rules