@ssheleg/sheleg-dev 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,41 @@ All notable changes to this project are documented here.
4
4
  Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
5
5
  Versioning: [SemVer](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## v0.9.2 — the README stops claiming a command the package cannot run
8
+
9
+ The README told a reader to run commands the published package cannot run: it ships no
10
+ `test/` directory, so `npm test` resolves in a clone and nowhere else. Measured against the
11
+ published tarball on 2026-08-25. Shipping the suite does not fix it — the plants live in
12
+ `.github/workflows/`, which no packaging npm can express puts in a tarball — so the document
13
+ now names where the command runs instead of claiming it, beside a marker the umbrella's
14
+ validator reads. Naming a dead command is this family's own rule; claiming one is the defect.
15
+
16
+
17
+ ## v0.9.1 — 2026-08-24
18
+
19
+ ### The skill was wrong at the exact place its author then tripped
20
+
21
+ `error-tracking` shipped telling readers to take the release version from
22
+ `HEROKU_SLUG_COMMIT`. Using it on a real project the same evening produced the
23
+ failure it exists to prevent: that variable is **not a config var** — it is dyno
24
+ metadata, injected only when the `runtime-dyno-metadata` labs feature is on, and
25
+ absent in silence otherwise. With the feature off, the SDK reported no release at
26
+ all while Sentry held a release with a deploy nothing would ever attach to.
27
+ Nothing errored.
28
+
29
+ Two more measurements from the same hour: `heroku config:get` never prints it,
30
+ even when it is working, because it is never a config var; and enabling the
31
+ feature takes effect on the next **release**, not on a restart.
32
+
33
+ `references/releases.md` now names the trap, gives the three commands that tell
34
+ you which state you are in, and recommends not depending on the variable alone —
35
+ set `RELEASE` from the deploy, which needs no platform feature and cannot drift
36
+ because one command produces both sides.
37
+
38
+ Also added, from the same mistake one level up: create the Sentry release for the
39
+ **deployed** commit, not for local HEAD. They differ the moment commits are
40
+ pushed but not deployed, and the result is a release nobody's events belong to.
41
+
7
42
  ## v0.9.0 — 2026-08-24
8
43
 
9
44
  ### The pack that wires integrations had nothing about knowing when they break
package/README.md CHANGED
@@ -222,6 +222,10 @@ correctly. It does not tell you which one to trust.
222
222
 
223
223
  ## Verify
224
224
 
225
+ <!-- commands-run-in: a clone -->
226
+ These run **in a clone of this repository**. The published npm package ships no
227
+ `test/` directory, so from an install they are names, not commands.
228
+
225
229
  ```bash
226
230
  npm test # the validator, the manual gate's 65 fixtures, the money fixtures' 13 checks
227
231
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/sheleg-dev",
3
- "version": "0.9.0",
3
+ "version": "0.9.2",
4
4
  "description": "Six integration skills for the layer a product reaches once it has users: Stripe subscription billing, crypto payments, ad and conversion tracking under Consent Mode v2, Google sign-in and the wider Google auth surface, and Core Web Vitals. This package is the installer CLI.",
5
5
  "bin": {
6
6
  "sheleg-dev": "bin/sheleg-dev.js"
@@ -3,7 +3,7 @@
3
3
  "name": "sheleg-dev",
4
4
  "displayName": "Sheleg Dev",
5
5
  "description": "The integration layer a product needs once it has users: Stripe subscription billing reconciled into your own database, crypto payments that survive over-payment and duplicate webhooks, ad and conversion tracking under Consent Mode v2, Google sign-in with the account-linking guards, the wider Google auth surface, and Core Web Vitals work that moves the score, and Sentry error tracking wired so it does not forward your own credentials to a third party and so a stack trace names the commit that caused it.",
6
- "version": "0.9.0",
6
+ "version": "0.9.2",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -14,7 +14,7 @@ description: >-
14
14
  uptime vendor.
15
15
  license: MIT
16
16
  metadata:
17
- version: 0.9.0
17
+ version: 0.9.2
18
18
  ---
19
19
 
20
20
  # error-tracking — Sentry wired so it does not leak, and so a stack trace names a commit
@@ -6,6 +6,7 @@ commits, or when a service reports healthy while serving nobody.
6
6
  ## Contents
7
7
 
8
8
  - [The version contract](#the-version-contract)
9
+ - [The Heroku trap](#the-heroku-trap-the-variable-is-absent-unless-you-turned-it-on)
9
10
  - [The four release commands](#the-four-release-commands)
10
11
  - [In a deploy script, non-fatally](#in-a-deploy-script-non-fatally)
11
12
  - [What set-commits --auto needs](#what-set-commits---auto-needs)
@@ -24,7 +25,7 @@ Pick one source and use it on both sides.
24
25
 
25
26
  | Platform | The value | Read in the app as |
26
27
  |---|---|---|
27
- | Heroku | slug commit | `os.getenv("HEROKU_SLUG_COMMIT")` |
28
+ | Heroku | slug commit | `os.getenv("HEROKU_SLUG_COMMIT")` — **see the trap below** |
28
29
  | Vercel | commit SHA | `os.getenv("VERCEL_GIT_COMMIT_SHA")` |
29
30
  | GitHub Actions | `github.sha` | `os.getenv("GITHUB_SHA")` |
30
31
  | Anywhere | `git rev-parse HEAD` | inject it at build time |
@@ -41,6 +42,40 @@ VERSION="$(git rev-parse HEAD)" # the same string, on the other side
41
42
  `sentry release propose-version` will invent one, which is convenient and
42
43
  exactly the thing that drifts. Prefer an explicit value both sides can derive.
43
44
 
45
+ ### The Heroku trap: the variable is absent unless you turned it on
46
+
47
+ `HEROKU_SLUG_COMMIT` is **not a config var**. It is dyno metadata, injected into
48
+ the dyno only when the `runtime-dyno-metadata` labs feature is enabled, and
49
+ absent in silence otherwise. Three consequences, all measured on 2026-08-24:
50
+
51
+ - `heroku config:get HEROKU_SLUG_COMMIT` prints nothing **even when it is
52
+ working** — it is never a config var. Read it from inside a dyno instead.
53
+ - With the feature off, `release=os.getenv("HEROKU_SLUG_COMMIT")` is `None`, so
54
+ the SDK reports no release at all while Sentry holds a release with a deploy
55
+ that nothing will ever attach to. Nothing errors.
56
+ - Enabling it takes effect on the **next release**, not on a restart.
57
+
58
+ ```bash
59
+ heroku labs -a <app> | grep runtime-dyno-metadata # is it on?
60
+ heroku labs:enable runtime-dyno-metadata -a <app>
61
+ heroku run -a <app> -- printenv HEROKU_SLUG_COMMIT # from INSIDE a dyno
62
+ ```
63
+
64
+ Do not depend on it alone. Set the value from the deploy itself, which needs no
65
+ platform feature and cannot drift because one command produces both sides:
66
+
67
+ ```bash
68
+ heroku config:set RELEASE="$(git rev-parse HEAD)" -a "$APP" # inside the down window
69
+ ```
70
+
71
+ Then read `HEROKU_SLUG_COMMIT or RELEASE`: the platform's answer when it is
72
+ available, because it names the commit actually running, and the deploy's answer
73
+ otherwise.
74
+
75
+ **And create the Sentry release for the DEPLOYED commit, not for local HEAD.**
76
+ They differ the moment you have commits pushed but not deployed — the same
77
+ mistake one level up, and it produces a release nobody's events belong to.
78
+
44
79
  ## The four release commands
45
80
 
46
81
  ```bash