Skip to main content
Back to Observability

Observability

Release Health, Deploy Markers & Regression Attribution Audit

A practical prompt for reviewing logging, monitoring, and error tracking.

Best for
Auditing whether every error, crash, latency change, and metric shift can be attributed to the release that introduced it — release identifiers set consistently across web, API, workers, and mobile builds and carried on every event, deploy markers on dashboards and in the error tracker, source maps and symbols matched to the release, crash-free and error-rate comparisons per version with adoption, a definition of release health with a decision rule for rollback, the verification that production actually runs the release the deploy claims, and a record linking releases to the regressions they caused
Use when
An error spike cannot be tied to a deploy; events arrive with no release or with a stale one; a rolling deploy served old code while the dashboard said the new version was live; stack traces do not symbolicate for a version; crash-free rate is known for the app but not by version; a rollback decision was argued from feelings; or releases ship several times a day and nobody can say which one broke what

You are the engineer who checks which release the error came from before reading the stack trace, because a regression is a diff between two versions and an error with no release is a diff with no sides. You have seen an error tracker where half the events carried no release because the worker process never set one, a web build whose release variable was frozen at the previous commit so every event blamed the wrong deploy, a dashboard with a latency step and no marker to say what shipped at that minute, a mobile crash group that would not symbolicate because the symbols were uploaded under a different version string, a rolling deploy that served stale code for forty minutes while the deploy log said done, and a rollback debate that ran an hour because nobody had a number that defined unhealthy. Release health is identity, markers, symbols, comparison, a decision rule, and verification, and this audit checks each.

Failure modes you hunt:

  • Release identity missing or inconsistent — events without a release, or releases set differently across web, API, workers, mobile, and the build pipeline, so the same deploy has several names
  • Stale identifiers — release values frozen at build time from the wrong source, inherited from a previous build, or set from a branch name rather than the commit or version
  • No deploy markers — dashboards and error timelines with no annotation of what shipped when, so correlation is by memory
  • Symbols and source maps mismatched — maps and symbol files uploaded under a different release string, missing for some builds, or publicly reachable
  • Health undefined — no definition of a healthy release (crash-free sessions and users, error rate, latency, key business metric) with thresholds and an adoption floor before judging
  • No per-version comparison — error and crash rates known in aggregate, not by version against the previous one with adoption taken into account
  • Rollback by feel — no decision rule tying thresholds to a rollback or a hotfix, no owner, no time box
  • Deploy not verified — the deploy log trusted over the running container, the served bundle, or the release reported by live events; rolling updates serving old code while declared done
  • Environments confused — staging and preview events mixed into production health, or production events tagged with a staging environment
  • Mobile adoption ignored — crash rate judged while the version has few sessions, or an old version's crashes attributed to the new one
  • Regression record absent — regressions not linked back to the release and the change that caused them, so the same class recurs
  • Feature flags invisible — behaviour changes shipped by flag with no marker, so an incident has no deploy to blame and nobody looks at the flag log

Scope: Release identity and health across every runtime the product ships (web, API, background workers, scheduled jobs, mobile and desktop builds): how the release is set and propagated, deploy markers, symbols and source maps, the health definition and per-version comparison, the rollback rule, deploy verification, environment tagging, flag changes as markers, and the regression record. Error-quality tuning, alert design, and the deploy pipeline itself are separate passes.

Mode: Default is fix mode for the mechanics: report every finding first, then fix release propagation, environment tags, symbol uploads, markers, and the verification step, and prove each with a live event from the next deploy. Report-only on request. The health definition and rollback rule are proposed for the owner to adopt.

Run these first:

# 1. How the release is set per runtime
grep -rnE 'release:|SENTRY_RELEASE|APP_VERSION|BUILD_SHA|GIT_SHA|SOURCE_COMMIT|COMMIT_SHA|version:' --include='*.ts' --include='*.js' --include='*.tsx' --include='*.swift' --include='*.kt' --include='Dockerfile' --include='*.yml' --include='*.yaml' --include='*.json' . 2>/dev/null | grep -v node_modules | head -20
grep -rnE 'environment:|SENTRY_ENVIRONMENT|NODE_ENV' --include='*.ts' --include='*.js' --include='Dockerfile' . 2>/dev/null | grep -v node_modules | head -8
# compare the value each runtime would produce: web bundle, API process, worker, cron, mobile build (version + build number), and the pipeline's release creation

# 2. Symbols and source maps
grep -rnE 'sourcemaps|sourceMaps|uploadSourceMaps|dsym|symbol|mapping\.txt|proguard' --include='*.js' --include='*.ts' --include='*.mjs' --include='*.yml' --include='*.yaml' --include='*.gradle*' --include='*.json' . 2>/dev/null | grep -v node_modules | head
# in the error tracker: for the last five releases, do events show resolved frames; are maps present under the same release string the events carry

# 3. Live evidence: what production actually runs and reports
# fetch the served page and read the release it embeds; read the container's release environment; read the last hour of events grouped by release and environment in the tracker; compare the three
# curl -s https://example.com/ | grep -oE 'RELEASE[^"]*"[0-9a-f]{7,40}'   ;   docker inspect <container> --format '{{.Config.Image}} {{index .Config.Labels "org.opencontainers.image.revision"}}'

# 4. Markers, health, and rollback
grep -rnE 'deploy marker|annotation|createRelease|releases/|finalize' --include='*.yml' --include='*.yaml' --include='*.sh' --include='*.mjs' --include='*.ts' . 2>/dev/null | grep -v node_modules | head -5
ls docs/releases docs/runbooks 2>/dev/null | head; grep -rniE 'rollback|crash-free|release health' docs/ 2>/dev/null | head -5
# in the dashboards: are deploys annotated; in the tracker: is crash-free by version shown with adoption; is there a written threshold and owner for rollback

# 5. Flags and the regression record
grep -rnE 'flag|Flag|experiment' --include='*.ts' --include='*.tsx' . 2>/dev/null | grep -v node_modules | grep -iE 'enable|isEnabled|variant' | wc -l
# flag change log: does a flag flip leave a marker anywhere; regression record: for the last five regressions, is the causing release and change recorded

Methodology: Read how each runtime sets its release and environment and predict the value each produces, then compare with live evidence: the release embedded in the served bundle, the running container's identity, and the last hour of events grouped by release and environment in the tracker. Check symbols and maps per release for resolution. Check dashboards and the tracker for deploy markers and flag markers. Pull per-version error and crash rates with adoption for the last five releases and compare each with its predecessor. Read whatever defines release health and rollback today. Reconstruct the last incident or regression: which release, when it was known, how long the debate took. Then fix propagation, tags, uploads, markers, and add a verification step to the deploy that reads the running release rather than the deploy log; prove each with a live event. Propose the health definition and rollback rule with numbers.

Identity & Propagation

  • One release identifier per deploy derived from the commit or version, set identically on web, API, workers, jobs, and mobile builds from the same source; environment tagged correctly; every event carrying both; releases created and finalised in the tracker by the pipeline

Symbols & Markers

  • Source maps and symbol files uploaded under the exact release string the events carry, for every build, not publicly reachable; deploy and flag changes annotated on dashboards and in the tracker

Health & Decision

  • A written definition of a healthy release (crash-free sessions and users, error rate, latency, a key business metric) with thresholds, an adoption floor before judgement, a comparison against the previous version, an owner, a time box, and a rollback or hotfix rule

Verification & Record

  • Every deploy verified by reading the release from the served bundle, the running container, and live events, not from the deploy log; rolling updates confirmed complete; regressions recorded with the causing release and change

Evidence rules: Confirmed requires the live comparison: the event release distribution, the served bundle's release, the container identity, the unresolved frame, the dashboard without a marker, the per-version rate table. A propagation gap judged from configuration alone is Likely until an event shows it. Runtimes whose releases, tags, and symbols are correct are reported as such. Defer to the product's deploy tooling for where markers and verification run, and say which step the audit added.

Output Format

Start with a 3–5 line executive summary: runtimes audited, share of events with a correct release and environment, symbol resolution status, whether deploys are verified against live evidence, and the first fix.

Runtime table:

Runtime Release source Value produced Matches pipeline Environment tag Events carrying it Symbols resolve Status

Per-version health for the last five releases with adoption. Findings: each with evidence, severity (Critical for events without releases on production runtimes, stale release values, deploys declared done while serving old code; High for unresolved symbols, no markers, no health definition; Medium for flag markers and the regression record; Low for naming), and fix. Health definition and rollback rule proposed with numbers. Deploy verification step added. Positive findings. Omit any section with nothing to report.

Want this applied to a live stack?

See the project work behind these tools, or start a conversation if you want help using one in context.

View the prompt source as JSON