Lab Technical Report LAB-TR-0039

Can a Finding Be Traced to Its Bytes? Lineage Coverage of a Phone-Forensic Reconstruction

Lab Technical Report, preprint, not peer reviewed

Abstract

A forensic report states findings, and a reader who relies on one needs the path from it to the bytes it came from. We define that path as a lineage: a finding derives from assertions that name a member of the extraction, its digest and a locator, and a finding of absence derives from a probe that records what was searched. Lineage coverage is the share of findings whose chain holds through five levels, from declared to replayed. We name nine breaks, map the model to W3C PROV and CASE, and test a resolver with thirteen kinds of injected break on synthetic devices; a consistent rewrite of a member and its record passes every level and is caught only by a digest of the whole extraction. We then replay the findings that a reference reconstruction made on 53 phones against their extractions. No recorded digest or value failed, yet 70% of findings had a complete chain: none of the findings of absence (22% of all findings) recorded a probe, 2% of findings depended on a file they did not cite, and 2% were interpretations that kept no raw input. One member supported a median 68% of a device’s findings.

CCS Concepts • Applied computing → System forensics; • Applied computing → Evidence collection, storage and analysis; • Information systems → Data provenance.

Keywords mobile forensics, provenance, lineage, traceability, coverage metric, negative evidence, W3C PROV, CASE, reproducibility

ACM Reference FormatDaniel Addai, Sanders Larweh Tetteh, Selorm Adjabeng, and Kingsley Albert Egyir. 2026. Can a Finding Be Traced to Its Bytes? Lineage Coverage of a Phone-Forensic Reconstruction. Lab Technical Report LAB-TR-0039, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0039/

1 Introduction

A forensic report states findings: a screen lock was set, automatic time was off, two accounts were signed in. A reader who has to rely on one of them asks the same question each time: where in the extraction does this come from, and does it still say that? The answer is the finding’s lineage. This report defines it for findings that a tool derives from a phone extraction, defines a coverage metric over it, and measures the metric on the output of a reference reconstruction.

A motivating example. Take a synthetic Android phone and three findings from a tool that reads its settings and account stores. The first says that automatic time is off. The second says that one Google account and three accounts in all are signed in. The third says that no hotspot setting is stored. All three are plain sentences, and the lineage of each is different (Table 1; the checker is described in Section 4). The first resolves: the record names a settings file, its digest, the setting and the value, and all four are found. The second cites the first of two account stores. That store holds no account; the larger count comes from the second store, which the record does not mention, so a reader who opens the cited file cannot reproduce the finding. The third is a finding of absence and records no store and no key, so a reader cannot tell whether the setting was absent from a store that was read or whether no store was searched. After the record cites both stores and names the probe, all three resolve.

Table 1: The synthetic example of Section 1, checked by the resolver of Section 4 (examples/motivating.json). Result: highest level reached and the first break (Table 3).
FindingWhat the record citesAs recordedAfter repair
Automatic time is offSetting auto_time in the settings file; value “0” read at the locator.L4, no breakL4, no break
One Google account, three accounts in allCites the first account store. The cited store holds no account; the value is the larger count of the two stores.L3, B6L4, no break
No hotspot setting storedA finding of absence. The record names no store and no key.none, B1L4, no break

The problem. Reports that give a finding with no checkable path to its source invite two errors. A reader may trust a finding whose source does not say what the finding says, and a reader may distrust a sound finding because no path is shown. The need for provenance is stated in the standards of the field [1], [2] and in recent models of analysis tools, which list improved artifact provenance as a direction [3]. What is missing is a measure: for the findings a tool produces, how many have a path that can be followed to the member, the digest, the locator and the value, and where do the others break? Without a measure, provenance remains a feature that a tool has or does not have.

Relation to our earlier reports. LAB-TR-0019 [4] describes a reference reconstruction that records for each established value its source, key path, content hash and method, and a digest over the sources a run read; it measured whether the reported values equal the stored values. LAB-TR-0020 [5] describes the provenance rules of a rule engine, which bind a run to a digest-verified rule pack. Neither asks whether a finding can be traced back, as a property of the report. LAB-TR-0034 [6] asks what an empty result licenses a reader to conclude; the present report asks what record would let a reader check that the search was made. The reference reconstruction of LAB-TR-0019 is the object of the measurement here; this report adds the lineage model, the metric, a resolver and its tests, and the measurement of the stored outputs against the extractions.

Scope. The measurement concerns one reference implementation at one source revision, applied to the Lab’s research corpus: 33 iOS and 14 Android full file system extractions and 7 Android bug reports. It measures whether the path from a finding to its source can be followed and replayed, not whether a finding is correct, the source complete, or the stored value what the device showed (Section 7). Results are given as shares of findings; counts of findings are withheld because the reference implementation is not public.

We ask four research questions.

  • RQ1 (Model). Can the path from a finding to its bytes be defined so that every link is checkable and every failure has a name?
  • RQ2 (Resolver). Does a resolver that checks the links detect injected breaks, and which breaks escape a given level?
  • RQ3 (Coverage). What share of a real reconstruction’s findings has a complete chain, and where do the others break?
  • RQ4 (Absence and fragility). Do findings of absence carry a lineage, how many findings fall with the loss of one member, and does a digest bind a finding to its extraction?
Table 2: Research questions, answers and evidence. Corpus results are shares of the findings of one reference reconstruction run on 33 iOS and 14 Android extractions and 7 bug reports of the Lab’s research corpus (counts of findings are withheld, see Scope); synthetic counts are findings of a toy reconstruction on 60 synthetic devices.
RQAnswerEvidence
RQ1Yes. A chain of five checked links (declared, member found, digest, locator, replay) and a sixth that needs a record outside the finding (container digest); nine named breaks; absence findings are covered by a probe.Section 3; Tables 3, 4
RQ2Ten of thirteen injected breaks are detected in every case at the level that checks the link; a changed locator or finding value escapes on 3% of findings each (default-from-absence findings, which have no replay); a consistent rewrite of a member, its digest and the finding value escapes all five levels (0 of 432) and is caught only by a container digest.Section 5.1; Table 5
RQ370% of findings have a complete chain. Of the findings that state a value, 90.5% pass the replay (to the value for stored values, to the recorded raw input for interpretations). No recorded digest or value failed; the breaks are missing links.Sections 5.2 to 5.4; Tables 6 to 8; Figure 2
RQ4None of the findings of absence records a probe; a probe could be rebuilt for 81% of them and none was refuted. The most-cited member supports a median 68% of a device’s findings. 3.1% of iPhone assertions cite a digest that also occurs on another phone.Sections 5.5, 5.6; Tables 9, 10; Figure 3

