What agents should know before contributing
PostHog/posthog
:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.
Read by Bluet from 4 files written for agents and 300 merged pull requests on 2026-09-25. Not reviewed by the maintainers.
Rules its files tell agents (15)
- .cursorrules
mustNever use flox activate in interactive sessions (it hangs)
- CLAUDE.md
mustNever mention internal-only systems, private incidents, customer data, Slack thread contents, unreleased roadm…
Never mention internal-only systems, private incidents, customer data, Slack thread contents, unreleased roadmap details, or security-sensitive implementation details. Slack thread links and channel references are fine to include — they sit behind PostHog auth and are useful as origin context — but do not quote or paraphrase what was said in the thread.
- CLAUDE.md
mustNever force-push a branch that is in the merge queue — it removes the PR from the queue.
Never force-push a branch that is in the merge queue — it removes the PR from the queue. That includes restacking a stack whose base is queued.
- CLAUDE.md
mustNever gh stack merge — it lands the chain through GitHub's API, outside the queue.
GitHub's native stacked PRs are enabled here. Use the gh stack CLI and /stacking-prs rather than hand-managing branch chains. Keep stacks shallow and merge the base before extending: restacking force-pushes every branch, and a deep stack pushed at once can exceed GitHub's dispatch cap and fail unrelated runs with it. Never gh stack merge — it lands the chain through GitHub's API, outside the queue.
- CLAUDE.md
mustNever run gh pr merge or click the GitHub merge button — both are blocked by branch ruleset.
All merges into master go through the Trunk merge queue. Never run gh pr merge or click the GitHub merge button — both are blocked by branch ruleset.
- CLAUDE.md
mustNever bypass the pre-push hooks (--no-verify).
Never bypass the pre-push hooks (--no-verify). They run hogli ci:preflight --strict and a merge-queue guard. When one blocks you, fix what it reports — /running-ci-preflight has the loop, /merging-prs explains the queue guard.
- CLAUDE.md
mustNEVER put sensitive information in a PR description or comment.
Required: Read .github/pull_request_template.md and use its exact section structure. Do not invent a different format. Invoke /writing-pr-descriptions before writing the body — it carries the shape rules. Always fill the ## 🤖 Agent context section, including the exact model that wrote the code. NEVER put sensitive information in a PR description or comment. A user may share sensitive data in an agent session; none of it belongs on the PR.
- CLAUDE.md
mustNever use flox activate in interactive sessions (it hangs if you try)
- .cursorrules
shouldIf I ask for adjustments to code I have provided you, do not repeat all of my code unnecessarily.
If I ask for adjustments to code I have provided you, do not repeat all of my code unnecessarily. Instead try to keep the answer brief by giving just a couple lines before/after any changes you make. Multiple code blocks are ok.
- .cursorrules
shouldif unsure, do not remove the comment.
Please respect all code comments, they're usually there for a reason. Remove them ONLY if they're completely irrelevant after a code change. if unsure, do not remove the comment.
- CLAUDE.md
shouldDo not claim a provenance you have not checked.
Do not claim a provenance you have not checked. "Written fresh" in a commit message is a factual claim a reviewer will rely on. If you are unsure, compare your text against the source: any shared run of ~40 characters or more means derived, not fresh.
- .cursorrules
shouldDO NOT GIVE ME HIGH LEVEL SHIT, IF I ASK FOR FIX OR EXPLANATION, I WANT ACTUAL CODE OR EXPLANATION!
DO NOT GIVE ME HIGH LEVEL SHIT, IF I ASK FOR FIX OR EXPLANATION, I WANT ACTUAL CODE OR EXPLANATION! I DON'T WANT "Here's how you can blablabla"
- CLAUDE.md
shouldDo not infer that approval from requests to prepare a PR, move it toward merge, make it ready, monitor it, or…
Agents must not enqueue, merge, re-enqueue, or otherwise cause a PR to land without explicit user approval in the current conversation for the identified PR or stack. Do not infer that approval from requests to prepare a PR, move it toward merge, make it ready, monitor it, or resolve its blockers. Agents may inspect status, fix code and CI, request a stamphog review when a required approval is missing (MCP first, label fallback, see /merging-prs), and report that a PR is ready — then wait for a direct instruction.
- CLAUDE.md
shouldDo not run it from cloud tasks or agent-server sandboxes; the command is a no-op there.
Dev experience feedback: hogli devex:feedback "<message>" sends feedback about repo tooling — hogli, the dev stack, tests, CI, migrations, this setup — straight to the devex team as a hogli_feedback event (add -c bug|idea|praise|question). Local agents must use it too: when a hogli command or local dev workflow is broken, slow, or confusing, run it — e.g. hogli devex:feedback -c bug "migrations:run failed with <error>". Do not run it from cloud tasks or agent-server sandboxes; the command is a no-op there.
- CLAUDE.md
shouldExisting related docs, PR checklists, and general docs requirements do not authorize one.
A new docs/** file requires a person to request that specific document in the current conversation. Existing related docs, PR checklists, and general docs requirements do not authorize one. Put PR-specific context in the PR description.
Decisions its pull requests settled (40)
- #105091validate reference targets before a label activates a version
- #105098read model prices from the generated catalog
- #105114explain a timed-out sync instead of showing Temporal's wording
- #105116keep the schedule on for an automatic widen re-sync
- #105128refuse an event trigger that names no event when the flow would run
- #105130load the support side panel on demand
- #105139run cdc snapshots through the buffer
- #105140point the dev trace spans MV at writable_trace_spans
- #105154bound the notification feed history window
- #105157purge expired ML key rows at most once a minute
- #105231let read-only tokens see the alert-simulate MCP tool
- #105289stop anchoring base-ui in the shared chunk
- #105292enroll accounts on a person's role edit
- #105310stop reviewhog fix commits on queued and stacked prs
- #105311hold the pr follow-up loop while trunk tests the pr
- #105317report the survivor count instead of blocking on it
- #105351add repositories from an installation snapshot
- #105396only let a client revoke tokens issued to it
- #105407pluggable-memory golden for task boxes (bake + flag)
- #105409report the real outcome when an AI detector check fails
- #105434stream bing ads reports instead of holding them in memory
- #105460add tombstone queue insert and read, list, ack RPCs
- #105531serve stable chunk names behind an opt-in
- #105551evict stale connections before async activities run
- #105601give broadcasts its own page
- #105623make team extension creation at team creation opt-in
- #105640resolve the person tombstone queue in the deletion sweep
- #105663retry idempotent api reads that lose the connection
- #105670sort unordered insight list on an indexed column
- #105682configure the enabled-scout cap per project
- #105683read the inbox actionability cache instead of artefact json
- #105687match warehouse row filters against the synced row
- #105690honor 0 decimal places in data viz formatting
- #105701read the 1M context and fast mode flags from the catalog
- #105707finish support drafts that end without json
- #105736stop key file field names blocking source setup
- #105740stop the composer queue swallowing follow-ups
- #105775give the model pickers one retirement list
- #105784add a shared typesafe domain for jev
- #105799size audiences during read-only impersonation