agents.md update for kcov/pii/env vars
This commit is contained in:
parent
143395e7ce
commit
8de28d73bc
1 changed files with 62 additions and 4 deletions
66
AGENTS.md
66
AGENTS.md
|
|
@ -372,10 +372,46 @@ local_pii_tokens=$(awk -F: '...' "$ZFIN_HOME/accounts.srf" ...)
|
||||||
grep -rn -E "$local_pii_tokens" src/ | grep -v ie_data.csv
|
grep -rn -E "$local_pii_tokens" src/ | grep -v ie_data.csv
|
||||||
```
|
```
|
||||||
|
|
||||||
The grep should always return zero non-`ie_data.csv` hits before
|
The grep is a **starting point, not a pass/fail gate** - it produces
|
||||||
committing. The `ie_data.csv` exclusion is because the Shiller
|
false positives that must be triaged rather than dismissed wholesale.
|
||||||
dataset contains coincidental numeric matches in historical-year
|
Two known classes:
|
||||||
fields that aren't PII.
|
|
||||||
|
- **Short numeric tokens.** A 3- or 4-digit account number matches
|
||||||
|
coincidentally inside Unix timestamps, trade volumes, hex color
|
||||||
|
literals, fake git SHAs, dollar amounts in CSV fixtures, and even
|
||||||
|
file line numbers. The `ie_data.csv` exclusion exists for the same
|
||||||
|
reason (Shiller's historical-year fields).
|
||||||
|
- **Generic account-type names.** An account literally named for an
|
||||||
|
IRS category (`Roth IRA`, `Inherited IRA`, `HSA`) matches inside the
|
||||||
|
approved placeholder vocabulary above - e.g. the real name
|
||||||
|
`Inherited IRA` is a substring of the sanctioned fixture value
|
||||||
|
`Sample Inherited IRA`.
|
||||||
|
|
||||||
|
So the rule is: **inspect the context of every hit**, and confirm each
|
||||||
|
is either coincidental or a generic category before dismissing it. A
|
||||||
|
hit whose surrounding context is a real-looking account name, a
|
||||||
|
composite identifier, or a value that could only have come from the
|
||||||
|
user's data is PII and must be fixed in the same change.
|
||||||
|
|
||||||
|
When reporting the result, redact: print the matching lines with the
|
||||||
|
sensitive token substituted out, or report only `file:line`. Do not
|
||||||
|
paste raw matches into a transcript.
|
||||||
|
|
||||||
|
**`ZFIN_HOME` does NOT isolate you for smoke tests.** Pointing
|
||||||
|
`ZFIN_HOME` at a scratch directory does not sandbox the whole tool:
|
||||||
|
`ZFIN_AUDIT_FILES` is read independently (`audit/hygiene.zig`) and
|
||||||
|
points at wherever real brokerage exports get downloaded. A flagless
|
||||||
|
`zfin audit` will discover, parse, and print **real account numbers and
|
||||||
|
balances** from that directory regardless of `ZFIN_HOME`. This has
|
||||||
|
already caused one leak into a session transcript.
|
||||||
|
|
||||||
|
So when smoke-testing against scratch data:
|
||||||
|
|
||||||
|
- Run under `env -u ZFIN_AUDIT_FILES` (and unset any other
|
||||||
|
path-carrying `ZFIN_*` var the command consumes).
|
||||||
|
- Bound the output. Never pipe a whole command's output through a broad
|
||||||
|
`grep`/`head` - `sed -n '/Section Header/,/^$/p'` the one section
|
||||||
|
under test, so an unexpected section can't spill into the transcript.
|
||||||
|
|
||||||
If you're uncertain whether something is PII, **ask before
|
If you're uncertain whether something is PII, **ask before
|
||||||
committing.** PII can be surgically removed from a working
|
committing.** PII can be surgically removed from a working
|
||||||
|
|
@ -592,6 +628,28 @@ Each file's report shows red lines (uncovered) and green lines
|
||||||
(covered). For a quick numeric breakdown by file, the kcov JSON
|
(covered). For a quick numeric breakdown by file, the kcov JSON
|
||||||
output under `coverage/kcov-merged/coverage.json` is greppable.
|
output under `coverage/kcov-merged/coverage.json` is greppable.
|
||||||
|
|
||||||
|
**Two traps if you script against the coverage output.** Both have
|
||||||
|
already produced a confidently-wrong "fully covered" claim:
|
||||||
|
|
||||||
|
1. **Per-line data lives in the `.js` files, not the `.html`.** Each
|
||||||
|
`coverage/<binary>/<file>.<hash>.html` has only a handful of
|
||||||
|
`class="lineNum"` nodes; the real per-line records are in the
|
||||||
|
sibling `.js` as
|
||||||
|
`{"lineNum":" 42","line":"...","class":"lineCov|lineNoCov|linePartCov"}`.
|
||||||
|
A scraper pointed at the HTML matches **zero** lines, so
|
||||||
|
"0 uncovered" silently means "0 tracked." Always assert that the
|
||||||
|
tracked-line count is non-zero before trusting a coverage verdict,
|
||||||
|
and sanity-check the scraper against a line you know is uncovered.
|
||||||
|
2. **`coverage/` accumulates stale per-binary directories across
|
||||||
|
runs.** Old reports for a file you just edited stay on disk with the
|
||||||
|
previous source text. Filter to reports whose embedded `"line"`
|
||||||
|
content matches the current file (grep for a string you just added)
|
||||||
|
before unioning them.
|
||||||
|
|
||||||
|
Note that per-file numbers are a union across binaries: the same source
|
||||||
|
file appears in several `coverage/<binary>/` directories, and a line
|
||||||
|
covered by any of them counts.
|
||||||
|
|
||||||
**Common reasons coverage looks lower than expected:**
|
**Common reasons coverage looks lower than expected:**
|
||||||
|
|
||||||
- A new `.zig` file's tests aren't being discovered. Check the
|
- A new `.zig` file's tests aren't being discovered. Check the
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue