Managing Endpoint Versions
PostHogOfficialPublished by PostHog
- Skill
- Guidelines
- Data and AI
- MIT
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to managing endpoint versions in a forward-only system. It explains how to handle common tasks like rolling back to a previous query, updating metadata without creating new versions, and safely deactivating specific versions. It emphasizes the system's current limitations, such as the lack of a pointer-flip mechanism, and provides clear guidance on how to perform these operations using the available endpoint tools.
What it does
- Lists all available versions for an endpoint to identify the current state.
- Facilitates rolling back by forking an older query into a new, higher version number.
- Updates configuration settings like descriptions or freshness on specific versions without incrementing the version.
- Deactivates individual versions to prevent them from being called while keeping others active.
- Helps identify and prune stale or unused versions to maintain endpoint hygiene.
- Provides methods to test and verify new versions before they become the default for unpinned callers.
When to use it
- When you need to revert to a previous query version after a breaking change.
- When you need to update metadata or settings for a specific version without triggering a new version bump.
- When you want to retire a specific version while keeping others operational.
- When you need to verify the behavior of a specific version using direct execution.
- When you are cleaning up old, unused versions to reduce materialization costs.
Advantages
- Provides a clear, safe procedure for handling version history in a forward-only model.
- Enables surgical updates to settings on historical versions.
- Allows for precise control over which versions are active or retired.
- Encourages best practices like pinning versions to prevent unexpected behavior for consumers.
- Offers a transparent view of system limitations, preventing user frustration.
Usage examples
- “How do I roll back my endpoint to v3?”
- The agent will list versions, retrieve the query from v3, and guide you through creating a new version (e.g., v6) that replicates the v3 query.
- “I want to fix the description of v5 without bumping the version.”
- The agent will use the endpoint-update tool with the version parameter to apply the description change directly to v5.
- “Can I disable v4 without affecting v5?”
- The agent will execute an endpoint-update call with the version parameter set to 4 and is_active set to false, leaving v5 unaffected.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/posthog/managing-endpoint-versions/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip managing-endpoint-versions.zip -d .agents/skills
Documentation by PostHog
Managing endpoint versions
This skill is the practical guide to endpoint versioning. It covers the today-workflow, which has some sharp edges worth being explicit about.
When to use this skill
"How do I roll back to v3?"
"I want to test changes before they go live"
"How do I update the description /
data_freshness_secondson a specific version?""Can I disable v4 without affecting v5?"
The user is uncertain whether a query change will cut a new version
Versioning model — what to know
| Behaviour | Reality |
|---|---|
| Query change | Auto-cuts a new version. Saving any edit to the query creates a new version and bumps the current version number |
Settings change (description, data_freshness_seconds, materialisation) | Does not cut a new version. Updates the targeted version in place |
| The "current" version | Always the highest version number — it's not a pointer you can move backwards |
Calling without ?version=N | Runs the latest version. So unpinned callers always hit the newest |
| Disabling the whole endpoint | endpoint-update with is_active: false (no version) takes every version offline at once |
| Disabling a single version | endpoint-update with version + is_active: false retires one version without affecting the others |
The model is forward-only. There is no "make v3 the default again" operation today. Practically
this means "rollback" requires either creating a new top version that re-uses the old query, or
pinning callers to ?version=N.
Available tools
| Tool | Purpose |
|---|---|
endpoint-versions | List all versions for an endpoint, latest first |
endpoint-get | Full config; supports ?version=N to fetch a specific version |
endpoint-update | The workhorse — supports version body param to target a specific version |
endpoint-run | Execute a version directly via ?version=N (without affecting which version other callers hit) |
Workflows
Previewing a draft before publishing
There is no "draft" concept in the model. Editing the query commits it as a new version immediately. To preview safely:
Test the new query first with the
execute-sqltool (or the SQL editor) — not on the live endpointWhen ready, update the endpoint — this creates the new version automatically
Use
endpoint-runwith?version=Nto confirm the new version returns what you expectOld callers still hit the latest version (which is now your new version) — there is no "soft launch"
If the user needs a true staging endpoint, the only workaround today is a sibling endpoint
with a _v2 or _staging suffix. Document this honestly — there is no in-product staging path.
Rolling back to an older version
The forward-only model means "rollback" requires forking:
endpoint-versionsto find the version with the good query (say v3)endpoint-getwith?version=3to retrieve that version's query JSONendpoint-updatewith the v3 query as the new query — this creates a new version (e.g. v6) with the same query as v3All callers without
?version=Nnow hit v6 (== v3's query)
The old version (v5, the broken one) still exists and is still callable via ?version=5 until
explicitly deactivated.
Faster mitigation if you can change every caller: have them pin to ?version=3 until a real
fix is ready. Lower-impact than cutting a new version.
Updating settings on a specific version
endpoint-update accepts a version field in the body. When set, settings updates apply to
that version only — they do not cut a new version. Useful when:
Bumping
data_freshness_secondson an old version that some callers still pin toAdjusting description on a historical version for clarity
Changing materialisation state per version (the materialisation is per-version anyway)
Important: passing query together with version is rejected — query changes always cut a new
top version, never modify history. The version arg only affects settings.
Deactivating a single version
To take v3 out of service while keeping v4 and v5 callable:
endpoint-update {name: "...", version: 3, is_active: false}This sets is_active: false on v3 only. Callers pinned to ?version=3 start getting an error;
other callers are unaffected.
To re-enable: same call with is_active: true.
The whole-endpoint is_active field (without version) is a separate switch — it disables
every version at once. Use the version-scoped form for surgical takedowns.
Pruning unused versions
Old versions accumulate over time. To find which are dead, call endpoint-versions and read each
version's last_executed_at: a version that's null or long stale hasn't been called recently.
Materialised dead versions are the costly ones — disable their materialisation with
endpoint-update + version + is_materialized: false, and deactivate with is_active: false
to signal they're retired.
Confirm with the user before retiring a version: last_executed_at counts only personal-API-key
calls and is recorded only for runs since that tracking was added (so a used version can still
read null), and a caller may be pinned to ?version=N. The full audit flow lives in
auditing-endpoints.
Example interaction
User: "I shipped a broken query last night, v5. How do I roll back?"
Agent:
- endpoint-versions <name> → v5 (latest), v4, v3, v2, v1
- endpoint-get <name> ?version=4 → query JSON for v4
- "Rolling back means creating v6 with v4's query. v5 stays as a
historical version but nobody hits it unless they explicitly
pass ?version=5. Sound right?"
- User confirms
- endpoint-update <name> {query: <v4 query>} → creates v6
- endpoint-run <name> ?version=6 to confirm shape
- "Done. v6 is live with v4's query. Want me to also deactivate v5
so it's clear it's defunct?"
- User: "Yes"
- endpoint-update <name> {version: 5, is_active: false}Important notes
There is no pointer flip. "Rolling back" creates a new version. The version number is always going up. If the user is uncomfortable with the resulting history noise, that's a fair concern — surface it honestly.
A query change always creates a new version. Updating settings on the side does not. If the user wants to fix a typo in v5's description without bumping to v6, use the version param.
Disabling a single version only blocks that version. It doesn't change which version runs by default — that's always the highest version number.
Materialisation is per-version. Each version has its own materialised view named
{endpoint_name}_v{version}. Disabling materialisation on one version doesn't affect others.Pinning is the safety net — push callers to use it. Callers that pin to
?version=Nare insulated from query edits; unpinned callers always hit the latest and can be surprised by a new version. Encourage consumers to pin, validate a new version, then bump the pin deliberately.The CLI manages versions too.
posthog-cli exp endpoints {pull,push,diff}lets the user keep endpoint definitions as YAML in version control and review changes before pushing — a cleaner workflow than editing live when query changes need review.Activating an older version is not yet a product feature. If the user repeatedly wants this — flip a pointer rather than fork — surface it as a feature gap (and nudge the team via
agent-feedback). Don't pretendendpoint-updatedoes it.
Files
- ATTRIBUTION.mdAdded by AutoGineer871 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md9.0 KiB
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
No issues found by our static scan· No issues found
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- PostHog
- Publisher
- PostHog (Official)
- Source
- PostHog/skills · skills/omnibus/managing-endpoint-versions · commit a5d30e7
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by PostHog or PostHog.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download managing-endpoint-versions.zip