response to the audit Β· peterlodri-sec Β· data card reconciliation
- The finding is accepted, and it is worse than a rule miss
You are right on every count. 42.02% of the published 8,877,577 phone hits is a single row of one file: DynSP/model/moduleKwNoMap-b15-0-18-dynetmodel.bin β a DyNet weight archive, 41.2 MB, 3,730,704 sentinels, 95.80% of its numeric tokens now [PHONE]. The card says 3,249,514; the file carries 3,730,726; the file has not moved since the 08-18 upload. One of the two is a checkpoint behind the other β and the file is the source of truth.
This is not a false positive in the usual sense. The classifier fired on model weights because the weights are bare numeric runs, and the scrubber's job is to eat bare numeric runs that look like phone numbers. The rule did exactly what it was told. The failure is upstream: the file class was never defined, so the token rules ran on a binary weight archive as if it were a text corpus.
- Why the column exemption cannot reach it
column_is_numeric splits on a delimiter and scores per column. The DyNet archive is one line of 7,791,029 whitespace tokens β one row, millions of columns, one value each. There is no ratio to take. file_is_structural was built for the PMR shape (tab-separated LD matrices, Z-score vectors) and it works β PMR matches the card exactly, 261,575 = 261,575. The exemption was written for the case it can see. The weight archive is the case it cannot.
The shape header tells the whole story: 100 37371 [PHONE] 32568 is a DyNet lookup-parameter dimension. The scrubber ate a dimension, not just a value. The file is not restorable from its stored row β the sentinel kept no surviving half, not even sign-and-zero. Re-emit is a re-fetch of the original, and the card says 8,043 files.
- The fix β a file-class rule, before the token rules
The correct outcome for the weight archive is that the token rules never see it. Add a file-class gate:
rule signal action
file_is_weight_archive Boost serialization header (serialization::archive), dynet::LookupParameterStorage, or: whitespace-token census with numeric density > 90% and sentinel density > 30% on a single-line file whole-file structural exemption β no token scrubbing
This is the same principle as file_is_structural, but keyed on the shape that actually broke the headline number: a single-line, whitespace-token, numeric-dense archive. Model weights are not PII, and scrubbing them destroys the artifact. The exemption is not "unscrubbed" β it is "not PII-bearing by construction", the same claim the card already makes for structural files.
- The NANP question β what catches the phone column once a separator is required
Rule 2 ("leading + or a separator required") has to pick a side between the weight matrix and 6637737629, the 300-row NANP column. The answer is not to weaken rule 2. The answer is a second, shape-validated rule that fires on bare digit runs only when they are NANP-shaped:
rule match why it does not hit weights
namp_bare_run bare run of exactly 10 digits with NXX-NXX-XXXX ranges (N = 2β9, area-code and exchange validated), or 11 digits with leading 1, or 7-digit local with NXX exchange weight tokens are arbitrary-length numeric runs; the overwhelming majority are not 10/11/7-digit NANP-shaped, so they fail the length-and-range check and are left alone
The two rules compose: rule 2 (separator-required) stays aggressive and safe for general text; namp_bare_run catches the separator-less phone column with a length-and-range gate that the weight matrix cannot pass. The tension you identified dissolves because the two objects are distinguishable at the token level after all β by shape, not by separator.
And with the file-class gate from section 3 in place, the weight archive never reaches either rule, so the NANP rule can be as aggressive as the data demands without collateral.
- Action plan
Add file_is_weight_archive to the classifier (header + census signals), before token rules.
Add namp_bare_run (NANP shape-validated bare-run rule) for the separator-less phone column.
Re-fetch DynSP (both rows, 3,730,726 + 1,410,631 chars) and PMR from source; re-publish; update the card to the true counts.
Re-run flat to completion (7,500 files); confirm the 42% share drops to 0 and the headline number reflects only genuine text-corpus hits.
Record the class in the card so a weight archive can never again be token-scrubbed.
The question has changed shape β and so has the answer. The classifier was not wrong to fire; it was wrong to be pointed at a file class it was never given a name for. Name the class, and the 42% becomes a footnote instead of a headline.
draft Β· for review Β· - p
the constellation Β· 0 + 1 Β· fine touch from within Β· vaked.dev