Contributions. This report makes four contributions.

  • A lineage model for findings, with positive and negative (probe) chains, five checked levels and a sixth for container binding, nine named breaks, and a mapping to W3C PROV and CASE (Section 3).
  • Lineage coverage, a metric defined on the levels, and a resolver that computes it, with its code and synthetic data released as an artifact (Sections 3.3 and 4).
  • A test of the resolver by thirteen kinds of injected break on synthetic devices, with the limit that no check on the finding alone can detect a consistent rewrite (Section 5.1).
  • A measurement of lineage coverage on the findings that a reference reconstruction made on 53 phones, with the breaks classified (Sections 5.2 to 5.6).

2 Background and Related Work

2.1 Provenance standards and ontologies

The W3C PROV family models provenance as entities, activities and agents, linked by generation, usage, derivation and attribution [1], [7]. PROV states constraints on these relations, such as the uniqueness and ordering of events [8]; in these three documents we found no construct for a statement that something did not occur. CASE describes cyber-investigations on top of the Unified Cyber Ontology [9]: its investigation ontology has provenance records and investigative actions, and re-implements the PROV derivation and informed-by properties [2]. UCO has hash objects, archive and file facets, and, for SQLite, a facet with table name, column name, row index and row condition [10]. A NIST implementation maps CASE graphs to PROV-O and ships a checker that reports chains of derivation that do not link back to the initial evidence submission [11]; its checks are structural and compare no digest and no value. Presentations on CASE state the aims of maintaining provenance and of testing tool results [12], and describe a provenance review of a dataset that found discrepancies such as a missing hash [13].

2.2 Provenance in forensic tools and interchange formats

DEX records the tools and transformations from raw acquired data to a result, gives every object a digest and a parent reference by digest, and lets a third party reproduce a result and compare two records; its evaluation compared eight tool chains for image metadata [14]. DFXML records byte runs, hash digests and the program and build environment that produced a result, so that a result can be regenerated [15]. An automated timeline approach keeps each high-level event linked to the low-level events and raw data it was inferred from [16] (abstract only). Good and Peterson rebuild the history of a file from existing artifacts [17] (abstract only). An abstract model of analysis tools, with standardised intermediate output demonstrated in CASE, names improved artifact provenance as a benefit and a direction, and uses the error classes of ASTM E3016-18, among them incompleteness, misinterpretation and inaccuracy by existence, alteration, association and corruption [3]. Validation frameworks ask that tool results can be traced and that errors are stated [18], [19] (neither read in full).

2.3 Data provenance in databases

Database research separates why provenance, the source data that influenced a result, from where provenance, the location a value was copied from [20], and adds how provenance as semiring annotations [21], [22]. The locator of an assertion in our model is where-provenance; a derivation from several assertions is why-provenance. Provenance of missing answers asks why an expected tuple is absent from a result [23], [24]; a probe in our model records a search and its outcome and does not explain a missing tuple.

2.4 Grounding of reports, traceability and supply chains

Khatiwala, Addai and Xu assign each artifact an identifier built from a hash of device, path and database name plus the table name and a row line number, and report a chain-of-custody adherence of 100% on one image [25] (the first author of the present report is a co-author). Adherence there means that the identifier is present; it does not test that the member exists, that its digest matches or that a locator reproduces the value. Das and others check 612 claims of language-model-drafted Android reports against human-reviewed reference findings, and report grounding and citation-validity rates [26]; their subject is report text, not tool findings, and their checks are by review. Requirements traceability measures the links between artifacts of software development [27], [28]. In the software supply chain, signed link metadata and build provenance with digests of resolved dependencies make a build checkable [29], [30].

Position of this work. Digest-based lineage of results is established in DEX and DFXML, the mapping of investigations to PROV in CASE and its PROV implementation, and where- and why-provenance in databases. We do not claim lineage or the mapping as new. We found no work that (1) defines a coverage metric for the share of a tool’s findings whose chain resolves to an existing member, an unchanged digest and a locator that reproduces the value; (2) gives findings of absence a recorded probe as their lineage; (3) reports resolvability measured on a tool’s own output over many extractions; or (4) tests a resolver by injected breaks. The search covered the arXiv, Zenodo and Crossref interfaces (OpenAlex and Semantic Scholar rate-limited, dblp blocked) and web search of the ACM, DFRWS and ScienceDirect domains on 29 October 2026; the private notes log the queries. Absence of a hit is not proof that no such work exists.

3 The Lineage Model

This section defines the objects of a lineage, the levels at which a chain can be checked, the lineage-coverage metric, the breaks, and the chain for findings of absence. Figure 1 shows the chain.

The lineage of a finding Five boxes from top to bottom: the finding, the assertion that names a member path, a digest, a locator, a value and a raw input, the member, the extraction and the acquisition. Arrows point from each box to the box it derives from. Levels are attached to the links: L0 the assertion is declared, L1 the member is found, L2 its digest matches, L3 the locator resolves inside the member, L4 the value is reproduced on replay, L5 the container digest matches a record held outside the finding. A side box, the probe, replaces the assertion for a finding of absence and records the store searched, the locator and the outcome. Finding claim, value, derivation class Assertion path, digest, locator, value, raw input Member bytes of one file Extraction container of members Acquisition class, time, instrument L0 assertion declared L1 member found L2 digest matches L3 locator resolves L4 value replays L5 container digest matches a record Probefor absence findings
Figure 1: The lineage of a finding. Each box derives from the one below it. L0 to L4 are checked from the finding and the container; L5 needs a digest of the container recorded outside the finding. A finding of absence cites a probe in place of the assertion.

3.1 Objects

