Skip to content

ci: mutation_survivors.json's free-text citations are unaudited, and at least 10 of 31 are stale #613

Description

@Yaraslaut

Found while fixing #608, which refreshed and gated the structured entries in
scripts/mutation_survivors.json. This is the other half of that file, which
the new gate structurally cannot see. Filed rather than folded in: it needs a
different mechanism, not a bigger version of the one #608 asked for.

Summary

Besides its 7 structured {file, line, mutator, source, reason} entries,
scripts/mutation_survivors.json cites source locations as prose — inside
representative_sites lists, site fields, and the runs / classification
narrative. scripts/check_mutation_survivors.py (added by the #608 fix) counts
31 such citations and audits none of them, because they carry no
verbatim source text to resolve against: the text after the -- is a
paraphrase ("backend.hpp:613 -- emitMetric(Metric::registerCount, 1.0)"), and
several use a bare filename with no directory ("bridge.hpp:1683",
"payload_schema.hpp:169").

At least 10 of the 31 are stale today.

Verification status

Reproduced by measurement, on this lane's branch off master @ a020e69c
(the citations and the headers are both unmodified by that branch, except the
five structured line hints #608 refreshed). Method: print the current text of
each cited line and compare it against what the citation claims is there. Not
an exhaustive pass — I measured the 18 citations that name a resolvable path,
not all 31.

Real output (<file> <line> -> current text at that line):

remote.hpp:718 -- false_positive_finding.results[0].site }
remote.hpp:818 -- same entry                   return;
forms.hpp:1981 -- results[1].site              /// how many decimals the derivation itself produced (a product of two 2-decimal
registry.hpp:709 -- results[2].site            
remote.hpp:1031 -- samples[].site              // re-test under the insert lock further below.
bridge.hpp:1683 -- samples[].site              // entry to fire later and find nothing (setValue/
forms.hpp:1794 -- samples[].site               
bridge.hpp:584 -- samples[].site               auto primaryCopy = primary;
forms.hpp:2356 -- classification narrative     annotateNestedAggregateRef<Member, Ancestors...>(dom, property);
wire.hpp:514 -- classification narrative       // why, and for how a test covers this arm anyway.
instance_constraints.hpp:156                   if (places > math::kMaxDecimalPlaces) {
payload_schema.hpp:218                         hash ^= static_cast<std::uint64_t>(static_cast<unsigned char>(byte));
remote.hpp:142                                 auto hi = static_cast<uint32_t>(counter >> 32);
remote.hpp:145                                 lo = hi ^ mix(lo, roundKey);
remote.hpp:148                                 return (static_cast<uint64_t>(hi) << 32) | static_cast<uint64_t>(lo);
backend.hpp:613 -- representative_sites        ///
backend.hpp:807 -- representative_sites        /// "Where does the blocking happen" is the only question this class exists to
remote.hpp:1038 -- representative_sites        // sharing is worth the most. `acquireSharedInstance` re-tests the

Read against what each citation claims:

Stale (10):

  • classes.side_channel_metrics.representative_sites:
    "include/morph/core/backend.hpp:613 -- emitMetric(Metric::registerCount, 1.0)"
    and ":807 -- emitMetric(Metric::executeInFlight, ...)". Line 613 is ///
    and 807 is a doc comment. The substring emitMetric(Metric::registerCount
    does not occur anywhere in the file — every call site is written fully
    qualified now:
    1121:        ::morph::observe::detail::emitMetric(::morph::observe::Metric::registerCount, 1.0);
    1140:        ::morph::observe::detail::emitMetric(::morph::observe::Metric::registerCount, 1.0);
    1285:        ::morph::observe::detail::emitMetric(::morph::observe::Metric::executeInFlight,
    
    So this pair is stale in two ways at once: wrong line, and quoting a spelling
    the code no longer uses.
  • classes.side_channel_logging.representative_sites: remote.hpp:1031 -- logError on an undecodable envelope and :1038. Both now land on comments;
    the only logError in the file is at line 975.
  • false_positive_finding.results[*].site: remote.hpp:718 and :818 (now }
    and return;), forms.hpp:1981 (a doc comment), registry.hpp:709 (blank).
  • classification_2026_09_09.survivor_list_unreliable.samples[*].site:
    remote.hpp:1031, bridge.hpp:1683, forms.hpp:1794 (blank),
    bridge.hpp:584.
  • The classification narrative's wire.hpp:514 (the kMaxEnvelopeBytes cap):
    now a comment; kMaxEnvelopeBytes occurs at 29, 522, 525, 537, 540, 542.
    Its forms.hpp:2356 ("the offender-list separator") is now
    annotateNestedAggregateRef<Member, Ancestors...>(dom, property);.

Still correct (6): remote.hpp:142, :145, :148 (the Feistel round),
registry.hpp:54, payload_schema.hpp:218, instance_constraints.hpp:156.

Unresolvable as written (1): the narrative's payload_schema.hpp:169 names
no directory, and there is no include/morph/forms/payload_schema.hpp — the
file is include/morph/core/payload_schema.hpp. A reader has to guess before
they can even check it.

Also worth recording, because it is the same rot in the other direction: the
prose at classification_2026_09_09 cited core/bridge.hpp:121 for the
HandlerKey hash-combine — which was correct — while the structured entry for
the same site said 119, which was wrong. #608's refresh has now made them agree
at 121.

What I did not verify: whether any of the stale citations' dispositions
are wrong. I only checked coordinates. I also did not attempt to find the
current line for every stale one — for several (the samples[].site rows) the
mutant description is too paraphrased to search for reliably, which is itself
part of this issue.

Why it matters, and why it is minor

Same cost as #608's, one step further out: no gate reads these, so nothing in
CI is wrong. The cost lands on a human who follows one during a future triage
pass and reads unrelated code — and, unlike the structured entries, they cannot
be mechanically re-resolved, so that human has to re-derive the site from
scratch.

It also narrows a claim that now looks broader than it is.
scripts/check_mutation_survivors.py prints note: 31 further citation(s) in this file are free text ... NOT audited here on every run precisely so this
gap is visible, but a green drift-guard tick still reads as "this file's
citations are fine" to anyone who does not read that line.

Options, none of them obviously right

  1. Give the prose citations the structured shape — a source field with
    the verbatim line — so check_mutation_survivors.py audits them with no new
    mechanism. Most durable; also the most editing, and some of these are
    genuinely narrative sentences rather than records.
  2. Delete the line numbers from the prose and keep the file/symbol name
    only. A citation that cannot rot is better than one that does, and for a
    historical narrative ("this survivor was sampled from remote.hpp's
    OpaqueIdGenerator::mix") the line number was never carrying much.
  3. Refresh them once and accept they will rot again. Cheapest, and the
    thing ci: mutation_survivors.json's line hints are unaudited and 5 of 7 are already stale #608 argued against on the structured half.

What would change the verdict

  • Close it if these citations are deliberately historical — a record of
    where the code was when the run was taken, not a pointer into current code.
    That is a defensible reading for runs and false_positive_finding, which
    describe a specific dated campaign. If so, say it in the file's _comment
    next to the note ci: mutation_survivors.json's line hints are unaudited and 5 of 7 are already stale #608 added, because the structured entries in the same file
    now use line the opposite way and nothing distinguishes them to a reader.
  • Raise it if someone is actually misled by one during a triage pass, or if
    option 1 is taken and the prose becomes gate-covered.

Related: #608 (the structured half, fixed). Same defect class as #605 (a
hand-maintained list with nothing auditing it), different fix site.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: ciSubsystem: cibugSomething isn't workingdocumentationImprovements or additions to documentationtriage: validWell-framed; implement as written

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions