@drawbridge/drawbridge-agents 0.1.49 → 0.1.51
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/claude/CLAUDE.md
CHANGED
|
@@ -7,7 +7,7 @@ skill) so it stops living only in tribal memory.
|
|
|
7
7
|
|
|
8
8
|
## Shared secrets must match across services
|
|
9
9
|
|
|
10
|
-
- `
|
|
10
|
+
- `HMAC_OAUTH_TOKEN_KEY` must be identical in **drawbridge-api** and **drawbridge-sync** — both
|
|
11
11
|
`assertEnv` it at boot. A mismatch silently breaks realtime token verification.
|
|
12
12
|
- `HMAC_UNSUBSCRIBE_TOKEN_KEY` must be identical in **drawbridge-api** and **drawbridge-sync** —
|
|
13
13
|
both `assertEnv` it at boot. Sync signs the unsubscribe tokens it builds into notification
|
|
@@ -153,17 +153,34 @@ skill) so it stops living only in tribal memory.
|
|
|
153
153
|
would have zeroed every invoice once the products were archived.
|
|
154
154
|
- **The v2 pricing-plan layer (`bpp_*`, billing cadences) is never touched by script.** Canceling a
|
|
155
155
|
billing cadence is terminal and unrecoverable. Dashboard, by hand, only.
|
|
156
|
-
- **The Shopify meter handle is
|
|
157
|
-
|
|
158
|
-
(
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
156
|
+
- **The Shopify meter handle is manifest data, provider-overridable, and sender-verified
|
|
157
|
+
(≥ utils 0.0.151)** (utils ↔ sync ↔ api ↔ Partner Dashboard). The utils shopify manifest
|
|
158
|
+
publishes `events.order.handle` = `slugify('drawbridge-orders')`; the provider row's
|
|
159
|
+
`orderEventHandle` field (admin-editable, `format:'slug'` — normalized on save AND read)
|
|
160
|
+
overrides it at mint time. The order hook puts the effective handle on the billing job and
|
|
161
|
+
mints `billed.transaction` = `<handle>.<orderId>` (also the event's `reference` attribute —
|
|
162
|
+
the shared trace key). `sendAppEvent` has NO default handle any more, and sync's sender
|
|
163
|
+
REFUSES to send when the job carries none (`shopify.usage.billing.handle.missing`) or when
|
|
164
|
+
the transaction prefix disagrees (`…handle.mismatch`) — both before any provider read, both
|
|
165
|
+
page through the abandoned alert. The handle must still exactly match — case-sensitive,
|
|
166
|
+
handle not display name — a usage meter on the plan version each merchant APPROVED: meters
|
|
167
|
+
attach only at approval and are never retroactive, and a pre-meter approval 202s every event
|
|
168
|
+
and bills nothing (the 19/99 write-off; also every pre-2026-09 production approval).
|
|
169
|
+
- **Shopify billing proof comes only from the Partner ledger; absence is never a verdict**
|
|
170
|
+
(utils ↔ sync ↔ api ↔ app-web). No Admin API version materializes a managed-pricing meter
|
|
171
|
+
(measured 2026-09-04), so `connection.source.metered` is a billing-PROOF reference: the
|
|
172
|
+
latest positive `CHARGE_USAGE` charge id from the Partner API (provider row fields
|
|
173
|
+
`partnerOrgId`/`partnerAppId`/`partnerToken`), `null` only from measured unmetered evidence,
|
|
174
|
+
absent = never proven — and every consumer (task card, checklist item, billing Issue,
|
|
175
|
+
presented-error status, admin badges, App Home error row) gates on the explicit null, never
|
|
176
|
+
on silence. Writers: the daily health run, the approval webhook's instant restamp, and the
|
|
177
|
+
reselect flow's stale-null lift (a completed reselect returns a null-stamped store to
|
|
178
|
+
no-verdict — the null described the approval that was just replaced). Charge rows exist only
|
|
179
|
+
at billing boundaries (usage accrues invisibly between them); each row is reconciled once
|
|
180
|
+
against its window's orders — balanced stamps `billed.receipt`, a mismatch pages
|
|
181
|
+
`shopify.usage.reconciliation.mismatch`, and admin-voided orders (`billed.void`, the
|
|
182
|
+
write-off for pre-meter losses) leave both the sums and the dashboard's unreconciled count.
|
|
183
|
+
Detail: drawbridge-docs `reference/shopify-app.md` (Billing).
|
|
167
184
|
- **A subscription must open with the plan item.** It used to open with the metered actions price
|
|
168
185
|
and attach the plan afterwards with `always_invoice`. With no metered item, Stripe rejects an
|
|
169
186
|
itemless subscription, so the plan goes in at creation — changing the first invoice's shape.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Humanize every word a person will read
|
|
2
|
+
|
|
3
|
+
Any prose you write that a human will read as *product or communication* goes through the
|
|
4
|
+
`humanizer` skill before it ships or posts. No exceptions for length — a two-line Asana
|
|
5
|
+
comment counts.
|
|
6
|
+
|
|
7
|
+
Covers, at minimum:
|
|
8
|
+
|
|
9
|
+
- App/UI copy: labels, buttons, empty states, error and notice messages, tooltips, onboarding.
|
|
10
|
+
- Asana comments and task descriptions, ship handoffs, retest instructions.
|
|
11
|
+
- Docs and user stories, README prose, release notes.
|
|
12
|
+
- Emails, SMS bodies, notification text, outreach drafts (growth), article/content drafts.
|
|
13
|
+
- Anything else a customer, teammate, or prospect reads as writing.
|
|
14
|
+
|
|
15
|
+
Does NOT cover: code, commit messages, code comments, test names, log lines, schema
|
|
16
|
+
descriptions — engineer-facing text follows the code conventions instead.
|
|
17
|
+
|
|
18
|
+
Rules when running it:
|
|
19
|
+
|
|
20
|
+
- Run humanizer BEFORE posting/committing the copy, not after someone flags it.
|
|
21
|
+
- It must not change facts, numbers, steps, or expected results — if a pass makes concrete
|
|
22
|
+
instructions vaguer, keep the original wording for those parts.
|
|
23
|
+
- Leave markup intact (Asana mention tags, links, placeholders like `{name}`).
|
|
24
|
+
- If the humanizer skill is not available in your session, say so and flag the copy as
|
|
25
|
+
un-humanized — do not silently skip the pass.
|
package/package.json
CHANGED