An extraction is a container X that maps member paths to byte strings; the digest d(m) of a member is its SHA-256. A locator ℓ identifies a position inside a member: a key path in a property list or a settings file, a table and a condition in a SQLite database, a line of a text, or a directory prefix. An assertion is a tuple (p, h, ℓ, v, r): a member path p, the digest h the tool recorded, a locator, the value v the tool read, and optionally the raw input r from which v was derived. A finding is (c, w, k, A): a claim c, the value w reported, a derivation class k and a non-empty set A of assertions. The classes are verbatim (w is the value read), interpreted (w is a function of the raw input), aggregate (w combines values of several members), default-from-absence (w is a documented default, taken because the key is absent), presence and structural (w follows from the layout of the container and no member has a digest). A finding of absence states that no value was established; it cites a probe (p, ℓ, o): a store searched, the locator looked for and the outcome o, either “store absent” or “key absent”.

3.2 Levels

A finding holds through level k if every assertion of it passes the checks up to k.

  • L0, declared. The finding cites at least one assertion with a member path and a locator, or, for absence, a probe.
  • L1, member found. Each cited path resolves to a member of X. A path may match several members (copies in a second file system root, a backup tree, or names that differ in letter case); the digest of L2 then decides which copy was read.
  • L2, digest. The recorded digest equals the digest of a member that matches the path. If several members match and the digest identifies one that a reader taking the first match would not read, the finding is flagged ambiguous.
  • L3, locator. The locator resolves inside the member (the key, the row, the line or the directory exists). For default-from-absence it holds when the key is absent.
  • L4, replay. The member at the locator gives the reported value (verbatim), the recorded raw input (interpreted), or, when the value is recomputed from the container by an independent function, the same value (aggregate). A structural finding, whose value follows from the layout of the container, has no member to digest; it holds through L1 once the directory is found and stops at L2 with B9. All members the recomputation needs must be cited.
  • L5, container binding. A digest of the container, or of a manifest of member digests, was recorded outside the finding and equals the digest of X.

3.3 Lineage coverage

For a set F of findings and an extraction X, the lineage coverage LCk is the share of findings in F that hold through level k. By construction LC0 ≥ LC1 ≥ … ≥ LC4. We report LC over all findings and over positive findings (those that state a value), because findings of absence enter the metric through their probe or not at all. A finding that breaks at level j counts at every level below j and at none from j; coverage at L4 is the share of findings with no break.

3.4 Breaks

A finding that fails to hold through some level has a first break, named by the link that failed (Table 3). The classes describe the chain, not the correctness of the value; the error classes of ASTM E3016-18, as quoted in [3], classify errors in results, and a break is a place where such an error would be hard to find.

Table 3: Breaks, the first level that fails, and what a reader loses.
BreakLevelMeaningWhat the reader loses
B1 nothing declaredL0No assertion, or an absence finding without a probe.Any path to the source.
B2 member unresolvedL1The cited path matches no member.The source.
B2a member ambiguousL1The path matches several members and the digest identifies a copy other than the first.Which copy was read, if only the path is kept.
B3 digest mismatchL2No matching member has the recorded digest.The assurance that the member is the one read.
B4 locator unresolvedL3The key, row or line is not in the member.The position of the value.
B5 value not reproducedL4The member at the locator gives another value.The finding’s support.
B6 contributor not citedL4The value needs a member the finding does not cite.Part of the evidence; the cited member alone does not support the value.
B7 not replayableL4An interpretation with no recorded raw input.The means to check the step from input to value.
B8 absence refutedL3The probe finds the key.The absence finding.
B9 no memberL2A structural finding: the directory is found, but there is no member and no digest.A digest; the layout can still be checked.

A tenth label, U, is not a break but a limit of the checker: the record has a raw input but the checker has no replay for that store. It is reported separately so that a gap in the checker is not counted as a defect of the tool.

3.5 Findings of absence

A finding of absence has no member to cite: what it needs to record is what was looked for. The probe (p, ℓ, o) is resolved like an assertion. If the outcome is “store absent”, no member matches p (L1 holds when none is found). If it is “key absent”, a member matches, the digest identifies it, and the locator does not resolve (L3 holds when the key is missing); re-running the probe gives the same outcome (L4). A probe that finds the key refutes the finding (B8). This is the negative counterpart of where-provenance. We found no construct for it in PROV [1], [7], [8], nor in CASE and UCO (Table 4).

3.6 Mapping to PROV and CASE

Table 4 maps the model to PROV-O and to CASE and UCO as we read them. The mapping is a use of the standards and not a new one; we have not validated the generated graphs against the SHACL shapes of the CASE tooling. The artifact includes a small PROV-O export (to_prov_turtle).

3.7 Two limits

Proposition 1 (consistent rewrite). Suppose a party can change a member of X and, in the lineage record, the digest, the value read, the raw input and the finding value of every assertion and finding that depends on it. Then the changed pair (record, container) passes every check of L0 to L4 that the original passed. Proof. Each check is a function of the record and the container alone, and the changed pair is a valid pair for the changed container. ▫ Only information outside the finding, such as a digest of the container recorded earlier (L5), can tell the two apart; a party who can also change that digest defeats L5 as well. The proposition is elementary, but it states what the five checked levels cannot do, and Section 5.1 measures it.

Proposition 2 (path-only lineage is ambiguous). If two members of X match a cited path and differ in content, a lineage that records the path and the locator alone does not determine which was read, whereas the digest does. Proof. The path is a suffix match for both, and the locator resolves in both or in one of them. ▫ The case is not rare in practice (Section 5.3).

Table 4: The model in PROV-O and in CASE and UCO (class and property names as found in the documents read).
ModelPROV-OCASE and UCO, and the gap
Findingprov:Entity, prov:wasGeneratedBy an prov:Activityuco-core:Assertion, uco-analysis:AnalyticResult; produced by an investigation:InvestigativeAction
Gap: Derivation class has no term.
Derivation from assertionsprov:wasDerivedFrom, prov:usedinvestigation:wasDerivedFrom (re-implements the PROV property)
Member and digestprov:Entity, prov:valueuco-observable:File with ContentDataFacet and a uco-types:Hash (hashMethod, hashValue)
Locatorprov:atLocationSQLiteBlobFacet (table, column, row index, row condition)
Gap: No class found for a key path, a line or a member of an archive.
Containerprov:Entity, prov:CollectionArchiveFile
Gap: A digest of the container held apart from the findings is not required.
Acquisitionprov:Activityinvestigation:ProvenanceRecord, InvestigativeAction
Probe (absence)No construct found [1], [7], [8]No construct found; uco-action:Action has a result and an error and could carry an empty result by convention
Gap: The recorded search is not representable except by convention.

