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 +1 -0
- package/NOW.md +92 -76
- package/demos/knowledge-editor/README.md +74 -0
- package/demos/knowledge-editor/agents.nornagent +16 -0
- package/demos/knowledge-editor/api.nornapi +10 -0
- package/demos/knowledge-editor/handbook/ops/flow.svg +1 -0
- package/demos/knowledge-editor/handbook/ops/retired.md +9 -0
- package/demos/knowledge-editor/handbook/ops/runbook.md +14 -0
- package/demos/knowledge-editor/handbook/payments/charges.md +25 -0
- package/demos/knowledge-editor/handbook/payments/pricing-tiers.draft.md +7 -0
- package/demos/knowledge-editor/handbook/payments/refunds/policy.md +12 -0
- package/demos/knowledge-editor/support.norn +10 -0
- package/dist/cli.js +4599 -1258
- package/dist/knowledgeIndexWorker.js +10966 -0
- package/package.json +18 -5
- package/playground/ai_orchastration.nornagent +6 -1
- package/playground/knowedge_base/ACDC/testing_notes_new_clients.md +11 -0
- package/schemas/norn.config.schema.json +66 -0
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
### 📚 Knowledge Base — the 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 /
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
spec
|
|
39
|
-
|
|
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-
|
|
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 @@
|
|
|
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,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
|