aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
diff options
context:
space:
mode:
Diffstat (limited to 'AGENTS.md')
-rw-r--r--AGENTS.md37
1 files changed, 37 insertions, 0 deletions
diff --git a/AGENTS.md b/AGENTS.md
index a8741f4..e627e50 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -332,6 +332,27 @@ failures: AFRINIC and `nic.cz` publish a handle but no `abuse` role, and
`example.museum` has no RDAP server for the TLD. The IANA bootstrap held 5 IPv4
services, 5 IPv6 and 590 DNS.
+`report` was swept the same way on 2026-09-10, after `parse.py` changed.
+Sweep A: 92 messages, 1685 indicators, 92 bodies generated, 0 crashes, 0 empty
+parses, 475 query targets. No address from a raw source reached the IOC output,
+and no recipient address reached a generated body.
+
+That sweep measured the limit the spec accepts rather than finding a defect.
+The `Subject` header is published verbatim, and 14 of the 92 messages carried
+the recipient's LOCAL PART inside it, because the kit personalises the lure.
+None carried it in the `From` display name. The envelope recipient was cut
+from the boundary `Received` line in every message. `tests/fixtures/`
+`personalised-subject.eml` pins all three behaviours, including the accepted
+one, so that number cannot change silently. Re-measure it when the whitelist
+changes.
+
+Sweep B on the same date: 12 of 12 targets completed, 0 failures, all five
+RIRs returning a parseable jCard, IPv6 live, the label walk reducing
+`www.ripe.net` and `a.b.c.example.org`, and `nic.uk` resolving the multi-part
+suffix. Three non-resolutions were correct: AFRINIC and `nic.cz` publish no
+abuse role, and `.museum` has no RDAP server. Bootstrap held 5 IPv4 services,
+5 IPv6 and 590 DNS.
+
**Sweep B must never draw its targets from the user's own spam corpus.** A query
tells a registrar which of their customers someone is investigating, and for a
phishing domain that registrar may be the attacker's own. Pick targets that are
@@ -359,6 +380,12 @@ settles only what they share.
touching RDAP, the bootstrap cache, or anything that issues a query. The
fourth property it introduced is stated above in its own right; the spec
carries the reasoning behind the rest of the module.
+- `docs/specs/2026-09-09-report.md`, the `report` spec. Read it before
+ changing the publishable-header whitelist, the freeze rule, or what a
+ report body contains. It records what is deliberately NOT filtered and
+ why, which is the first thing to read if a sweep result looks like a leak.
+- `docs/plans/2026-09-09-report.md`, the plan `report` was built from.
+ Historical in the same way, and it records the defect found in each task.
- `docs/plans/2026-09-08-parse.md`, the plan `init` and `parse` were built
from. Historical once built, but it records why each test exists.
- `docs/plans/2026-09-09-contacts.md`, the plan `contacts` and `rdap` were
@@ -367,3 +394,13 @@ settles only what they share.
- `docs/BACKLOG.md`, open items, with the cause verified in the code rather
than assumed. Read it before starting work; add to it rather than fixing
something unasked.
+
+The author also keeps an idea note OUTSIDE this repository, in his Obsidian
+vault at `~/Documents/Obsidian/note/notes on abusectl.md`. It is an inbox,
+written as things occur to him while developing or using the tool, split into
+done and not-done and in no particular order. **The note is the inbox, the
+backlog is the tracked list.** Reconcile them in both directions when starting
+substantial work: an idea in the note that is real work earns a backlog entry
+with its cause verified in the code, and a backlog item he has marked done in
+the note can be closed. Do not edit the note unasked; it is his, not the
+repository's.