4 Resolver and Evaluation Design

4.1 The resolver

The resolver is a small program (about 300 lines of Python, standard library only) that takes a lineage file and a container directory. It finds the members that match each cited path (a path is a suffix match), checks the digest against each, resolves the locator in the member, and replays the value. Locator types are XML setting by name, key path in a property list or a JSON document, key in a property file, bracketed property text, line of a text, a SQLite cell or table, and a directory prefix. Replay of interpreted and aggregate derivations uses a function registered for the derivation by the code that produced the finding; the resolver reports B7 when none exists. It returns, for each finding, the highest level reached and the first break, and computes LC0 to LC4. A second function reports ambiguity when a path matches several members of different content.

4.2 Injected breaks on synthetic devices

A generator writes 60 synthetic containers (settings files, a SQLite lock store, a property file, two account stores, a property list, a text report and a directory layout) with seeded variation, including identical files across devices of one model group and a stale second copy of the settings file on some devices. A toy reconstruction, written for the study, derives 763 findings from them and records their lineage. With every contributor cited and a probe recorded, 711 of them hold through L4 and the 52 structural findings stop at B9. Thirteen injections then change the record or the container in memory and ask whether the resolver reports a break on the changed finding (Table 5): the member path, the digest, the locator or the value changed in the record; a member replaced by another device’s member; the cited value altered in the member with the digest corrected; a consistent rewrite; a removed member; a dropped contributor; a second copy; an altered raw input; a key written after an absence finding; and a probe removed. Only findings that resolved without a break before the injection are counted. The synthetic tables show the behaviour of the resolver, not the behaviour of any real tool.

Table 5: Detection of thirteen injected breaks on 60 synthetic devices (make_tables.py). n: findings that resolved without a break before the injection and to which the injection applies; detected: the resolver reports a break (or, for the last I7 row, the container digest differs).
InjectionnDetected%Break reportedNote
I1 Member path changed in the record633633100%B2 633Member not found.
I2 Digest changed in the record633633100%B2a 32, B3 601Cited digest matches no copy.
I3 Locator changed in the record63361297%B4 612Misses default-from-absence findings: the new key is also absent.
I4 Finding value changed in the record63361297%B5 612Misses default-from-absence findings: nothing is replayed.
I5 Member replaced by another device’s member of the same path521 (103 identical, excluded)521100%B2a 32, B3 489Identical files cannot be told apart.
I6 Cited value altered in the member, digest corrected in the record552552100%B5 552Finding value no longer matches the member.
I7 Consistent rewrite of member, digest and value (levels L0 to L4)43200%noneIndistinguishable from the original.
I7 The same, with a container digest held outside the record (L5)432432100%L5 432Container digest differs.
I8 Member removed from the container633633100%B2 633Member not found.
I9 One of two contributing members dropped from the citations5252100%B6 52Replay needs a member that is not cited.
I10 A second copy with other content appears at a longer path633633100%warn 633Flagged as ambiguous; the cited copy still resolves.
I11 Recorded raw input changed (interpreted findings)120120100%B5 120Raw input differs from the member.
I12 The probed key is written into the store (absence findings)4040100%B8 40Absence refuted by the probe.
I13 Probe removed from an absence finding7878100%B1 78Nothing declared.

4.3 The corpus run

Reference implementation. The reference reconstruction is the one of LAB-TR-0019 at the same source revision (commit 537ad858) [4]. For each platform it reads a fixed set of stores of an extraction or bug report and, for each fact it can establish, writes a record with a state, the value, and for each qualified observation the source path, the key path inside the source, the SHA-256 of the source member as staged, and the way the value was obtained (direct, interpreted, inferred) with a small structure of raw inputs. A fact it cannot establish ends in a record with a state and a reason and no source. A run also records one digest over the relative paths and content hashes of the sources it read, not over the extraction. We call a record with at least one qualified observation a positive finding and a record without one a finding of absence; the records marked as conflicting (under 2% of findings), in which qualified copies disagreed, are positive findings with several assertions. The stored outputs of the run of 28 October 2026 for LAB-TR-0019 were used unchanged; no reconstruction was repeated.

Frame. The frame is the 54 evidence items of LAB-TR-0029 [31]: 33 iPhone and 14 Android full file system extractions and 7 Android bug reports. Two extractions of one iPhone count once. One iPhone extraction ended without a run because the reconstruction needs the operating-system version and none could be determined, so 53 items yielded findings: 32 iPhones, 14 Android phones and 7 bug reports. The device counts rest on hash comparisons of device identifiers recorded in the Lab’s private notes.

Replay. For each assertion the resolver read the extraction’s central directory, took the members that match the cited path, hashed them, and read the locator with readers written for this study from the stored formats: settings files in text and binary XML (the binary-XML decoder is the one of the second reader of LAB-TR-0019), property lists, SQLite databases opened read-only from scratch copies, property text and the sections of a bug report. The levels were evaluated as in Section 3.2. Verbatim findings are replayed by comparing the value; interpreted findings by comparing the recorded raw input with what the member holds; one aggregate by recomputing it from the cited member; default-from-absence findings by checking that the key is absent; structural findings by checking that the directory exists. The replay of bug-report service dumps was not built; those findings are reported as U. For findings of absence the probe was reconstructed afterwards: for each fact, the stores and keys that positive findings of other devices of the same platform class cite were looked up in the extraction. Where no store is present the outcome is “store absent”; where a store is present and no candidate key is, “key absent”; where a key is present the finding is refuted. Where no other device established the fact, no probe is known. The run took about three minutes on one workstation, items processed one at a time.

5 Results

5.1 Injected breaks

