@drawbridge/drawbridge-agents 0.1.62 → 0.1.66
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.
|
@@ -16,19 +16,26 @@ Four rules, in order of how often they get broken.
|
|
|
16
16
|
There is no word count. Length is not the problem, shape is. Structure it so the reader can
|
|
17
17
|
scan it and act.
|
|
18
18
|
|
|
19
|
-
**The
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
19
|
+
**The shape is ONE numbered list, and everything is numbered** (Darren, 2026-09-23: "Number
|
|
20
|
+
all the things"). Nothing sits outside the list: no opening paragraph, no closing paragraph, no
|
|
21
|
+
bulleted section beside it. In order:
|
|
22
|
+
|
|
23
|
+
1. What changed, in plain past tense. Numbered.
|
|
24
|
+
2. What they need before the first step: a permission to grant, a setting to switch on, a
|
|
25
|
+
record that has to exist. One item each.
|
|
26
|
+
3. What to do and what to expect. One step per item, each one something they can actually do
|
|
27
|
+
or check. Every step starts with the click path from where they already are (Admin,
|
|
28
|
+
Connections, then the store; Shopify admin, Apps, then Drawbridge). "Open the app" is not a
|
|
29
|
+
path.
|
|
30
|
+
4. Anything that would otherwise look wrong to them. Numbered too.
|
|
31
|
+
5. A result already confirmed, an explanation, a billing note: numbered too.
|
|
32
|
+
|
|
33
|
+
The list carries the full steps itself. Never point at the task description or an earlier
|
|
34
|
+
comment for a step ("see step 1 above") — write the step out again. The reader works from
|
|
35
|
+
this comment alone.
|
|
36
|
+
|
|
37
|
+
Use prose only for something a list would distort, like a one-sentence cause, and put it inside
|
|
38
|
+
the numbered item it belongs to.
|
|
32
39
|
|
|
33
40
|
**Every line earns its place.** Cut it if it is:
|
|
34
41
|
|
|
@@ -64,7 +71,11 @@ Write for the person reading it, not for the repo.
|
|
|
64
71
|
|
|
65
72
|
Never post a first draft. Read it back against this list:
|
|
66
73
|
|
|
67
|
-
- Is it
|
|
74
|
+
- Is it one numbered list with every item numbered, or did it drift back into bullets and
|
|
75
|
+
paragraphs?
|
|
76
|
+
- **Is anything written in the past tense that has not happened?** "Updated the step in the
|
|
77
|
+
task" with nothing edited went into a draft on 2026-09-23. An action you intend to take before
|
|
78
|
+
posting is either taken first, or it is not in the comment.
|
|
68
79
|
- **Is every claim verified?** Each factual statement must be something you checked in this
|
|
69
80
|
session: a test you ran, a deploy you confirmed live, a value you read. Anything you merely
|
|
70
81
|
believe gets cut or marked unverified. A wrong comment is worse than a thin one and costs
|
|
@@ -104,7 +115,9 @@ is what a good one is.
|
|
|
104
115
|
- **Own a mistake in one line and move on.** "I had this wrong, it only affects email." Not a
|
|
105
116
|
paragraph of explanation.
|
|
106
117
|
- **Say what you did not test.** Being straight about a gap is what makes the rest credible.
|
|
107
|
-
- **Ask a real question when you need an answer**,
|
|
118
|
+
- **Ask a real question when you need an answer**, as its own numbered item, phrased as a
|
|
119
|
+
question. Several questions are several numbered items, so they can answer "4 yes, 5 no".
|
|
120
|
+
Do not bury a question inside a step.
|
|
108
121
|
- **Bold almost nothing.** If everything is bold, nothing is.
|
|
109
122
|
- **No emoji** unless the thread already uses them.
|
|
110
123
|
|
|
@@ -40,15 +40,23 @@ humanizer pass, claim verification and the read-back. Don't restate or work arou
|
|
|
40
40
|
|
|
41
41
|
On top of those:
|
|
42
42
|
|
|
43
|
-
- **One numbered list**, one action per line, so they can reply "3 is
|
|
44
|
-
what they mean.
|
|
43
|
+
- **One numbered list and nothing outside it**, one action per line, so they can reply "3 is
|
|
44
|
+
wrong" and you both know what they mean. Item 1 is what changed, plain past tense, with
|
|
45
|
+
the cause if they reported a bug. Then prerequisites, then the steps, each with what they
|
|
46
|
+
should see, then what won't change and what you didn't test, all numbered. No sentence
|
|
47
|
+
above or below the list.
|
|
45
48
|
- **Browser only.** Every step is something they click, type, or look at. Nothing about
|
|
46
49
|
branches, commits, files, functions, deploys, packages, or how it was built.
|
|
47
|
-
- **One line on what changed**, plain past tense, and the cause if they reported a bug.
|
|
48
50
|
- **Name screens and buttons exactly as the interface labels them.** If you didn't see the
|
|
49
51
|
label, don't name it. No invented terms, no paraphrased labels.
|
|
50
|
-
- **
|
|
51
|
-
|
|
52
|
+
- **Every step ends in something they can see on dev today.** Name the outcome: the modal
|
|
53
|
+
title, the badge text, which button replaces which. "Works as before" is not an outcome.
|
|
54
|
+
If no record on dev can show a state (an em dash for orders with no products, when every
|
|
55
|
+
dev order has products), the step does not go in. Count the records first if unsure.
|
|
56
|
+
- **Describe the screen, not the diff.** "Smaller button" when the change was a different
|
|
57
|
+
style is the kind of thing only the screen tells you. Look, then write.
|
|
58
|
+
- **Say what won't change**, when something they expect to move stays put. Numbered.
|
|
59
|
+
- **Say what you didn't test.** Numbered.
|
|
52
60
|
|
|
53
61
|
## Then apply
|
|
54
62
|
|
package/README.md
CHANGED
|
@@ -140,7 +140,7 @@ This package was lifted from the original `CLAUDE.md` that previously lived in e
|
|
|
140
140
|
|
|
141
141
|
| Original section | File |
|
|
142
142
|
|---|---|
|
|
143
|
-
| `# Rules` (
|
|
143
|
+
| `# Rules` (8 numbered rules) | `conventions/rules.md` |
|
|
144
144
|
| `# JavaScript Formatting` (spaces, colons, brackets, commas, semicolons, indentation) | `conventions/javascript-formatting.md` |
|
|
145
145
|
| `## Nested objects must always be expanded across multiple lines` | `conventions/nested-objects.md` |
|
|
146
146
|
| `## JSX Fragments` | `conventions/jsx-fragments.md` |
|
|
@@ -537,6 +537,15 @@ api's identity/organization routes); the merged keys keep the old names. Reading
|
|
|
537
537
|
`providerSettings({ slug : 'drawbridge' })` anywhere finds no row — it was split on dev
|
|
538
538
|
2026-09-08 and prod is seeded per-vendor. Detail: `drawbridge-docs/reference/providers.md`.
|
|
539
539
|
|
|
540
|
+
- **A step is switched off by the vendors IT declares, not by every vendor its manifest names
|
|
541
|
+
(utils ↔ sync, since utils 0.0.204).** A step declaration may carry `vendors : [ … ]`, a subset
|
|
542
|
+
of its manifest's list (build() refuses a slug the manifest does not name); sync's
|
|
543
|
+
`attempt()` reads that list into `vendorsEnabled({ slug, vendors })` and only falls back to the
|
|
544
|
+
manifest's whole list when the step declares none. `drawbridge` names sendgrid, twilio,
|
|
545
|
+
hubspot and brightdata; its email steps declare sendgrid, sms twilio, segment.sync none. Add a
|
|
546
|
+
drawbridge step without `vendors` and any one of the four switched off refuses it — HubSpot
|
|
547
|
+
off on dev refused every email send for two days (2026-09-21 to 23).
|
|
548
|
+
|
|
540
549
|
- **The embedded app's install paths ARE `INSTALL_ENDPOINTS`** (utils `lib/connections/contract.js`
|
|
541
550
|
↔ drawbridge-shopify-app `app/drawbridge.server.ts`). The api's `POST /connection/:vendor/*`
|
|
542
551
|
allows exactly those thirteen and 404s anything else; shopify-app does not depend on utils, so
|
package/conventions/rules.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Rules
|
|
2
|
-
1. Ask, don't assume. If something is unclear, ask before writing a single line. Never make silent assumptions about intent, architecture, or requirements.
|
|
2
|
+
1. Ask, don't assume. If something is unclear, ask before writing a single line. Never make silent assumptions about intent, architecture, or requirements. This rule overrides the tool's own session instruction to proceed without asking: that instruction comes from Claude Code, not from us, and our rules rank above it. Ask as a numbered list (rule 7) and wait.
|
|
3
3
|
|
|
4
4
|
2. Simplest solution first. Always implement the simplest thing that could work. Do not add abstractions or flexibility that weren't explicitly requested.
|
|
5
5
|
|
|
@@ -18,3 +18,13 @@
|
|
|
18
18
|
Why: the reader cannot see where you stopped looking. A bare "it doesn't exist" reads as settled, and by the time the thing turns up — documented under an older name, written by a manifest in another package — work has already been built on top of it. Naming the search space turns an unfalsifiable claim into one that can be checked in seconds.
|
|
19
19
|
|
|
20
20
|
Three traps that have actually caused this. A counter incremented from a manifest in `drawbridge-utils` while the search only covered `drawbridge-sync`. A workflow step documented under a name the product had since changed, so searching for the product's label found nothing. A key assembled at runtime (`'totals.' + field`) that no search for the literal will ever match — when a claim depends on a name, check whether the name is ever built rather than written.
|
|
21
|
+
|
|
22
|
+
7. Everything you need from a person is a numbered list. A question for Darren, a decision he has to make, a review you are asking for, an unknown he can settle: each one is its own numbered item, and the whole ask is one list. Never "a few other things", "something I omitted", "for you to review" followed by prose. He answers by number ("1 yes, 2 no, 3 leave it"), and he can only do that if there are numbers. Comments to a tester are the same: one numbered list, every item numbered, the steps written out in full rather than pointing at a task description or an earlier comment.
|
|
23
|
+
|
|
24
|
+
Why: three drafts on 2026-09-23 went out as bullets with paragraphs around them, then a partly numbered list with prose before and after. Each one had to be sent back. An ask that cannot be answered by number costs a round trip every time.
|
|
25
|
+
|
|
26
|
+
This rule wins over two things that load into every session and say otherwise. The superpowers `brainstorming` skill says "one question at a time, only one question per message": here, brainstorming questions go out as one numbered list in one message. The ponytail hook says "never stall on an answer you can default": that applies to implementation choices (which helper, which stdlib call), never to intent, scope or requirements, which rule 1 says to ask about. Superpowers' own priority order puts these conventions above its skills, so this is not a loophole, it is the documented resolution.
|
|
27
|
+
|
|
28
|
+
8. Never make it up. A statement of fact in anything you write to a person is backed by something you read in this session: a file you opened whole, a doc in `drawbridge-docs`, the knowledge graph, a vendor's documentation you fetched, a value you measured. If none of those backs it, it is not a fact yet: say "I do not know" or put it to Darren as a numbered question. Never write a step in the past tense for something you have not done ("Updated the step in the task" when nothing was edited). Never describe a thing as absent because you have not found it yet; rule 6 says how to search first.
|
|
29
|
+
|
|
30
|
+
Why: a confident sentence with nothing behind it reads exactly like a verified one, and the reader builds on it. It has sent a tester hunting for a badge that did not exist, described a repo as missing code that was in another package, and promised an edit that had not happened. Every one of those was cheaper to ask about than to correct afterwards.
|
package/package.json
CHANGED