norn-cli 3.1.0 → 3.3.0

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.md CHANGED
@@ -31,6 +31,7 @@ Current skills and what they cover:
31
31
  | `add-sequence-step-type` | Adding a new sequence step type |
32
32
  | `add-imported-sidecar-language` | Adding a new imported sidecar file type |
33
33
  | `norn-cli-integration` | `src/cli.ts` and CLI parity |
34
+ | `norn-editor-decorations` | Drawing onto the editor — end-of-line chips, hiding markup, folding, caret traps |
34
35
  | `norn-debugger-integration` | DAP / debugger work |
35
36
  | `norn-response-panel` | The response webview panel |
36
37
  | `norn-test-explorer` | VS Code Test Explorer integration |
package/NOW.md CHANGED
@@ -25,28 +25,79 @@
25
25
 
26
26
  ## Active now
27
27
 
28
- _Nothing accepted right now._ The MCP-servers item finished 2026-08-12 see **Recently done**.
29
- Slice 5f is the standing follow-on in the backlog below; it now has a spec and is ready for a
30
- fresh session the moment Peter accepts it here.
28
+ ### 📚 Knowledge Basethe third pillar
29
+ **Accepted 2026-08-15.** Norn covers **models** (providers, contracts, evals, record/replay) and
30
+ **capabilities** (MCP servers and tools). What an agent still cannot get is **context**. The user
31
+ writes prose in a declared folder and Norn derives the structure; because our runs have ground
32
+ truth, *"did editing this document make agent runs better?"* is answerable here and nowhere else.
33
+ Eight stages, ordered by dependency — **1 → 2 → 3** is the spine and where a wrong call is most
34
+ expensive. **Stages 1, 2, 3 and 4 are built as of 2026-08-15.** Stage 1 established declared membership,
35
+ topic identity, source-bounded domains, tombstones and deterministic DAG lineage. Stage 2 replaced
36
+ its temporary JSON cache with one project-global built-in SQLite authority: atomic content-addressed
37
+ snapshots, occurrence-scoped authored metadata, versioned action caches, conservative typed entity
38
+ crossing, FTS5 diagnostics, retention/pins, and a queued extension worker. The calibrated fixture
39
+ kept all nine entity kinds; exact values cross automatically while service spelling aliases remain
40
+ proposals only. The database/WAL byte test proves `.nornenv` values and ciphertext do not persist.
41
+ The CLI remains deliberately narrow and generic at index-backed `knowledge ls --explain`. Stage 3
42
+ now applies sidecar-local grants to one lazily pinned snapshot per top-level run, routes exact typed
43
+ entities with one conservative lexical fallback, assembles literal cache-stable prompt blocks under
44
+ four explicit budgets, offers the bounded `load_knowledge` tool, and writes durable masked SQLite
45
+ run/invocation/domain/topic/load telemetry independently of rolling replay files. Pure replay stays
46
+ offline; a live tail fails closed without its recorded snapshot. The extension awaits its worker
47
+ queue and the compiled local CLI shares identical runner semantics without new subcommands.
48
+ **Stage 4 turned the ordinary Markdown editor into the authoring surface** — extension-only, no CLI
49
+ command. A declared document now shows its own interpretation (topics, effective type and its
50
+ origin, `use_when`, token estimates, exact entities that cross into the project), honest recorded
51
+ use from Stage 3 telemetry, folded metadata, dimmed exclusions, and actions that write
52
+ `type`/`use_when` and exclusions without moving a topic hash. The cost boundary is the design: a
53
+ keystroke parses the open buffer once per version and reads cached memory, while every SQLite read
54
+ runs on the index worker. Counts are raw co-occurrence — distinct completed runs for the headline,
55
+ invocations and earlier lineage versions in their own rows, no causal language anywhere. Nine
56
+ Stage 1, eleven Stage 2, eleven Stage 3 and eighteen Stage 4 focused tests pass under Node 24; 345
57
+ pass across every vscode-free suite. **One gate stays open: the visual smoke test
58
+ (light/dark/high-contrast) needs Peter's eyes — fixture at
59
+ [`demos/knowledge-editor`](demos/knowledge-editor).**
60
+ **Stage 5, the coverage panel, is the next dependency boundary and its cold-session handoff is
61
+ ready.** Reviewing it against the built code moved three things: the mock's `402 runs 94%` is two
62
+ different measurements plus one that does not exist anywhere (`K-20`), a panel row must be an
63
+ endpoint rather than an entity or it contradicts itself on the first screen (`K-48`), and the
64
+ "stale ref" list is where extractor false positives accumulate (`K-46`). Three gates need Peter
65
+ before code: those, plus CLI scope and `K-47`.
66
+ → **Stage 5 implementation handoff (start here next session):
67
+ [`Docs/to-be-built/knowledge-base-stage-5.md`](Docs/to-be-built/knowledge-base-stage-5.md).**
68
+ → **Stage 4 build record:
69
+ [`Docs/to-be-built/knowledge-base-stage-4.md`](Docs/to-be-built/knowledge-base-stage-4.md).**
70
+ → **Stage 3 build record:
71
+ [`Docs/to-be-built/knowledge-base-stage-3.md`](Docs/to-be-built/knowledge-base-stage-3.md).**
72
+ → Stage 2 build record: [`Docs/to-be-built/knowledge-base-stage-2.md`](Docs/to-be-built/knowledge-base-stage-2.md).
73
+ → Stage 1 build record: [`Docs/to-be-built/knowledge-base-stage-1.md`](Docs/to-be-built/knowledge-base-stage-1.md).
74
+ → Decision record: [`knowledge-base-refinement.md`](Docs/to-be-built/knowledge-base-refinement.md)
75
+ (`K-01`…`K-45`, every Stage 1/2 gate shut and the Stage 3 review carried forward). Reasoning lives
76
+ here; **do not re-litigate** — if a decision looks wrong, say so and stop.
77
+ → Design and the *why*: [`knowledge-base.md`](Docs/to-be-built/knowledge-base.md).
78
+
79
+ **The `K-28` spike answered its question — markdown cuts it, no custom renderer.** It and the
80
+ `playground/knowledgeBase/` development corpus were deleted at the Stage 1 gate. Its durable
81
+ findings remain in skill `norn-editor-decorations`; production knowledge code shares no spike
82
+ foundation.
83
+
84
+ Two decisions the spike overturned, both worth knowing before reading anything else: per-topic
85
+ metadata sits **inline under each heading** (`K-13`), which removed the binding-key problem rather
86
+ than solving it; and **depth counts** for domains (`K-30`), so a folder inside a domain is a
87
+ sub-domain and splitting an oversized domain actually works.
88
+ → **Refinement worksheet (start here): [`Docs/to-be-built/knowledge-base-refinement.md`](Docs/to-be-built/knowledge-base-refinement.md)**
89
+ → Parent spec: [`Docs/to-be-built/knowledge-base.md`](Docs/to-be-built/knowledge-base.md)
90
+ → Runtime floor and SQLite authority are recorded in `K-11` / `K-12` / `K-31`; Stage 2 applied
91
+ them and removed the temporary Stage 1 JSON store.
31
92
 