Every single-link change to the record is detected by the level that checks that link, with one class of exception: on default-from-absence findings a changed locator still resolves, because the new key is also absent, and a changed value is compared with nothing, 21 findings each. A member replaced by another device’s member is detected unless the two files are identical, which happened for 103 of 624 swaps (17%): a digest alone cannot tell identical members of two devices apart. Altering the cited value and correcting the digest is detected only at L4, by the replay. A consistent rewrite of member, digest and value escapes all five levels (0 of 432) and is detected on all 432 when a container digest recorded outside the finding is checked, as Proposition 1 predicts. Two coverage effects follow from the way the toy reconstruction records lineage. Without probes, 10% of its findings break at B1; citing only the first of two contributors lowers LC4 from 93.2% (the structural findings stop at B9) to 86.4%; both together give 76.1% (data/baseline_modes.json).

5.2 Coverage of the reference reconstruction

The reference reconstruction made findings on 53 items. 78% of them state a value (positive findings) and 22% state that no value was established (findings of absence); the share of absence findings is 31% on iPhones, 6% on Android phones and 18% on bug reports. 39% of the positive findings cite two or more assertions, up to 7, always on different members. Table 6 gives lineage coverage over positive findings and over all findings, and Figure 2 the composition of the breaks.

Table 6: Lineage coverage: share of the row’s findings that hold through each level. Every positive finding holds through L0; for all findings, the findings of absence fail at L0. Counts of findings are withheld.
FindingsL1 memberL2 digestL3 locatorL4 replay
iPhone, positive99%99%99%99%
Android full file system, positive100%96%96%83%
Android bug report, positive100%100%100%77%
All positive findings99%98%98%90%
All findings (positive and absence)77%76%76%70%

99% of the positive findings resolve to a member, 98% to a matching digest and 98% to a locator; 90.5% pass the replay. Over all findings the complete chain exists for 70%. By source the share of all findings with a complete chain is 68% on iPhones, 78% on Android phones and 64% on bug reports; over positive findings it is 98.6%, 82.7% and 77.3%. No device had a complete chain for all its findings; the share per device ranged from 50% to 88%, with a median of 69%. Findings that the checker cannot replay (the U findings of Section 5.3: 2% of all findings, 15% of the findings of bug reports) count as not complete. Left out of the denominator, the complete chain is 72% of the other findings and 93% of the other positive findings; for bug reports, 75% and 94%.

Share of findings by the first break in their chain, by evidence source Three stacked bars of 100 percent. iPhone (32 phones): chain holds to L4 68 percent; absence, no probe 31 percent; ambiguous copy 1 percent. Android (14 phones): chain holds to L4 78 percent; absence, no probe 6 percent; raw input not recorded 6 percent; uncited contributor 7 percent; no member (layout) 4 percent. Bug report (7 reports): chain holds to L4 64 percent; absence, no probe 18 percent; raw input not recorded 4 percent; not checked 15 percent. 68 31 iPhone32 phones 78 Android14 phones 64 18 15 Bug report7 reports chain holds to L4 absence, no probe raw input not recorded not checked uncited contributor no member (layout) ambiguous copy
Figure 2: Share of findings by the first break in their chain, by evidence source (labels in percent; segments under 8 percent are not labelled). Shares are in the figure description and in Table 7.

5.3 What breaks

No recorded digest failed and no value differed from its member: the checker found no B3, B4 or B5. All breaks are links that are missing or that cannot be followed (Table 7).

Table 7: First break of the findings, as a percentage of the findings of each source (columns sum to 100 up to rounding). A dash is zero.
BreakiPhoneAndroidBug reportAll
Complete chain (holds through L4)68.377.763.670.1
B1 absence, no probe recorded30.76.117.622.5
B7 interpretation, no raw input recorded–5.53.72.0
U replay not built in the checker––15.02.0
B6 contributor not cited–6.6–1.7
B9 structural, no member–4.1–1.1
B2a ambiguous copy1.0––0.6
B2 member unresolved–––0
B3 digest mismatch–––0
B4 locator unresolved–––0
B5 value not reproduced–––0
B8 absence refuted–––0

Absence without a probe (B1, 22% of findings). Every finding of absence is a record with a state and a reason and no store and no key (Section 5.5).

A contributor the lineage does not cite (B6, 2% of findings, 7% of Android findings). On 12 Android phones, findings about one setting depend on a file whose presence the record notes but which it does not cite. The cited member does not support these findings alone, and the member that does is not named. A second kind of uncited contributor is built into the reference: an aggregate over two stores of one kind that cites one of them. On all 14 Android phones the cited store alone reproduced the aggregate, so the break was not observed; the synthetic case (Table 1) shows that it would not have been seen.

Interpretation without a raw input (B7, 2%) and replay not built (U, 2%). B7 findings state a label with no recorded input from which the label could be checked: 5.5% of Android findings and 3.7% of bug-report findings. The U findings are service dumps of bug reports, whose records do carry raw counts; the limit is the checker’s.

Structure (B9, 1%). Some Android findings (4% of them) follow from the layout of the container and have no member to digest. They can be checked for the directory, not hashed.

An ambiguous copy (B2a, 8). On eight iPhones the cited path matched several members that differ in letter case only, and the recorded digest identified the lower-case-named copy, which a first match on name length would not read. This is the case LAB-TR-0019 found (a store under two names of which only one held the key) [4]: the digest alone shows which copy the tool read, and on six of the eight another copy held the key. In total about 1% of the assertions matched more than one member.

5.4 By derivation class

Table 8: Findings by derivation class (grouped): share of all findings and share with a complete chain. Counts of findings are withheld.
Derivation classShare of findingsComplete chainWhere the others break
Stored value read as it is (verbatim, presence)51%100%none
Derived from stored values (interpretation, aggregate, documented default)25%75%B6 (7% of them), B7 (8%), U (8%), B2a (2%)
Structural (layout of the container)1%0%B9: no member to digest
Absence (no value established)22%0%B1: no probe recorded

The classes that state a stored value, verbatim or presence, never broke. The weakest chains are those of derived and negative findings: they carry the interpretation that a reader most needs to check. A tool that records the raw input of every interpretation, the probe of every absence and every contributor of every aggregate would raise the complete chain from 70% to about 99%; only the structural findings (1%) have no member to hash. Of the complete chains, 76% replay the reported value and 24% replay the recorded raw input of an interpretation; for these the mapping from input to label is not tested (Section 7).

5.5 Findings of absence

