adding-personhog-rpc — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited adding-personhog-rpc (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.
This skill walks through adding a new RPC end-to-end: proto definition, code generation, Rust implementation, and client updates.
Personhog serves person, distinct ID, group, group type mapping, cohort membership, and feature flag hash key override data. If the data being accessed doesn't live in one of these tables, this RPC doesn't belong in personhog:
| Table | Data category | Routing |
|---|---|---|
posthog_person | PersonData | Reads: replica (eventual) or leader (strong). Writes: leader |
posthog_persondistinctid | PersonData | Same as person |
posthog_group | NonPersonData | All ops: replica |
posthog_grouptypemapping | NonPersonData | All ops: replica |
posthog_cohortpeople | NonPersonData | All ops: replica |
posthog_featureflaghashkeyoverride | NonPersonData | All ops: replica |
posthog_personoverride | PersonData | Reads/writes follow person routing |
posthog_personlessdistinctid | PersonData | Same as person |
If the table is not listed above, stop — this data should not go through personhog.
Before writing any proto, figure out the SQL query you need. Then validate it against the available indexes — see references/database-indexes.md.
Key questions:
All proto files live in proto/personhog/. See references/proto-conventions.md for message conventions and a worked example.
proto/personhog/types/v1/<domain>.proto (person.proto, group.proto, cohort.proto, feature_flag.proto, or common.proto)proto/personhog/service/v1/service.proto (the public API clients call)proto/personhog/replica/v1/replica.proto (the internal API the router delegates to)proto/personhog/leader/v1/leader.proto (only if this is a person-data write routed to leader)The service and replica protos must both declare the RPC with identical signature. The router delegates from service → replica (or leader) transparently.
bin/generate_personhog_proto.shThen update three files:
posthog/personhog_client/proto/__init__.py — add re-exports for new request/response message typesposthog/personhog_client/client.py — add a wrapper method matching the pattern of existing methodsposthog/personhog_client/fake_client.py — implement the method for test usecd nodejs && pnpm run generate:personhog-protoThen update:
nodejs/src/ingestion/personhog/client.ts — add a wrapper method matching the pattern of existing methodsnodejs/src/ingestion/personhog/client.test.ts — add a default stub to SERVICE_DEFAULTS for the new RPCNo generation step needed — tonic regenerates on cargo build. But you must implement the RPC (next step), or the build will fail.
The compiler guides you — once the proto is defined, cargo build errors tell you exactly which trait methods are missing.
rust/personhog-replica/src/storage/traits/<domain>.rsrust/personhog-replica/src/storage/postgres/<domain>.rssqlx::query_as! or sqlx::query! macrosDB_QUERY_DURATION and DB_ROWS_RETURNED metricsself.replica_pool for reads, self.primary_pool for writesrust/personhog-replica/tests/storage_tests.rsrust/personhog-replica/src/service/mod.rsStatus codesrust/personhog-replica/tests/service_tests.rsrust/personhog-router/src/router/mod.rsroute_request function (imported from routing.rs) with the correct DataCategory and OperationTypecall_backend! macro for instrumentationrust/personhog-router/src/service/mod.rsroute_request! macro (defined at the top of this file) to delegate to the routerrust/personhog-router/src/backend/mod.rs and implement in replica.rsrust/personhog-router/tests/Use rstest parameterized tests where multiple variations of the same behavior are being tested.
cargo build -p personhog-proto
cargo build -p personhog-replica
cargo build -p personhog-router
cargo test -p personhog-replica
cargo test -p personhog-routertypes/v1/<domain>.protoservice.proto and replica.proto (and leader.proto if needed)proto/__init__.py updated, client.py method added, fake_client.py updatedclient.test.ts SERVICE_DEFAULTS updatedcargo build and cargo test pass for all three crates~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.