32
93
  ---
33
94
 
34
- ## Backlog / accepted-but-not-started
35
-
36
- ### 🧪 Agent WorkbenchSlice 5f: eval fixtures, docs, positioning
37
- **Postponed 2026-08-11; the MCP work it was waiting on finished 2026-08-12, and it now has a
38
- spec.** Slice 5 is otherwise complete and reported across every surface (5a, 5c, 5e built; 5b and
39
- 5d closed). 5f is smaller than its name suggests: the **website already documents `judge` well**,
40
- and a deterministic judge server already exists as a test fixture — so what is left is promoting
41
- that fixture to a demo anyone can run with **no API key** (one clearly-good case, one clearly-bad
42
- one), a README section that catches up with the website, and the explanation of what evals are
43
- for. **No `src/` change.** The spec leads with the constraint that matters: Norn's positioning is
44
- locked, so "positioning" here means explaining evals *from* the spine, never a new pitch.
45
- → **5f spec: [`Docs/to-be-built/agent-workbench-slice-5f.md`](Docs/to-be-built/agent-workbench-slice-5f.md)**
46
- → Slice 5 spec: [`Docs/to-be-built/agent-workbench-slice-5.md`](Docs/to-be-built/agent-workbench-slice-5.md)
47
- → Built: [`5a`](Docs/to-be-built/agent-workbench-slice-5a.md) ·
48
- [`5c`](Docs/to-be-built/agent-workbench-slice-5c.md) ·
49
- [`5e`](Docs/to-be-built/agent-workbench-slice-5e.md)
95
+ ## Backlog / awaiting acceptance
96
+
97
+ _Nothing awaiting acceptance._ (Slice 5f was scrapped 2026-08-15 it had decayed into a reminder
98
+ to update docs. Docs get reviewed as one pass when the website is updated for the knowledge base.
99
+ Its spec remains at [`agent-workbench-slice-5f.md`](Docs/to-be-built/agent-workbench-slice-5f.md)
100
+ if it is ever wanted.)
50
101
 