None of the findings of absence names a store or a key. Reconstructing the probe from the extraction and from what other devices of the class established (Table 9) gives an outcome for 81% of them: “store absent” where the extraction holds no candidate store, “key absent” where a candidate store is present and holds no candidate key. No finding was refuted. For the other 19% no other device of the platform class established the fact, so no candidate store is known; most are on bug reports, which hold few of the stores.

Table 9: Findings of absence: outcome of the reconstructed probe, as a percentage of the source’s findings of absence. The probe is learned from other devices of the same class; it tests that the absence is consistent with the extraction, not that the tool’s own search was complete.
SourceKey absentStore absentNo probe knownRefuted
iPhone4938130
Android full file system861400
Android bug report150850
All4833190

5.6 Concentration and binding

A device’s findings rest on few members: the median is 7 cited members per device, and 61% of the positive findings cite exactly one member. The most-cited member supports a median 68% of a device’s positive findings (Figure 3): 72% on iPhones, 28% on Android phones (at most 32%) and 57% on bug reports (at most 62%); on 39 of 53 devices it is half or more, and on three iPhones every finding cites the same member. The loss or alteration of that one member would break that share of a phone’s findings at L1 or L2 at once.

Share of a device’s findings that cite its most-cited member One dot per device on a scale from 0 to 100 percent. iPhone: 32 devices, minimum 65, median 72, maximum 100 percent. Android: 14 devices, minimum 25, median 28, maximum 32 percent. Bug report: 7 devices, minimum 55, median 57, maximum 62 percent. Triangles mark the median. iPhone Android Bug report 0 25 50 75 100 share of the device’s findings that cite the member (%)
Figure 3: Share of a device’s positive findings that cite its most-cited member, one dot per device (dots at one value are stacked). Triangles mark the median.

A digest binds a finding to a file, not to a phone. 3.1% of the iPhone assertions cite a member whose digest also appears in the lineage of another iPhone (five digests are shared); none of the Android and bug-report assertions does. A finding from a default configuration file can therefore carry a lineage that is valid for a second phone; only a digest of the container (L5) ties it to its extraction. The outputs of the run record no such digest: the run digest covers the sources read, not the extraction.

6 Discussion

What a reader should ask for. The breaks suggest five questions. Does every finding name the member, its digest and the position of the value? Does every interpretation keep its raw input? Does every aggregate cite every member it used? Does every statement that nothing was found say what was searched? Is there a digest of the whole extraction that the findings can be tied to? The first question was answered yes by this reference for all positive findings that cite a member; the others are where the 70% falls short of 100%.

Design consequences. The cheapest repairs record what the tool already knew: the raw input beside the label, the second store beside the first, the store and key searched beside an absence. They change the record, not the analysis. The probe in particular costs a path and a key per absence and turns an unverifiable negative into one that a reader can re-run. The container digest is also cheap; its value is stated by Proposition 1 and by the share of iPhone assertions whose digest also occurs on another phone.

Relation to the standards. CASE and its PROV implementation can hold the chain from finding to member and digest; they need a locator type for key paths, lines and archive members, a derivation class, and a construct for a recorded search. The check in the PROV implementation is structural; the levels L2 to L4 add content.

Relation to earlier reports. LAB-TR-0019 measured whether reported values equal stored values and found no difference against a separately implemented extractor; this measurement finds the same on a different basis (no value mismatch at replay) and adds what that comparison could not show, that a correct value may lack a path to its source. LAB-TR-0034 and LAB-TR-0029 ask what an empty result licenses and whether a phone can answer a question; the probe makes the first check possible for a tool’s own absence findings [31], [6].

7 Threats to Validity and Limitations

Internal. The reference reconstruction, the second reader of LAB-TR-0019 and the readers of this study were written by the same team and read the same bytes. A misreading of a format that all of them share would not appear as a break. The digest check compares the digest the tool recorded with the digest of the member now in the container: it shows that the cited bytes are the bytes that were staged, not that the tool derived its value from them. The replay supplies that link only as far as a second reader gets the recorded value from the cited bytes, and for some presence findings it tests that a store or a type exists rather than a value. The replay of interpreted findings compares the recorded raw input with the member; it does not test the mapping from input to label, which a second implementation would test (LAB-TR-0019). The levels and break classes were defined by the authors before the corpus run, but the classification of derivation classes and the treatment of two cases (the uncited contributor, the case-variant copies) were made after the first results and are stated here as such. All numbers of the report come from one run of the checker.

Construct. Lineage coverage measures whether a path can be followed and replayed. It is not accuracy, completeness or weight. The probe reconstructed for findings of absence is learned from other devices and so tests consistency, not the tool’s own search. Treating a recorded path as a suffix match is a choice; a tool that records the full in-container path would have fewer ambiguous cases. The U findings count as not complete, which lowers coverage; Section 5.2 gives the figures without them.

External. One reference implementation, one catalogue of facts, one source revision, and 53 devices from one research corpus (most iPhones run iOS 26, 12 of 14 Android phones are Samsung). The shares describe this implementation; another tool would differ, and its breaks may be of other kinds. The findings are settings and presence facts; a tool that emits event timelines has records of another shape (a line number in a log, a row identifier in a database). The artifact’s locator types cover these, but they were not measured on real data.

Limitations. The extraction was assumed unchanged since the run of 28 October; the matching digests of every cited member that resolved support that assumption but do not prove it for members the run did not cite. The synthetic injections test the resolver on one toy reconstruction. The figure of three minutes is the time of the resolver on stored output, not the cost of building lineage into a tool. We did not compare tools.

8 Conclusion

A finding is as good as the path from it to its bytes. We defined that path as a lineage with five checked levels and a sixth that needs a record outside the finding, named nine ways it breaks, gave absence findings a probe in place of a member, and defined lineage coverage as the share of findings whose chain holds. On the findings of a reference reconstruction run on 53 phones the chain was complete for 70% and no recorded digest or value failed; the missing links were the probes of the findings of absence, the raw inputs of interpretations, contributors that were read but not cited, and a digest of the extraction. A consistent rewrite of a member and its record is beyond any check on the finding alone. We suggest that tools report their lineage coverage beside their findings, and that readers ask for it.

Artifact Availability

