compliant-logging — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited compliant-logging (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.
log.audit / hygiene.no-secrets) — authoring-time guidanceScope: this skill helps you implement the audit-logging and log-hygiene controls in code. It does not make a system "compliant" — certification is the auditor's call. It makes the code satisfy the technical control and produces machine-detectable evidence of that.
>
Framework-neutral by design. Code emits a stable Throughproof control key (log.audit), not a framework id. The crosswalk (compliance/control-keys.yaml+compliance/frameworks/*.yaml) resolves that key to every framework at once — SOC 2CC7.2, ISO 27001A.8.15, PCI-DSS v4Req 10.2, HIPAA164.312(b). Write the event once; it counts as evidence for all of them. Legacy events that still emitcontrol: "CC7.2"keep working — the verifier aliases them tolog.audit.
Apply this skill whenever the code under edit performs a sensitive action:
permission change, impersonation, SSO/account link.
financial, health, or credential data (users, payments, PHI, API keys, billing).
destructive jobs, access grants.
If the action is not in this list (ordinary reads, non-sensitive CRUD, health checks), do not add an audit event — over-logging is itself a finding and creates noise.
Every sensitive action MUST emit one structured audit event through the project's existing logger. The shape below is the adoption marker: keep the field names and the "audit": true flag stable so the event is machine-detectable and maps deterministically to the control.
Required fields:
| field | meaning |
|---|---|
audit | always true — the stable marker that tags this as an audit event |
control | the Throughproof control key — "log.audit" for an audit event (maps to SOC 2 CC7.2, ISO 27001 A.8.15, PCI-DSS v4 Req 10.2, HIPAA 164.312(b) via the crosswalk) |
action | stable verb.noun, e.g. "user.delete", "role.grant", "data.export" |
actor | id of who did it (user id / service id / "system") — never the name/email |
target | id of the affected resource (and its type), e.g. { "type": "user", "id": "u_123" } |
outcome | "success" or "failure" — log both paths (failures are the detection signal) |
ts | ISO-8601 UTC timestamp |
correlation_id | request/trace id to tie the event to a request |
reason | present on "failure" — short, non-sensitive cause (e.g. "insufficient_role") |
Rules:
— they are how brute-force and privilege-escalation get detected.
surface logging failures to your monitoring.
hygiene.no-secrets)When constructing any log line (not just audit events):
raw request/response bodies, Authorization headers.
label is unavoidable, mask it (a***@example.com, last-4 only).
non-sensitive fields instead.
actor/target. Add correlation_id from the request context.# user deletion endpoint — sensitive: data.delete on a user record
def delete_user(actor_id: str, user_id: str, correlation_id: str) -> None:
try:
repo.delete_user(user_id)
except Exception as e:
logger.info(
"audit",
audit=True, control="log.audit", action="user.delete",
actor=actor_id, target={"type": "user", "id": user_id},
outcome="failure", reason=type(e).__name__,
ts=datetime.now(timezone.utc).isoformat(), correlation_id=correlation_id,
)
raise
logger.info(
"audit",
audit=True, control="log.audit", action="user.delete",
actor=actor_id, target={"type": "user", "id": user_id},
outcome="success",
ts=datetime.now(timezone.utc).isoformat(), correlation_id=correlation_id,
)// role grant — sensitive: authorization change
async function grantRole(actorId: string, userId: string, role: string, correlationId: string) {
const base = {
audit: true, control: "log.audit", action: "role.grant",
actor: actorId, target: { type: "user", id: userId },
ts: new Date().toISOString(), correlationId,
};
try {
await db.grantRole(userId, role);
logger.info({ ...base, outcome: "success" });
} catch (err) {
logger.info({ ...base, outcome: "failure", reason: "grant_failed" });
throw err;
}
}logger.info(`User ${user.email} logged in with ${password}`); // ❌ PII + secret in log
logger.debug(req.body); // ❌ blanket body dump
// (no failure-path logging on a denied access) // ❌ missing detection signal
await audit(...).catch(() => {}); // ❌ silently swallowedThe stable audit:true + control + action + outcome shape is what lets a deterministic verifier later trace each sensitive code path to the control it satisfies and export audit-ready evidence. Keep it consistent across the codebase — consistency is the evidence.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.