@ssheleg/sheleg-dev 0.12.0 → 0.13.1

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
@@ -1,3 +1,55 @@
1
+ ## v0.13.1 — a payment bug reaches the billing skill
2
+
3
+ The 2026-10-08 family routing audit found that a request opening with the symptom rather
4
+ than the vendor — «баг в оплате», "payment bug", or plain «оплата» — loaded no skill.
5
+ `stripe-billing` was written for someone who already knew the word Stripe: its
6
+ description led with "connecting a product to Stripe" and its only payment phrase was
7
+ «оплата подпиской».
8
+
9
+ - **`stripe-billing` now names "payment bug", «баг в оплате» and «оплата» in its first
10
+ sentence**, ahead of the point where harness listings truncate a description. Room
11
+ was made by tightening wording, not by dropping a trigger: every routed trigger the
12
+ umbrella's table holds for this skill is still advertised. 959 → 965 characters,
13
+ inside the 970 working limit.
14
+ - **The trigger corpus gains `q15` and `q16`** («баг в оплате: после оплаты подписка не
15
+ активируется», "Payment bug: customers are charged twice for one Stripe checkout"),
16
+ one per split. They are data for the next measured run, not a result.
17
+
18
+ Bare «оплата» is broad, and the near-miss negatives already in the corpus (`q09` «нарисуй
19
+ экран оплаты», `q11` Telegram Stars) are the cases a measured run should watch: the
20
+ first is the visual layer's, the second telegram-dev's.
21
+
22
+ ## v0.13.0 — the gate exists on one surface, and every skill now says so
23
+
24
+ This pack ships a `PreToolUse` money gate (`hooks/money-gate.js`) that refuses a refund,
25
+ a payout, a dispute close, a live `sk_live_…` key and `SKIP_BILLING=true` in production
26
+ until the authorised person has signed that category off. It runs on Claude Code and
27
+ nowhere else. Measured 2026-09-14: of the seven skills, **one** (`error-tracking`) wrote
28
+ a degradation contract; `stripe-billing` never mentioned the gate at all and
29
+ `crypto-payments` named it and sent the consequences to the README — so the two skills
30
+ the gate exists FOR were the two that did not say what happens without it.
31
+
32
+ - **`## Degradation` in all seven skill bodies**, one line per axis, in the shape
33
+ `references/host-capabilities.md` requires: not-Claude-Code, installed-by-copy, and the
34
+ capability each skill's own work needs (Stripe CLI, node fixtures, a browser channel, a
35
+ console login).
36
+ - **`check_degradation_is_written_where_a_host_capability_ships`** — a pack that ships
37
+ `hooks/hooks.json` requires the section in every skill body. Watched failing on four
38
+ skills before they were written.
39
+ - **The body budget is MEASURED, not estimated.** This gate divided by 3.9 chars/token
40
+ while the family's CI auditor measures with tiktoken, and the two disagree by up to 8%
41
+ in the same direction: `crypto-payments` estimated **4986** and measured **4618** — a
42
+ verdict of *past the working limit* over 132 tokens of real headroom, which is what
43
+ blocked this change from landing. With no tokenizer installed the check now DISCLOSES
44
+ that it could not measure instead of failing a file it never counted. make-skill
45
+ v0.28.0 closed exactly this for the family auditor; this repo kept the estimate and so
46
+ kept the defect.
47
+ - **The `биллинг` trigger is now `биллинг подписок`.** Bare `биллинг` collided with
48
+ `agent-orchestrator`'s `биллинг LLM` across packs, where no per-repo validator can see
49
+ it: this one meters what an agent burned, that one charges a card.
50
+ - `docs/evals/stripe-billing.md` restates a measured figure (4521 tokens, tiktoken)
51
+ rather than a heuristic one, and the validator compares it to a measurement.
52
+
1
53
  ## v0.12.0 — the integration doctrine closes its audit, and a crypto reference gains its map
2
54
 