The resolver, the synthetic device generator, the toy reconstruction, the injection tests, the PROV-O export, the example of Table 1 and the scripts that regenerate Tables 1 and 5 and the synthetic coverage figures will be released in the Lab's public artifacts repository, with no release date set (code MIT licence; data and text CC BY 4.0). The package is not public yet, and the sentences that follow describe it as planned. The corpus tables (Tables 2, 6 to 9 and Figures 2 and 3) cannot be reproduced from the package: the readers that replay the reference reconstruction’s output against the Lab’s research corpus, their configuration and the per-device records are kept by the Lab and are not released, because the configuration names locations in the research corpus. The reference implementation is not public.

Data Handling Statement

The evidence for this study is drawn from the Lab’s research corpus of mobile device extractions and bug reports and was read only. The report gives aggregate counts and device classes. It contains no identifiers, personal data, message or file content, or case information. The analysis read the stored output of an earlier reconstruction run and, from the extractions, the central directory and the few members the output cites (settings files, property lists, account and lock-settings databases and the text of bug reports) to hash them and to look up a key or a section in memory; no message, call or photograph store was read. The device counts rest on hash comparisons of device identifiers recorded in the Lab’s private notes: the 14 Android extractions are 14 phones, the 33 iOS extractions analysed are 33 phones, and the seven bug reports come from seven devices. Whether a bug report and an extraction come from the same phone was not tested. The synthetic devices of Sections 1 and 5.1 contain no real data.

Declaration of AI Assistance

The authors conceived the research questions and directed the work. The resolver, the generator, the injection tests, the analysis code and the first draft of this report were produced with AI assistance (Anthropic Claude). The authors reviewed the results and the text and are responsible for the content.

