automating-contacts — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited automating-contacts (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
automating-mac-apps skill (PyXA Installation section).name(), emails()), write with assignments.push()add ... to command or .people.push; handle duplicates defensively1) Inspect the Contacts dictionary in Script Editor (JavaScript view). 2) Prototype minimal AppleScript to validate verbs; port to JXA with specifier reads/writes. 3) Use .whose for coarse filtering; fall back to hybrid (coarse filter + JS refine) when needed. 4) Create records with proxy + make, then assign primitives and push multi-values; Contacts.save() to persist. 5) Verify persistence: check person.id() exists after save; handle TCC permission errors. 6) Manage groups after person creation; guard against duplicate membership with existence checks. 7) For photos or broken bridges, use ObjC/clipboard fallback; for heavy queries, batch read or pre-filter. 8) Test operations: run→check results→fix errors in iterative loop.
.id() checksconst Contacts = Application("Contacts");
const email = "[email protected]";
try {
const existing = Contacts.people.whose({ emails: { value: { _equals: email } } })();
const person = existing.length ? existing[0] : Contacts.Person().make();
person.firstName = "Ada";
person.lastName = "Lovelace";
// Handle multi-value email
const work = Contacts.Email({ label: "Work", value: email });
person.emails.push(work);
Contacts.save();
// Handle groups with error checking
let grp;
try {
grp = Contacts.groups.byName("VIP");
grp.name(); // Verify exists
} catch (e) {
grp = Contacts.Group().make();
grp.name = "VIP";
}
Contacts.add(person, { to: grp });
Contacts.save();
console.log("Contact upserted successfully");
} catch (error) {
console.error("Contacts operation failed:", error);
}automating-contacts/references/contacts-basics.mdautomating-contacts/references/contacts-recipes.mdautomating-contacts/references/contacts-advanced.mdautomating-contacts/references/contacts-dictionary.mdautomating-contacts/references/contacts-pyxa-api-reference.md~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.