3
55
  Sherlock external-v3 (43 findings) — the largest share in the family — each with
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/sheleg-dev",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "Seven integration skills for the layer a product reaches once it has users: Stripe subscription billing and cancellation retention, crypto payments, ad and conversion tracking under Consent Mode v2, Google sign-in and the wider Google auth surface, error tracking, 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.12.0",
6
+ "version": "0.13.1",
7
7
  "author": {
8
8
  "name": "ssheleg",
9
9
  "url": "https://x.com/sshlg93"
@@ -414,3 +414,14 @@ when** line, so the trigger has one home and this table stays an index.
414
414
 
415
415
  For the page-speed side of the same problem — what the tag does to LCP and TBT,
416
416
  and what to do about it — see the `frontend-performance` skill in this pack.
417
+
418
+ ## Degradation
419
+
420
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
421
+ `PreToolUse` gate does not run. It is the thing that refuses a live key or an
422
+ irreversible action in this pack; elsewhere those rules are advice you follow by hand.
423
+ - **Installed by copy rather than as a plugin**: the doctrine arrives, `hooks/` does not
424
+ — same loss, same remedy.
425
+ - **No network, or the ad platform's API unreachable**: server-side events cannot be
426
+ verified end to end. Say the dedup check did not run rather than reporting it held;
427
+ a browser pixel firing proves the browser, never the conversion.
@@ -399,3 +399,18 @@ a green suite, each with the defect it catches:
399
399
  | Cannot answer "how much did we net" | commission and `merchantAmount` never stored |
400
400
  | A dev machine, a CI job or an agent run is holding the production key | no separate credential, and no assertion binding the key to a declared environment |
401
401
  | Real invoices in a merchant dashboard nobody watches | a staging credential declared live — the mismatch nothing refused |
402
+
403
+ ## Degradation
404
+
405
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the
406
+ `PreToolUse` gate named above — `plugins/sheleg-dev/hooks/money-gate.js` — does not
407
+ run there. Nothing refuses a payout, a refund, an exported `HELEKET_API_KEY` in a
408
+ `test` run, or `SKIP_BILLING=true` in production. The three lines are advice again,
409
+ which is exactly the state that made them ineffective for four releases: name the
410
+ surface you are on, and make the authorisation a human step out loud.
411
+ - **Installed by copy rather than as a plugin**: the doctrine arrives, the hook does
412
+ not. The README carries the categories and how one is authorised for a session.
413
+ - **No node, or the fixtures cannot run**: the invariant fixtures are the executable
414
+ half of this skill. Say the check did not run rather than reporting the invariant as
415
+ held — an unrun check and a passing one are indistinguishable from the exit code
416
+ nobody looked at.
@@ -192,3 +192,14 @@ Four names that used to sit here — `frontend-design`, `landing-page-design`,
192
192
  `next-best-practices`, `responsive-design` — resolved to nothing installable, and
193
193
  `seo-audit` was one character-class away from the real `seo-aeo-audit`, which is
194
194
  how a typo survives review.
195
+
196
+ ## Degradation
197
+
198
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
199
+ `PreToolUse` gate does not run — every rule here still applies, enforced by a person
200
+ instead of a hook.
201
+ - **No browser channel** (no Chrome DevTools MCP, no Playwright): a page is judged from
202
+ the diff and the numbers are not measured on this machine. Record the weaker claim;
203
+ a Lighthouse score nobody ran is not a score.
204
+ - **No network**: PageSpeed Insights and field data are unavailable. Lab reasoning is
205
+ still worth doing — say which half you did.
@@ -279,3 +279,12 @@ if credentials.expired and credentials.refresh_token:
279
279
  - **[ADC & Service Accounts](references/adc-and-service-accounts.md)** — Application Default Credentials setup, service account keys, JWT, Compute credentials, environment configuration (Node.js + Python)
280
280
  - **[Sign In with Google](references/sign-in-with-google.md)** — Google Identity Services (GIS), ID token verification, CSRF protection, One Tap, FedCM (Node.js + Python)
281
281
  - **[Workload Identity Federation](references/workload-identity.md)** — AWS, Azure, OIDC/SAML federation, workforce identity, executable-sourced credentials (Node.js + Python)
282
+
283
+ ## Degradation
284
+
285
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
286
+ `PreToolUse` gate does not run; a live credential is refused by nothing but you.
287
+ - **Installed by copy rather than as a plugin**: doctrine yes, `hooks/` no.
288
+ - **No browser, or no console access**: the consent screen and the client-id half are a
289
+ human step. Name the exact screen and what is blocked, do the code half, and do not
290
+ loop on a login only a person can complete.
@@ -151,3 +151,12 @@ attacker's account.
151
151
  | `access_denied` on consent | Consent screen still in Testing → publish the app |
152
152
  | Works locally, breaks in prod | Prod origin missing in GCP, or `Secure` cookie served over plain HTTP |
153
153
  | One Tap missing / FedCM console warnings | FedCM is mandatory since Aug 2025 and the opt-out is gone (checked 2026-08-06). Load `gsi/client` from Google and keep it current — a vendored or pinned copy is the real break. The rendered button flow is unaffected; code branching on the old `isNotDisplayed()` moment callbacks is not |
154
+
155
+ ## Degradation
156
+
157
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the pack's
158
+ `PreToolUse` gate does not run — the rules here hold, the refusal does not.
159
+ - **No browser channel**: the sign-in button and its redirect are verified by reading
160
+ the code, not by watching it work. Record that as the weaker claim it is.
161
+ - **No console access**: creating the OAuth client is a human step; state it once, do
162
+ the rest, and say what is waiting on it.
@@ -1,20 +1,21 @@
1
1
  ---
2
2
  name: stripe-billing
3
3
  description: >-
4
- Use when connecting a product to Stripe, or auditing a live integration:
5
- checkout, renewals, seats, proration, refunds, cancellation and the
6
- coupon offered at the cancel step, the portal, and the webhook that
7
- turns a payment into an entitlement in your database. Covers Stripe's
8
- agent toolchain, the pinned API version and SDK retries, price
9
- resolution across modes, claim-first webhook idempotency, what invoice
4
+ Use when connecting a product to Stripe, fixing a payment bug
5
+ ("баг в оплате", "оплата"), or auditing a live integration: checkout,
6
+ renewals, seats, proration, refunds, cancellation and the cancel-step
7
+ coupon, the portal, and the webhook that turns a payment into an
8
+ entitlement. Covers Stripe's agent toolchain, the pinned API version, SDK
9
+ retries, price resolution, claim-first webhook idempotency, what
10
10
  billing_reason decides, cumulative refunds, the cancellation field
11
- flexible billing_mode moved, retention eligibility Stripe cannot
12
- express, and write ordering with compensating reverts. Triggers - "add
13
- Stripe", "Stripe checkout", "subscription billing", "webhook signature",
14
- "invoice.paid", "proration", "refund", "cancel subscription", "retention
15
- coupon", "подключить Stripe", "оплата подпиской", "вебхук Stripe",
16
- "скидка при отмене", "биллинг". Not for choosing between Stripe products
17
- (stripe-best-practices) or reading Stripe docs (stripe-docs).
11
+ flexible billing_mode moved, retention eligibility Stripe cannot express,
12
+ and write ordering with compensating reverts. Triggers - "add Stripe",
13
+ "Stripe checkout", "subscription billing", "webhook signature",
14
+ "invoice.paid", "proration", "refund", "cancel subscription",
15
+ "retention coupon", "подключить Stripe", "оплата подпиской",
16
+ "вебхук Stripe", "скидка при отмене", "биллинг подписок". Not for choosing
17
+ between Stripe products (stripe-best-practices) or reading Stripe docs
18
+ (stripe-docs).
18
19
  license: MIT
19
20
  ---
20
21
 
@@ -379,6 +380,21 @@ renewal and proration. The one thing to know before you get there: the signing
379
380
  secret `stripe listen` prints is **not** the dashboard's, and using the wrong one
380
381
  fails verification in a way that reads like a key problem.
381
382
 
383
+ ## Degradation
384
+
385
+ - **Not Claude Code** (Cursor, Codex, the skills CLI, the API container): the
386
+ `PreToolUse` money gate this pack ships does not exist there — nothing refuses a
387
+ refund, a payout, a dispute close or a live `sk_live_…` key on your behalf. Every
388
+ rule below still holds; it is advice again rather than a precondition, so the
389
+ authorisation step becomes a human one. Say which you are on before acting on money.
390
+ - **Installed by copy rather than as a plugin**: same loss, same remedy — a plain
391
+ `~/.claude/skills/` copy carries the doctrine and not `hooks/money-gate.js`. The
392
+ README names the categories and how one is signed off; without the hook, that
393
+ sign-off is a sentence somebody has to actually say.
394
+ - **No Stripe CLI, no network, or test keys only**: webhook signature verification and
395
+ the local replay loop are the parts that need the binary. State which is missing
396
+ once, do the rest, and record what could not be verified rather than implying it was.
397
+
382
398
  ## Before you ship
383
399
 
384
400
  Not a second checklist — every rule below already has a section above, and a rule