51
102
  ## Parked
52
103
 
@@ -58,6 +109,27 @@ narrative and how to resume:
58
109
 
59
110
  ## Recently done
60
111
 
112
+ - **3.2.0 — the knowledge base ships, quietly** (2026-08-19) — **done.** Stages 1–4 of the
113
+ Knowledge Base are in the published build: declared `knowledge` blocks in `.nornagent`,
114
+ the project-global SQLite authority, grant-scoped routing with the bounded `load_knowledge`
115
+ tool, and the Markdown authoring surface. **Deliberately undocumented in public** — Peter's
116
+ call at release time. Stages 5–8 are unbuilt and the coverage panel is still the next
117
+ dependency boundary, so the website says nothing about it and neither does the README. The
118
+ feature is reachable by anyone who writes the block; that is accepted, not overlooked.
119
+ **Agent graph details now open on click, not hover.** The 650ms open delay and 120ms hide
120
+ delay are gone: the reader either waited on a canvas that looked inert or was chased across
121
+ it by a popover they never asked for. A second click closes, Escape dismisses, and the
122
+ navigation that used to live on the tile — reveal source, step replay, reveal declaration —
123
+ is now one labelled button in the detail footer, so a tile has exactly one gesture. The
124
+ website's two "hover an agent or a boundary" sentences were updated to match, and the
125
+ response panel's agent invocation tree got the docs line it never had.
126
+ Verified at 426 Extension Host tests and 198/200 regression; the two failures are the live
127
+ SQL Server Docker fixture, which was not running and was accepted as a known failure.
128
+
129
+ - **Agent results view** (2026-08-14; performance follow-up 2026-08-15) — **done.** The normal
130
+ response panel has a safe themed invocation tree; rows/details now start collapsed and large
131
+ MCP values remain host-side until reveal/copy. Streamed contract/agent rows also have distinct
132
+ toggle identities. → [Spec](Docs/to-be-built/agent-results-view.md)
61
133
  - **3.1.0 — MCP authoring parity, and the changelog is gone** (2026-08-13) — **done.**
62
134
  Three fixes that all came out of one painful hour authoring a real server by hand. **`header`
63
135
  now reads like HTTP**: `header Name: value` is accepted alongside the original no-colon form,
@@ -147,61 +219,5 @@ narrative and how to resume:
147
219
  tests; 141 pass across every runnable suite, plus type-check, lint, bundles, regression, skill
148
220
  validation, and a real CLI run against a deterministic judge server.
149
221
  → [`Docs/to-be-built/agent-workbench-slice-5c.md`](Docs/to-be-built/agent-workbench-slice-5c.md)