References

  1. Luc Moreau and Paolo Missier (Eds.). 2013. PROV-DM: The PROV Data Model. W3C Recommendation, 30 April 2013. https://www.w3.org/TR/prov-dm/ (Definitions and relations read: the first 100,000 of 155,000 characters.)
  2. CASE community. 2026. CASE Ontology, version 1.5.0 (investigation ontology file). https://github.com/casework/CASE (The ontology file was read.)
  3. Christopher Hargreaves, Alex Nelson, and Eoghan Casey. 2024. An abstract model for digital forensic analysis tools – A foundation for systematic error mitigation analysis. Forensic Science International: Digital Investigation 48 (2024), 301679. https://doi.org/10.1016/j.fsidi.2023.301679 (PDF text read around provenance, completeness and error classes.)
  4. Daniel Addai, Selorm Adjabeng, Kingsley Albert Egyir, and Sanders Larweh Tetteh. 2026. Not Found Is Not Off: Evidence-State Accounting for Reconstructing Phone Security Settings from Full File Systems and Android Bug Reports. Lab Technical Report LAB-TR-0019, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0019/
  5. Daniel Addai, Kingsley Albert Egyir, Sanders Larweh Tetteh, and Selorm Adjabeng. 2026. Extracting Event Categories from Multi-Million-Line Mobile Logs with Predicate Rules: Design Rationale and a Repeatable Rule-Construction Method. Lab Technical Report LAB-TR-0020, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0020/
  6. Daniel Addai, Selorm Adjabeng, Kingsley Albert Egyir, and Sanders Larweh Tetteh. 2026. What an Empty Result Licenses: A Sound Calculus of Absence Claims for Phone Evidence. Lab Technical Report LAB-TR-0034, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0034/
  7. Timothy Lebo, Satya Sahoo, and Deborah McGuinness (Eds.). 2013. PROV-O: The PROV Ontology. W3C Recommendation, 30 April 2013. https://www.w3.org/TR/prov-o/ (Class and property lists read: the first 100,000 of 263,000 characters.)
  8. James Cheney, Paolo Missier, and Luc Moreau (Eds.). 2013. Constraints of the PROV Data Model. W3C Recommendation, 30 April 2013. https://www.w3.org/TR/prov-constraints/ (Text searched in full for negation and absence; no construct for a negative statement found.)
  9. Eoghan Casey, Sean Barnum, Ryan Griffith, Jonathan Snyder, Harm van Beek, and Alex Nelson. 2017. Advancing coordinated cyber-investigations and tool interoperability using a community developed specification language. Digital Investigation 22 (2017), 14–45. https://doi.org/10.1016/j.diin.2017.08.002 (Author manuscript read: abstract, provenance and hash examples.)
  10. UCO community. 2026. Unified Cyber Ontology, version 1.5.0 (core, types, action, observable and analysis files). https://github.com/ucoProject/UCO (Class and property lists extracted and selected definitions read; a text search of the core and observable files for absence, not found and negation found no hit.)
  11. Alex Nelson. 2026. case-prov (CASE-Implementation-PROV-O), version 0.15.0. https://github.com/casework/CASE-Implementation-PROV-O; https://pypi.org/project/case-prov/ (README, the header of the check script and the shapes read; the test suite was not read.)
  12. Sean Barnum and Ryan Griffith. 2019. Pull It Together: Enabling Interoperability of Digital Forensic Systems Using a Standard Representation and Supporting API. DFRWS presentation slides. dfrws.org (Slides read; the year is inferred from the file path and the slides name only these two authors.)
  13. Alex Nelson. 2022. Discovery of digital forensic dataset characteristics with CASE-Corpora. DFRWS USA 2022 presentation slides. dfrws.org (Slides read earlier; not re-fetched.)
  14. Brian N. Levine and Marc Liberatore. 2009. DEX: Digital evidence provenance supporting reproducibility and comparison. Digital Investigation 6 (Supplement), DFRWS 2009, S48–S56. https://doi.org/10.1016/j.diin.2009.06.011 (Read in full: abstract, object model, digests, comparison.)
  15. Simson L. Garfinkel. 2012. Digital forensics XML and the DFXML toolset. Digital Investigation 8, 3–4 (2012), 161–174. https://doi.org/10.1016/j.diin.2011.11.002 (Author copy read: abstract, introduction, prior work, structure and the provenance section.)
  16. Christopher Hargreaves and Jonathan Patterson. 2012. An automated timeline reconstruction approach for digital forensic investigations. Digital Investigation 9 (Supplement), DFRWS 2012, S69–S79. https://doi.org/10.1016/j.diin.2012.05.006 (Bibliographic record and abstract from search results; full text not read.)
  17. Ryan Good and Gilbert Peterson. 2017. Automated Collection and Correlation of File Provenance Information. In Advances in Digital Forensics XIII, IFIP AICT 511. Springer, 269–284. https://doi.org/10.1007/978-3-319-67208-3_15 (Bibliographic record; abstract from repository search results; full text not read.)
  18. Radina Stoykova and Katrin Franke. 2023. Reliability validation enabling framework (RVEF) for digital forensics in criminal investigations. Forensic Science International: Digital Investigation 45 (2023), 301554. https://doi.org/10.1016/j.fsidi.2023.301554 (Known from search-result text only; not read.)
  19. Angus M. Marshall. 2021. Digital forensic tool verification: An evaluation of options for establishing trustworthiness. Forensic Science International: Digital Investigation 38 (2021), 301181. https://doi.org/10.1016/j.fsidi.2021.301181 (Bibliographic record checked; text not read.)
  20. Peter Buneman, Sanjeev Khanna, and Wang-Chiew Tan. 2001. Why and Where: A Characterization of Data Provenance. In Database Theory – ICDT 2001, LNCS 1973. Springer, 316–330. https://doi.org/10.1007/3-540-44503-X_20 (Bibliographic record checked; text not read.)
  21. James Cheney, Laura Chiticariu, and Wang-Chiew Tan. 2009. Provenance in Databases: Why, How, and Where. Foundations and Trends in Databases 1, 4 (2009), 379–474. https://doi.org/10.1561/1900000006 (Abstract read; text not read.)
  22. Todd J. Green, Grigoris Karvounarakis, and Val Tannen. 2007. Provenance semirings. In Proceedings of PODS 2007. ACM, 31–40. https://doi.org/10.1145/1265530.1265535 (Bibliographic record checked; text not read.)
  23. Adriane Chapman and H. V. Jagadish. 2009. Why not? In Proceedings of the 2009 ACM SIGMOD International Conference on Management of Data. 523–534. https://doi.org/10.1145/1559845.1559901 (Bibliographic record checked; text not read.)
  24. Jiansheng Huang, Ting Chen, AnHai Doan, and Jeffrey F. Naughton. 2008. On the provenance of non-answers to queries over extracted data. Proceedings of the VLDB Endowment 1, 1 (2008), 736–747. https://doi.org/10.14778/1453856.1453936 (Bibliographic record checked; text not read.)
  25. Jeel P. Khatiwala, Daniel Addai, and Weifeng Xu. 2025. Evaluating the Reliability of Digital Forensic Evidence Discovered by Large Language Model: A Case Study. In 2025 IEEE 49th Annual Computers, Software, and Applications Conference (COMPSAC). 1067–1076. https://doi.org/10.1109/COMPSAC65507.2025.00138; arXiv:2602.20202. (arXiv text read: identifier scheme and metrics. The present author is a co-author.)
  26. Madhab Chandra Das, Sajid Ahmed, Tasnia Tabassum, and Qingzhong Liu. 2026. Evidence-Grounded LLM-Assisted Android Mobile Forensic Reporting. arXiv:2610.26946. https://arxiv.org/abs/2610.26946 (Read in full.)
  27. Orlena C. Z. Gotel and C. W. Finkelstein. 1994. An analysis of the requirements traceability problem. In Proceedings of the First International Conference on Requirements Engineering. IEEE, 94–101. https://doi.org/10.1109/ICRE.1994.292398 (Bibliographic record checked; the year is taken from the conference; text not read.)
  28. Jane Cleland-Huang, Orlena Gotel, Jane Huffman Hayes, Patrick Mäder, and Andrea Zisman. 2014. Software traceability: trends and future directions. In Future of Software Engineering (FOSE 2014). ACM, 55–69. https://doi.org/10.1145/2593882.2593891 (Bibliographic record checked; text not read.)
  29. Santiago Torres-Arias, Hammad Afzali, Trishank Karthik Kuppusamy, Reza Curtmola, and Justin Cappos. 2019. in-toto: Providing farm-to-table guarantees for bits and bytes. In 28th USENIX Security Symposium. 1393–1410. https://www.usenix.org/conference/usenixsecurity19/presentation/torres-arias (Abstract read.)
  30. SLSA project. SLSA Provenance v1.0 (the page marks it retired; v1.2 is current). https://slsa.dev/spec/v1.0/provenance (Page read.)
  31. Daniel Addai, Kingsley Albert Egyir, Sanders Larweh Tetteh, and Selorm Adjabeng. 2026. Measuring the Answerability of Date-Bound Questions from Mobile Device Extractions. Lab Technical Report LAB-TR-0029, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0029/

Cite and download

Cite as

Daniel Addai, Sanders Larweh Tetteh, Selorm Adjabeng, and Kingsley Albert Egyir. 2026. Can a Finding Be Traced to Its Bytes? Lineage Coverage of a Phone-Forensic Reconstruction. Lab Technical Report LAB-TR-0039, version 1.0. SectraTEK Lab, Prudential Associates. Preprint, not peer reviewed. https://lab.sectratek.com/research/reports/lab-tr-0039/

Citation guide
lab-tr-0039.bib
@techreport{addai2026labtr0039,
  author      = {Addai, Daniel and Tetteh, Sanders Larweh and Adjabeng, Selorm and Egyir, Kingsley Albert},
  title       = {Can a Finding Be Traced to Its Bytes? Lineage Coverage of a Phone-Forensic Reconstruction},
  institution = {SectraTEK Lab, Prudential Associates},
  type        = {Lab Technical Report},
  number      = {LAB-TR-0039},
  year        = {2026},
  howpublished = {https://lab.sectratek.com/research/reports/lab-tr-0039/},
  note        = {Version 1.0, preprint, not peer reviewed. CC BY 4.0}
}

Licence: CC BY 4.0. The print layout of this page is set for US Letter in two columns. Related reports: LAB-TR-0019, LAB-TR-0020, LAB-TR-0029, LAB-TR-0034.

Versions and corrections

VersionDateChange
1.02026-10-29First release.

Corrections: none so far. Errors can be reported through the corrections page.