packages/documents.js is gated at a mutation break threshold of 66, derived from a measured 68.77%: 13795 killed, 242 timeout, 4875 survived and 1500 no-coverage out of 20412 valid mutants. Every other codec in the workspace sits at 100, so this is the package keeping the repo off a uniform gate.
That leaves 6375 unkilled mutants over 135 source files, very unevenly spread. The worst twenty account for roughly 2937 of them, a little under half:
| file |
survived |
no coverage |
total |
src/layout/reconstruct.ts |
290 |
41 |
331 |
src/svg/read.ts |
236 |
43 |
279 |
src/mathml/layout.ts |
229 |
49 |
278 |
src/hsqldb/script.ts |
127 |
88 |
215 |
src/latex/lower.ts |
167 |
34 |
201 |
src/edit/pptx/scaffold.ts |
191 |
2 |
193 |
src/test-support/ods.ts |
188 |
0 |
188 |
src/ooxml/docx/embedded-objects.ts |
92 |
40 |
132 |
src/odf/odt/read.ts |
95 |
15 |
110 |
src/svg/path.ts |
95 |
15 |
110 |
src/layout/text-layout.ts |
65 |
38 |
103 |
src/edit/docx/paragraph.ts |
37 |
62 |
99 |
src/edit/pptx/shape.ts |
52 |
44 |
96 |
src/layout/lattice.ts |
87 |
8 |
95 |
src/odb/sql/evaluate.ts |
61 |
30 |
91 |
src/hsqldb/binary-script.ts |
60 |
26 |
86 |
src/edit/pptx/slide.ts |
83 |
2 |
85 |
src/edit/odt/table.ts |
40 |
43 |
83 |
src/latex/symbols.ts |
82 |
1 |
83 |
src/layout/sheets.ts |
75 |
4 |
79 |
Working down that list is the cheapest way to move the number, and each file can raise the threshold on its own once its own gaps close, so this does not have to land as one change.
The method that works here, established by the coverage already in the package, is to restructure the production code so the mutant cannot exist rather than to suppress it. A mutant that survives because two branches are genuinely equivalent gets killed by removing the equivalence, for example replacing an equivalent kind check with a property-presence guard, or resolving an entry by relationship target instead of by a positional index that a mutated offset cannot change the meaning of. What is not acceptable, and has not been used anywhere in this package, is a // Stryker disable comment, a weakened assertion, or a deleted one.
Two practical notes for whoever picks this up. The no-coverage column is worth reading separately from survived: a file like src/edit/docx/paragraph.ts is mostly missing tests outright (62 of its 99) while src/test-support/ods.ts is fully covered and simply not asserted hard enough (188 survived, 0 no-coverage), and those need different work. And CI will not measure this for you: the shard times out (#1298) and PR runs get cancelled before they start (#1294), so expect to measure locally at capped concurrency and treat CI as confirmation if it ever lands.
packages/documents.jsis gated at a mutation break threshold of 66, derived from a measured 68.77%: 13795 killed, 242 timeout, 4875 survived and 1500 no-coverage out of 20412 valid mutants. Every other codec in the workspace sits at 100, so this is the package keeping the repo off a uniform gate.That leaves 6375 unkilled mutants over 135 source files, very unevenly spread. The worst twenty account for roughly 2937 of them, a little under half:
src/layout/reconstruct.tssrc/svg/read.tssrc/mathml/layout.tssrc/hsqldb/script.tssrc/latex/lower.tssrc/edit/pptx/scaffold.tssrc/test-support/ods.tssrc/ooxml/docx/embedded-objects.tssrc/odf/odt/read.tssrc/svg/path.tssrc/layout/text-layout.tssrc/edit/docx/paragraph.tssrc/edit/pptx/shape.tssrc/layout/lattice.tssrc/odb/sql/evaluate.tssrc/hsqldb/binary-script.tssrc/edit/pptx/slide.tssrc/edit/odt/table.tssrc/latex/symbols.tssrc/layout/sheets.tsWorking down that list is the cheapest way to move the number, and each file can raise the threshold on its own once its own gaps close, so this does not have to land as one change.
The method that works here, established by the coverage already in the package, is to restructure the production code so the mutant cannot exist rather than to suppress it. A mutant that survives because two branches are genuinely equivalent gets killed by removing the equivalence, for example replacing an equivalent kind check with a property-presence guard, or resolving an entry by relationship target instead of by a positional index that a mutated offset cannot change the meaning of. What is not acceptable, and has not been used anywhere in this package, is a
// Stryker disablecomment, a weakened assertion, or a deleted one.Two practical notes for whoever picks this up. The no-coverage column is worth reading separately from survived: a file like
src/edit/docx/paragraph.tsis mostly missing tests outright (62 of its 99) whilesrc/test-support/ods.tsis fully covered and simply not asserted hard enough (188 survived, 0 no-coverage), and those need different work. And CI will not measure this for you: the shard times out (#1298) and PR runs get cancelled before they start (#1294), so expect to measure locally at capped concurrency and treat CI as confirmation if it ever lands.