150
- - **Agent Workbench Slice 5a — eval authoring** (2026-08-10) — **done.**
151
- `judge <subject> with <Agent> expects "…"` in `.norn` sequences — **one line, like `assert`**,
152
- with `expects file <path>` for a list. Built as a `judge … end judge` block first and reworked
153
- on Peter's correction: the sequence is the orchestrator, so it stays a flat list of steps
154
- rather than nesting a mini-language. Expectations are ordinary Norn strings, file lists resolve
155
- at parse time with per-expectation origins, plus eleven `judge-*` diagnostics, grammar,
156
- completions, hover, and CLI/JSON step output. Driven by Peter's answer that the first eval is a
157
- checklist — all expectations must be met, exceeding them is not a failure. Reuse held:
158
- expectation strings go through `agentPromptBlock.ts`'s existing escaping rather than a second
159
- stack, one shared module serves runner/diagnostics/completions/hover, and statements validate
160
- in the existing agent preflight so a malformed eval cannot spend a model call. A judge step
161
- reports as explicitly *not judged* until 5c rather than silently passing. 15 new focused tests;
162
- 123 pass across every runnable suite, plus type-check, lint, bundles, regression, and skill
163
- validation.
164
- → [`Docs/to-be-built/agent-workbench-slice-5a.md`](Docs/to-be-built/agent-workbench-slice-5a.md)
165
- - **Agent Workbench Slice 4** (2026-08-09) — **done and reviewed.**
166
- Default-on, secret-safe recordings under `.norn-cache/runs`; fixed 20-run retention;
167
- byte-identical offline replay with zero provider/MCP side effects; strict CLI replay with JSON,
168
- environment restoration, graph-drift failure, and live `--from`; agent frames/scopes,
169
- breakpoints, stepping, and contract-failure navigation in the existing DAP; paused-hop canvas
170
- highlighting and validated node-to-invocation navigation. Review: replay is a clean
171
- `AgentProviderAdapter` with no runtime special-casing; the debugger is the existing DAP session
172
- extended, not a second one; secrets are stable placeholders re-substituted from `.nornenv` at
173
- replay time behind a preflight that fails naming the missing variables; and the debugger became
174
- the third surface consuming the shared `agentHopPresentation` helper. 55 focused tests pass
175
- across all agent suites, plus type-check, lint, and bundle build.
176
- → [`Docs/to-be-built/agent-workbench-slice-4.md`](Docs/to-be-built/agent-workbench-slice-4.md)
177
- - **Agent Workbench Slice 3** (2026-08-09) — **done and reviewed.**
178
- Read-only VS Code agent canvas with parser-first static graphs, redacted live/completed trace
179
- overlays, deterministic cycle-safe layout, first-class contract states, hover/copy payloads,
180
- source navigation, command and CodeLens entry points, and shared response-panel presentation.
181
- Recovery resolves successful correction invocations rather than trusting a flag. Review: the
182
- shared `agentHopPresentation` helper is consumed by both the canvas and the response panel so
183
- they cannot drift; the trace is redacted before anything reads it; CSP is `default-src 'none'`
184
- with nonce'd scripts and no external hosts; no graph library was added; the panel never writes.
185
- 43 focused tests pass across all agent suites, plus type-check, lint, and bundle build.
186
- → [`Docs/to-be-built/agent-workbench-slice-3.md`](Docs/to-be-built/agent-workbench-slice-3.md)
187
- - **Agent Workbench Slice 2** (2026-08-08) — **done and reviewed.**
188
- Model-directed agent-as-tool delegation, two-way boundary correction, subtree conversations,
189
- configurable spend guards, recursive CLI/JSON/response-panel traces, language tooling, docs,
190
- and a deterministic violate → correct → pass demo. Review: sub-agents go through the same tool
191
- path as MCP tools, config precedence is agent → provider → global → built-in, parallel tool use
192
- is disabled on both adapters, and the runner was extracted to `src/agents/agentRunner.ts` rather
193
- than growing `sequenceRunner`. 32 focused tests pass; the language suite needs the VS Code host.
194
- `max_tokens` default stays 16000 — a real OpenAI model rejected 32000 and reported a 16384
195
- cap, so the generous default was walked back; raise it per-provider where a model allows it.
196
- → [`Docs/to-be-built/agent-workbench-slice-2.md`](Docs/to-be-built/agent-workbench-slice-2.md)
197
- - **Agent Workbench Slice 1** (2026-08-08) — **done and verified running by Peter.**
198
- `.nornagent` definitions, linear agent `run` handoffs, OpenAI/local/Anthropic/Google adapters,
199
- MCP tools, automatic boundary contracts, live CLI + JSON traces, language tooling, focused
200
- tests, and a runnable demo. Reviewed: reuse held (contracts go through `matchesSchema` and the
201
- existing Contract View path), provider interface held (Google landed later as a pure new file).
202
- → [`Docs/to-be-built/agent-workbench-slice-1.md`](Docs/to-be-built/agent-workbench-slice-1.md)
203
- - **Website k8s de-promotion** (2026-08-07) — promo surfaces stripped and deployed; docs
204
- and functionality untouched. Was Phase 0 of the marketing plan.
205
-
206
222
  ---
