Development record
PII rules domain cannot fire on the incident that most needs it: recall keywords (secret, token, credential, pii, redact, hostname, email) miss network/infra contexts (tailscale, vpn, ip, firewall, network, reachability), and the injected rule text carries no never-commit-hostnames-IPs-live-data rule at all — that rule exists only in the parent CLAUDE.md privacy section. An agent writing up a Tailscale investigation gets zero PII injection and zero relevant rule text even if it did.
issueresolvedmajoriss-156
PII rules domain cannot fire on the incident that most needs it: recall keywords (secret, token, credential, pii, redact, hostname, email) miss network/infra contexts (tailscale, vpn, ip, firewall, network, reachability), and the injected rule text carries no never-commit-hostnames-IPs-live-data rule at all — that rule exists only in the parent CLAUDE.md privacy section. An agent writing up a Tailscale investigation gets zero PII injection and zero relevant rule text even if it did.
Frontmatter
| id | iss-156 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | major |
.abcd/work/issues/resolved/iss-156-pii-domain-misses-network-contexts-and.md
open on GitHub ↗ · commit history ↗
mentions3
- dcn-26073000000000012026-07-30 — iss-156: the PII rules domain gains the network/infra recall vocabulary the leak incident needed (`ip`, `ips`, `ipv4`, `ipv6`, `vpn`, `tailscale`, `tailnet`, `wireguard`, `firewall`, `network`, `reachability`, `reachable`, `dns`, `ssh`, `subnet`, plus the `mac address` alias) and one new rule line forbidding committed hostnames, IP/MAC addresses, and other live network identifiers: redact or omit, and use a reserved documentation value (RFC 5737/3849/2606/7042, the same citation set as the scanner and the audit privacy-hygiene rule) only where an illustrative example is needed — the rule does not tell an agent to substitute a plausible fake identifier into a factual write-up. Data-only: recall matching is already word-bounded (the prompt is normalised to space-separated tokens and a single-token term must match a whole token), so the bare `ip` keyword is safe and no matcher change was needed — a substring matcher would have forced a phrase form like `ip address`. Placement is dictated by the matcher, not by word count (`aliases` also holds single words such as `pr` and `diataxis`): a term goes in `recall` when it should hit as a standalone token, and in `aliases` when only the multi-word phrase is safe — `mac` alone would recall on an Apple Mac, so `mac address` is a phrase alias and matches via the stemmed-phrase path. The stemmer's own limits force the explicit variants: a three-character floor keeps `ips` from stemming to `ip`, and `-ability` is not bridged to `-able`, so `reachable` is its own entry. Accepted trade: broad tokens like `network` over-fire on prompts with no privacy stake, which is benign here — the injection is four short rule lines, deduped once per session. The never-commit-identifiers rule previously existed only in a parent CLAUDE.md privacy section, so the loader could never inject it; the 2026-07-29 reserved-identifier principle now has a rule-text home the hook actually emits.
- iss-174mergeDomain replaces a domain's recall and rules arrays wholesale, so a repo that overrides either array silently withholds every later security upgrade to the bundled defaults: internal/core/rules/rules.go copies the override array over the base one instead of unioning, with no schema bump and no notice, so a repo that pinned PII recall or PII rules before iss-156 keeps the old set and never sees the new network keywords or the never-commit-network-identifiers rule line. Per-field merge is the documented and wanted behaviour for state, but for security-bearing arrays the quiet outcome is a stale ruleset that looks current. Options to weigh: union rather than replace for recall/aliases (additive, no loss), a distinct replace-vs-extend marker in the override, or at minimum a loud diagnostic in abcd rules naming which bundled entries an override is withholding. First activated by the iss-156 PII upgrade, which is why it is captured now. Prior disposition to weigh when triaging: iss-66 (resolved, rules-loader trust boundary) document-accepted the adjacent risk that an override can weaken a default guardrail domain (its P15); this entry is the distinct case of an override silently withholding later upgrades rather than deliberately silencing a domain.
- iss-175abcd capture writes ledger files without a trailing newline: 170 of 174 files under .abcd/work/issues/ lack one, including entries the verb writes today. The writer is the source; individual files fixed by hand only mask it. Found while fixing the iss-156 entry's EOF during review follow-up.