extending-hobby-smoke-tests
Skill727 starsChanged yesterdayMITView on GitHub
Design, extend, review, or debug PostHog Hobby end-to-end smoke tests in bin/hobby-ci.py and .github/workflows/ci-hobby.yml. Use when adding an ingestion round trip, deciding whether a product belongs in Hobby CI, changing the CI Hobby service topology or API-key scopes, or diagnosing a smoke test that captures data but cannot query it.
We split this skill into the rules it gives an agent
21 rules. About 0 are common, 21 are distinctive, and 0 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈21
Distinctive · estimate
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 8
Treat Hobby CI as proof that a supported Hobby install works across real process boundaries.
- Distinctive: line 12
Add a check only when all of these are true:
- Distinctive: line 20
Do not add the check when it requires a private feature flag, a CI-only service topology, or a different image registry only to make an …
- Distinctive: line 22
If the check exposes a missing service or configuration that every supported Hobby install needs, fix the install and add the check …
- Distinctive: line 26
Write down this chain from repository evidence:
- Distinctive: line 41
Do this before starting a full Hobby run.
- Distinctive: line 53
Use the existing bounded timeout and polling style.
- Distinctive: line 55
Keep one product idea per PR when the checks can fail independently.
- Distinctive: line 57
Avoid adding general abstractions for a single payload.
- Distinctive: line 61
Run focused checks before asking Hobby CI to create a server:
- Distinctive: line 70
When compose or installer files change, also render the final compose configuration and run the focused installer tests.
- Distinctive: line 72
Use a PR-specific image only when the PR changes code that must be built into that image.
- Distinctive: line 78
Use the first failed boundary to choose the next investigation:
- Distinctive: line 93
Before publishing, prove the PR contains only what the supported round trip requires:
- Distinctive: line 95
No alpha-only feature flags.
- Distinctive: line 96
No registry or image-build changes unless product code in the PR requires a new image.
- Distinctive: line 97
No new service unless that service belongs in every supported Hobby install.
- Distinctive: line 98
No broad API scope.
- Distinctive: line 99
No assertion that accepts an empty response.
- Distinctive: line 100
No synthetic payload that lacks a known accepted fixture.
- Distinctive: line 102
Update the PR description with the exact ingest and read-back proof.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Extending Hobby smoke tests
Treat Hobby CI as proof that a supported Hobby install works across real process boundaries. Keep each check small, strong, and limited to a stable product surface.
Decide whether the check belongs
Add a check only when all of these are true:
- The product is supported for Hobby deployments and is no longer alpha.
- A break can leave the install apparently healthy while the product is unusable.
- The check crosses boundaries that unit or service integration tests cannot cover, such as capture, queue, consumer, storage, and query API.
- The released Hobby images and default compose topology contain every required service.
- A deterministic request and an exact read-back assertion are available.
Do not add the check when it requires a private feature flag, a CI-only service topology, or a different image registry only to make an alpha path available. Test that path at a lower layer until it becomes part of the supported Hobby install.
If the check exposes a missing service or configuration that every supported Hobby install needs, fix the install and add the check together. If the missing plumbing exists only for the proposed test, stop and reconsider the check.
Map the round trip before editing
Write down this chain from repository evidence:
public ingest endpoint -> request contract -> service/consumer -> storage -> read API -> required scopeVerify each link:
- Find an existing end-to-end or receiver fixture for the ingest payload. Reuse its envelope and minimum valid data instead of inventing a plausible payload.
- Locate the consumer command and confirm it exists in the released image used by
docker-compose.hobby.yml. - Confirm the consumer is already started by the default Hobby compose files.
- Confirm no unreleased or private feature flag is required.
- Find the supported read API and its personal API-key scope.
- Identify a unique value that can select only the captured object.
Do this before starting a full Hobby run. A successful HTTP capture response proves receipt, not ingestion.
Build the smallest strong check
Change bin/hobby-ci.py for the round trip and bin/hobby-ci-setup-user.py only for the least read scope needed.
- Generate collision-resistant identifiers with UUIDs or nanosecond timestamps.
- Record the query window before capture.
- Send the smallest payload known to reach storage.
- Fail immediately on a non-success capture response and include a short response body.
- Poll the supported read API with the exact identifier.
- Require the expected stored object or value. An HTTP 200 with an empty result is not success.
- Use the existing bounded timeout and polling style.
- Preserve earlier smoke checks and return a result that names every completed round trip.
- Keep one product idea per PR when the checks can fail independently.
Avoid adding general abstractions for a single payload. Extract a helper only when it removes real repetition or gives a concept a useful name.
Validate from cheap to expensive
Run focused checks before asking Hobby CI to create a server:
python3 -m py_compile bin/hobby-ci.py bin/hobby-ci-setup-user.py
ruff check bin/hobby-ci.py bin/hobby-ci-setup-user.py
ruff format --check bin/hobby-ci.py bin/hobby-ci-setup-user.py
git diff --checkWhen compose or installer files change, also render the final compose configuration and run the focused installer tests. Inspect the rendered image and command for every added service.
Use a PR-specific image only when the PR changes code that must be built into that image. Do not change workflow path filters or registries merely because a smoke-test-only PR needs an unreleased service.
Then run Hobby CI once and follow the exact run through image build, cloud setup, health, and ingestion. Do not restart a healthy migration phase just because it is slow.
Read failures by boundary
Use the first failed boundary to choose the next investigation:
| Evidence | Likely boundary |
| Capture returns 4xx | Endpoint, token, or payload envelope |
| Read API returns 401 or 403 | Personal key scope or feature access |
| Capture succeeds, exact query stays empty | Payload semantics, missing consumer, routing, or storage |
| Added container is absent or unhealthy | Released image or default compose topology |
| Query returns 200 with empty series | Not success; keep polling or strengthen the assertion |
| Earlier product checks fail too | Shared install or trunk failure, not the new assertion alone |
Pull the failed job log before editing. Confirm the hypothesis against the receiver fixture, consumer registration, compose rendering, and API implementation. Do not run another full deployment on a guessed payload.
Review the final diff
Before publishing, prove the PR contains only what the supported round trip requires:
- No alpha-only feature flags.
- No registry or image-build changes unless product code in the PR requires a new image.
- No new service unless that service belongs in every supported Hobby install.
- No broad API scope.
- No assertion that accepts an empty response.
- No synthetic payload that lacks a known accepted fixture.
Update the PR description with the exact ingest and read-back proof. State any product intentionally excluded because it is not yet stable.
Other versions1 project uses a version of this.
Word for word · 1
- PostHog/posthog★ 40k100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository124 other files it gives its agents.
- AGENTS.mdAGENTS.md
- common/AGENTS.mdAGENTS.md
- hog/AGENTS.mdAGENTS.md
- proto/AGENTS.mdAGENTS.md
- rust/AGENTS.mdAGENTS.md
- .cursor/rules/django-python.mdcCursor rule
- .cursor/rules/react-typescript.mdcCursor rule
- .cursor/rules/rust.mdcCursor rule
- adding-activity-loggingSkill
- adding-api-scopesSkill
- adding-inbound-webhooksSkill
- adding-inbox-sourcesSkill
- adding-ingestion-warningsSkill
- adding-mcp-store-serversSkill
- adding-personhog-rpcSkill
- adding-product-alertingSkill
- adding-project-secret-api-key-authSkill
- adding-today-highlightsSkill
- adopting-generated-api-typesSkill
- analyzing-experiment-precompute-canarySkill
- analyzing-experiment-query-performanceSkill
- analyzing-insights-across-teamsSkill
- announcing-behavior-changesSkill
- auditing-llm-gateway-paritySkill
- auditing-warehouse-source-coverageSkill
- authenticating-to-clickhouseSkill
- authoring-ci-workflowsSkill
- building-product-empty-statesSkill
- building-the-toolbarSkill
- clickhouse-migrationsSkill
- debugging-ci-failuresSkill
- debugging-local-replaySkill
- debugging-local-task-agent-runsSkill
- debugging-mcp-analyticsSkill
- debugging-signals-pipelineSkill
- debugging-table-access-deniedSkill
- depot-ciSkill
- depot-container-buildsSkill
- depot-github-runnersSkill
- developing-subscriptionsSkill
- django-migrationsSkill
- django-startup-timeSkill
- documenting-warehouse-sourcesSkill
- editing-agents-mdSkill
- establishing-code-ownershipSkill
- extending-personhog-test-harnessSkill
- finding-llm-gateway-migration-candidatesSkill
- fixing-flaky-testsSkill
- formatting-slack-messagesSkill
- gating-production-deploysSkill
- gating-sensitive-actionsSkill
- generating-clickhouse-query-performance-reportsSkill
- hogliSkill
- implementing-mcp-toolsSkill
- implementing-mcp-ui-appsSkill
- implementing-warehouse-sourcesSkill
- improving-drf-endpointsSkill
- improving-mcp-toolsSkill
- ingestion-pipeline-doctor-nodejsSkill
- instrumenting-first-party-metricsSkill
- The first 60 shown.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