207
- _Last updated: 2026-08-12_
223
+ _Last updated: 2026-08-15_
@@ -0,0 +1,74 @@
1
+ # The knowledge editor
2
+
3
+ A knowledge base small enough to read in a minute, written to show every state the Stage 4
4
+ editor can be in. Open the files in [`handbook/`](./handbook) and the ordinary Markdown editor
5
+ gains chips, hovers, folded metadata, dimmed exclusions and underlined entities — no custom
6
+ editor, no preview pane, no new file type.
7
+
8
+ Membership comes from [`agents.nornagent`](./agents.nornagent) and nothing else:
9
+
10
+ ```nornagent
11
+ knowledge Handbook
12
+ source ./handbook
13
+ exclude **/*.draft.md
14
+ end knowledge
15
+ ```
16
+
17
+ The folder is called `handbook`, not `knowledge`. That is the point — a path convention never
18
+ activates the editor, and a frontmatter marker never activates it either. The declaration does.
19
+
20
+ ## What each file demonstrates
21
+
22
+ | File | What to look at |
23
+ |---|---|
24
+ | `handbook/payments/charges.md` | H1 and H2 treatment, a multi-line `norn:meta` block folded behind its marker, a single-line one, an excluded section, and underlined entities that cross into `api.nornapi` and `.nornenv` |
25
+ | `handbook/payments/refunds/policy.md` | A sub-domain. `payments/refunds` is its own domain, shown separately from `payments` — loading the parent never loads the child |
26
+ | `handbook/ops/runbook.md` | No H1, so document feedback moves to a CodeLens at the top instead of chips on a title line |
27
+ | `handbook/ops/retired.md` | A whole-file exclusion: the document dims, stays editable, and raises no error |
28
+ | `handbook/ops/flow.svg` | A declared member whose extension produces no topics — inside the base, no editor surface |
29
+ | `handbook/payments/pricing-tiers.draft.md` | Excluded by the declaration's glob, so it is plain Markdown again |
30
+
31
+ ## See the raw text
32
+
33
+ **Norn: Knowledge: Toggle Markup** puts the `##` markers and the `norn:meta` blocks back on screen
34
+ with the chips still in place. It is also how you check the surface still works without the
35
+ unsupported style injection that hides them.
36
+
37
+ ## Try the authoring actions
38
+
39
+ On any topic heading, the lightbulb offers:
40
+
41
+ - **Change topic type…** — writes `type:` into the adjacent metadata block, creating the block if
42
+ there isn't one. The topic hash does not move, because metadata is stripped before hashing.
43
+ - **Add/Edit use_when…** — the sentence the router reads when no exact entity matches.
44
+ - **Exclude topic** / **Include topic** — the marker is placed below any metadata block, so the
45
+ metadata stays bound to its heading.
46
+
47
+ Inside a `norn:meta` block, completions offer `type` and `use_when`, and `task`/`reference`/
48
+ `concept` after `type:`.
49
+
50
+ ## Recorded use
51
+
52
+ Every count in the editor is raw co-occurrence read back from Stage 3 run telemetry: these runs
53
+ loaded this text. Norn does not claim the text changed their outcome — that question belongs to
54
+ Stage 8. Until you run something, the honest state is what you'll see:
55
+
56
+ > No knowledge runs recorded yet.
57
+
58
+ To fill it in, point the `Support` model at a provider you have keys for and run the sequence:
59
+
60
+ ```bash
61
+ node ./dist/cli.js demos/knowledge-editor/support.norn --env prelive
62
+ ```
63
+
64
+ Then reopen `handbook/payments/charges.md`: the title line gains a pill —
65
+ `Loaded by 1 run (1 succeeded · 0 failed)` — and each topic hover shows its own invocations and,
66
+ if you have since edited a topic, its earlier versions in a separate row.
67
+
68
+ ## Inspect the same base from the CLI
69
+
70
+ ```bash
71
+ node ./dist/cli.js knowledge ls --explain demos/knowledge-editor/agents.nornagent
72
+ ```
73
+
74
+ Stage 4 adds no CLI command: the editor is a VS Code surface over the same index.
@@ -0,0 +1,16 @@
1
+ model Support
2
+ provider openai
3
+ name gpt-4.1-mini
4
+ end model
5
+
6
+ knowledge Handbook
7
+ source ./handbook
8
+ exclude **/*.draft.md
9
+ end knowledge
10
+
11
+ agent SupportEngineer
12
+ model Support
13
+ knowledge Handbook
14
+ describe "Answer payment support questions from the handbook."
15
+ system "You are a payments support engineer. Answer only from the handbook you were given."
16
+ end agent
@@ -0,0 +1,10 @@
1
+ headers Json
2
+ Content-Type: application/json
3
+ Idempotency-Key: {{$env.IDEMPOTENCY_KEY}}
4
+ end headers
5
+
6
+ endpoints
7
+ CreateCharge: POST /v1/charges
8
+ GetRefund: GET /v1/refunds/{id}
9
+ CancelCharge: DELETE /v1/charges/{id}
10
+ end endpoints
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="120" height="40"><text x="4" y="24" font-size="14">charge flow</text></svg>
@@ -0,0 +1,9 @@
1
+ <!-- norn:exclude -->
2
+
3
+ # Retired: the old settlement runbook
4
+
5
+ Excluded as a whole file, so the entire document dims. It is still ordinary Markdown you can
6
+ read and edit — it simply contributes nothing to any run.
7
+
8
+ ## Nightly settlement
9
+ We stopped running nightly settlement when the gateway moved to continuous capture.
@@ -0,0 +1,14 @@
1
+ <!-- A file with no H1: the document feedback moves to a CodeLens at the top and the source
2
+ stays untouched. -->
3
+
4
+ ## Gateway timeouts
5
+ <!-- norn:meta
6
+ type: task
7
+ use_when: the payment gateway is timing out
8
+ -->
9
+ 1. Check the gateway dashboard before touching anything.
10
+ 2. Retry once. A second timeout is an incident, not a retry.
11
+ 3. HTTP status 504 from `payment-svc` means the gateway, not us.
12
+
13
+ ## Who to wake
14
+ The on-call rota lives in the team handbook. Wake the payments on-call, not the platform one.
@@ -0,0 +1,25 @@
1
+ # Charges
2
+
3
+ The charge lifecycle, written for a support engineer who has the customer on the line.
4
+
5
+ ## Create a charge
6
+ <!-- norn:meta
7
+ type: task
8
+ use_when: creating a charge, or retrying one that failed
9
+ -->
10
+ 1. Send `POST /v1/charges` with the amount in minor units.
11
+ 2. Always send the header `Idempotency-Key`. A retry without one can charge twice.
12
+ 3. A success is HTTP status 201 and a charge id in the body.
13
+
14
+ The service `payment-svc` owns this endpoint in the `prelive` environment, and the key comes
15
+ from {{$env.IDEMPOTENCY_KEY}}.
16
+
17
+ ## What CARD_DECLINED means
18
+ <!-- norn:meta type: reference -->
19
+ The error code "CARD_DECLINED" is the issuer's answer, not ours. Nothing we retry will change
20
+ it inside the same hour, so the customer needs a different card or their bank.
21
+
22
+ ## Legacy charge lookup
23
+ <!-- norn:exclude -->
24
+ The endpoint `GET /v1/charges/legacy` was retired in 2024. Kept for archaeology; excluded from
25
+ the knowledge base so no agent quotes it back to a customer.
@@ -0,0 +1,7 @@
1
+ # Pricing tiers (draft)
2
+
3
+ Excluded by the declaration's `exclude **/*.draft.md` glob, so this file is not a member at
4
+ all: no chips, no CodeLens, no hovers. It is a plain Markdown file again.
5
+
6
+ ## Tier 2
7
+ Numbers not agreed yet.
@@ -0,0 +1,12 @@
1
+ # Refunds
2
+
3
+ ## When we refund without asking
4
+ <!-- norn:meta
5
+ type: reference
6
+ use_when: deciding whether a refund needs approval
7
+ -->
8
+ Under £50, refund it. The endpoint is `GET /v1/refunds/{id}` to check state first, and the
9
+ service is `payment-svc`.
10
+
11
+ ## Partial refunds
12
+ Split the amount across the original charge. A partial refund still returns HTTP status 200.
@@ -0,0 +1,10 @@
1
+ [CreateCharge]
2
+ POST {{BASE_URL}}/v1/charges
3
+ content-type: application/json
4
+ Idempotency-Key: {{$env.IDEMPOTENCY_KEY}}
5
+
6
+ {"amount": 1200, "currency": "gbp"}
7
+
8
+ sequence AnswerASupportQuestion
9
+ run SupportEngineer "A charge came back CARD_DECLINED. What should the customer do?"
10
+ end sequence