November 11, 2026 · 4:03–5:21 PM Eastern · 40,112 candidate hashes
This efficacy test began with just over 40,000 cover hashes in a local instance of Metron, representing approximately 21% of the metron.cloud issue count reported at the time (187,642 issues). The local search corpus contained 40,000 issues and 40,112 cover hashes, including variants.
Scanning was performed using a custom Android client named CPHTest (Cover Perceptual Hash Test), which was built for this purpose in the experimental Metron branch. Once configured with an API key for a local network instance, the client implements a simple workflow:
The screenshots illustrate corner editing, corrected-image review, search confirmation, and the result-feedback controls. They show different scans rather than a single continuous attempt.
A consistent environment was used for testing, consisting of a worktable with a black mat marked with 1-inch grid squares and a single powerful LED worklamp.
The tester scanned 139 comics from their collection. Care was taken in advance to ensure that the test subjects were represented in the local database. One unavailable reference cover was identified after the fact and its trial was excluded, leaving 138 eligible comic trials. The exclusion and subsequent collection-context findings are documented in Validation and Audit; later identification alone does not establish catalog presence at scan time.
127 of 138 eligible comics matched within two attempts (92.03%). First scan: 109; retry rescue: 18; failed twice: 11.
The 40 included no-match reports are not 40 failed comics: they represent 29 failed first attempts plus 11 failed retries. Every successful comic contributes only its final selected rank. The 18 retry successes were all rank #1. Among successful comics, 96.06% ranked first; among all 138 eligible trials, 88.41% ended with a rank-one match.
| Measurement | Min (ms) | Max (ms) | Mean (ms) | Median (ms) |
|---|---|---|---|---|
| Android Client Hash Processing | 182.330 | 284.137 | 230.795 | 232.121 |
| Postgres Hash Search | 42.983 | 86.272 | 47.317 | 45.430 |
| API Round Trip | 178.139 | 412.618 | 219.380 | 205.242 |
| User Experience | 373.495 | 684.622 | 450.176 | 441.723 |
All 167 eligible attempts included. Postgres hash search is part of API round trip, so these are overlapping timings. User experience excludes capture/corner editing, human decisions, artwork loading, and feedback submission.
| Summed work across 1–2 attempts | n | Min (ms) | Max (ms) | Mean (ms) | Median (ms) |
|---|---|---|---|---|---|
| Android Client Hash Processing | 138 | 182.330 | 544.566 | 279.296 | 241.402 |
| Postgres Hash Search | 138 | 43.050 | 129.532 | 57.261 | 46.517 |
| API Round Trip | 138 | 178.139 | 620.557 | 265.482 | 214.896 |
| User Experience | 138 | 373.495 | 1165.122 | 544.778 | 457.060 |
These totals sum measured work across each inferred comic trial; they do not include time spent recapturing or making decisions.
These 11 eligible trials failed twice. Later user confirmation identifies 9 of them; 2 remain unidentified. Identities were not recorded in the original failure notes. Catalog presence at scan time is not established by this identity confirmation.
| Trial | Attempt indices | Comic (when confirmed) | Identity source |
|---|---|---|---|
| 6 | 6,7 | Absolute Wonder Woman (2024) #6 | User confirmed in chat on 2026-11-11 |
| 38 | 45,46 | Unknown | not recorded |
| 42 | 51,52 | Unknown | not recorded |
| 55 | 65,66 | Absolute Green Arrow (2026) #3 | User confirmed in chat on 2026-11-11 |
| 58 | 69,70 | Buffy the Vampire Slayer Season Eight (2007) #1 | User confirmed in chat on 2026-11-11 |
| 60 | 72,73 | Buffy the Vampire Slayer Season Eight (2007) #3 | User confirmed in chat on 2026-11-11 |
| 61 | 74,75 | Buffy the Vampire Slayer Season Eight (2007) #4 | User confirmed in chat on 2026-11-11 |
| 86 | 106,107 | Fables (2022) #158 | User confirmed in chat on 2026-11-11 |
| 87 | 108,109 | Fables (2022) #159 | User confirmed in chat on 2026-11-11 |
| 93 | 115,116 | Guardians of the Galaxy (2023) #1 | User confirmed in chat on 2026-11-11 |
| 109 | 136,137 | Monstress (2015) #37 | User confirmed in chat on 2026-11-11 |
Trial 7 — Absolute Wonder Woman #12, unrepresented variant. The user confirmed this cover is not in Metron and requested its exclusion. Its original attempts 8 and 9 are omitted from outcome percentages, rank frequencies, per-attempt processing times, and per-comic processing totals. The raw notes remain unchanged. The eligible analysis therefore contains 138 comics and 167 attempts, from an archive of 139 trials and 169 notes. This is a coverage-based exclusion, not a removed timing outlier.
Exclusion rationale · All trials with inclusion flags · All attempts with inclusion flags
Retry pairing is based on chronology and the supplied policy, not similarity or guessed titles. One pair changed by 20 hash bits and is flagged in the audit for review, without changing its grouping. This single-session result should not be treated as a general population accuracy estimate.
Retry grouping is reconstructed. Trials are reconstructed from chronological records and the stated policy. Failure notes contain no intended comic/session ID. Later user confirmations identify 9 included failed comics; 2 remain unidentified. Assumes every attempt was recorded and the policy was followed without exceptions. Original records are preserved; the pairing audit makes every grouping reviewable.
All attempts · Comic trials · Retry audit · Rank data · Summary JSON · Methodology
Original notes remain unchanged at the source. Local Metron and PostgreSQL remain stopped.
These are elapsed wall-clock measurements, not CPU-only measurements. Waiting, I/O, scheduling delays, and garbage collection inside a measurement window are included. The processing order is:
Android client hash processing → API request → Postgres hash search → API response. API round trip surrounds the request, database work, and response.
Starts on Android immediately before dispatching hash work to Dispatchers.Default. Ends immediately after the hexadecimal hash string is produced, before bitmap recycling and returning the finished result to the UI thread.
Includes waiting for the background task to start; reading the corrected JPEG's dimensions; reading and decoding the JPEG into an ARGB bitmap; allocating/copying the pixel array; converting to grayscale; Lanczos resizing to 32 × 32; computing the DCT; selecting the 8 × 8 coefficients; calculating the median; and forming the 64-bit hexadecimal hash. First-use hash-object initialization, if any, is inside this window as well.
Excludes camera capture, corner adjustment, perspective correction, preview, user confirmation, bitmap recycling after the timestamp, and dispatch back to the UI thread after the hash completes.
Starts when PostgreSQL evaluates the materialized start-clock expression before scanning candidate hashes. Ends when the outer SQL result samples the elapsed clock after ranking and assembling the match records. This is the instrumented matching portion of query execution, not the complete database request duration.
Includes reading valid issue and variant hashes; XOR/popcount Hamming distance calculations; taking each comic's closest cover; ranking and selecting the top eight distinct comics; retrieving winning cover hashes, URLs, and variant IDs; counting hashes checked; SQL result assembly; and instrumentation overhead.
Excludes SQL parsing/planning, opening a database connection, transport between Django and PostgreSQL, authentication, the subsequent query for descriptive metadata of the eight comics, and Django's response serialization.
Starts immediately before dispatching the API operation to Dispatchers.IO. Ends after it returns to the UI thread.
Includes client dispatch/queue waits; constructing and validating the request and headers; acquiring a connection; DNS, TCP setup, and TLS negotiation when needed; request and response network travel; server request handling, authentication, throttling, validation, database matching, the separate comic-metadata query, and response serialization; receiving the complete JSON body; Android JSON parsing and basic result-shape validation; response cleanup; and returning to the UI thread. Connection reuse may avoid DNS/connection/TLS setup on a particular request.
Excludes building result cards, downloading/displaying cover artwork, human match selection, and feedback submission.
Derived sum: Android client hash processing + API round trip.
This is not one continuously running timer and is not the complete human scan experience. The gap between its component timers is excluded: bitmap recycling, returning from the hash task, and updating the “Searching Metron…” UI. It also excludes capture, corner adjustment/perspective correction, preview/confirmation, human decisions, result rendering, artwork loading, and feedback submission.
Postgres hash search is already included in API round trip. Do not add it again. Per-comic processing-work totals sum these measurements over the one or two attempts reconstructed for that comic, without adding the human retry delay.