kaloko 0.5.0 → 0.5.2

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/README.md CHANGED
@@ -210,6 +210,34 @@ link) and reads names from the accessibility tree. Pixel diffs skip the
210
210
  regions a step ignores; `kaloko walk --stability 3` and `kaloko stability`
211
211
  find the clocks, ads and carousels worth ignoring.
212
212
 
213
+ ## A changelog with pictures
214
+
215
+ Your accepted runs already hold every screen of the release. `CHANGELOG.md`
216
+ can show them: a picture names a step instead of a file, and Kaloko shows the
217
+ accepted capture of it.
218
+
219
+ ```markdown
220
+ - You can pay with Apple Pay in the checkout.
221
+ ![before](kaloko:checkout/payment?version=prev) ![after](kaloko:checkout/payment)
222
+ ```
223
+
224
+ ```bash
225
+ npx kaloko changelog draft # the Unreleased entry: merged PRs and changed screens, before and after
226
+ npx kaloko changelog draft --apply # the same, written into CHANGELOG.md (Keep a Changelog)
227
+ npx kaloko release 2.4.0 # record the release and its pictures; prints the changelog page
228
+ ```
229
+
230
+ The draft groups pull requests and commits (Conventional Commits when you
231
+ use them) into Added, Changed, Fixed and Removed; your agent rewrites the
232
+ lines for people. The version comes from what the repository already uses
233
+ (git tags, `package.json`, release-please, changesets, semantic-release);
234
+ when a release tool owns `CHANGELOG.md`, Kaloko only reads it. The page on
235
+ kaloko.app has a slider between before and after, switches language and
236
+ screen size, and links each picture to its flow on the canvas. Share it with
237
+ guests, readers from your company's domain, or publish it with a feed.
238
+ Repositories with several apps list them under `products:` in
239
+ `kaloko.config.yml`.
240
+
213
241
  ## Design (Kaloko Design)
214
242
 
215
243
  Design the screens of a flow as live HTML with your own agent and skills, in the same scenario that development
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kaloko",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "description": "See what your AI agents built: every screen, language and device walked, assessed and approved on one canvas.",
5
5
  "keywords": [
6
6
  "qa",
@@ -9,6 +9,13 @@
9
9
  "schema": { "const": "qawalk.config.v1" },
10
10
  "org": { "type": "string", "description": "Organization slug on kaloko.app." },
11
11
  "project": { "type": "string" },
12
+ "products": {
13
+ "type": "object",
14
+ "description": "Optional: what is released and versioned as a whole and has its own visual changelog (docs/DOCS-CHANGELOG.md). Without it the project is the product. Keys are product slugs.",
15
+ "propertyNames": { "pattern": "^[a-z0-9][a-z0-9._-]{0,79}$" },
16
+ "additionalProperties": { "$ref": "#/$defs/product" }
17
+ },
18
+ "docs": { "$ref": "#/$defs/docs" },
12
19
  "scenarios": { "type": "array", "items": { "type": "string" }, "description": "Glob patterns of scenario files." },
13
20
  "output": { "type": "string", "description": "Run folder; default tmp/kaloko (tmp/qawalk when only that one exists)" },
14
21
  "browser": {
@@ -106,6 +113,45 @@
106
113
  }
107
114
  },
108
115
  "$defs": {
116
+ "product": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "properties": {
120
+ "name": { "oneOf": [{ "type": "string" }, { "type": "object", "additionalProperties": { "type": "string" }, "description": "Name per language, e.g. { en: Web shop, cs: E-shop }." }] },
121
+ "version": {
122
+ "type": "object",
123
+ "additionalProperties": false,
124
+ "description": "Where the product's version comes from. Default: detected (release-please, changesets, semantic-release, package.json, pyproject.toml, Cargo.toml, else git tags v*).",
125
+ "properties": {
126
+ "source": { "enum": ["auto", "git-tag", "package.json", "release-please", "changesets", "semantic-release", "pyproject", "cargo", "gemspec", "manual"] },
127
+ "path": { "type": "string", "description": "File that holds the version (package.json of the app, the release-please manifest)." },
128
+ "pattern": { "type": "string", "description": "Git tag pattern with one *, e.g. shop-v* (default v*)." }
129
+ }
130
+ },
131
+ "docs": { "$ref": "#/$defs/docs" },
132
+ "project": { "type": "string", "description": "The Kaloko project people review this product in." },
133
+ "projects": { "type": "array", "items": { "type": "string" }, "description": "Several projects that work on this product." },
134
+ "modules": { "type": "array", "items": { "type": "string" } },
135
+ "reference_env": { "type": "string", "description": "Environment whose accepted runs the pictures come from (default: any)." },
136
+ "default_scenario": { "type": "string", "description": "Scenario of short step references (kaloko:<step>)." },
137
+ "publish": { "enum": ["members", "domain", "public"], "description": "Who reads the changelog on Kaloko; domain and public need an admin on the service." }
138
+ }
139
+ },
140
+ "docs": {
141
+ "type": "object",
142
+ "additionalProperties": false,
143
+ "description": "Visual changelog and docs settings (all optional).",
144
+ "properties": {
145
+ "dir": { "type": "string", "description": "Docs sources (default docs)." },
146
+ "changelog": { "type": "string", "description": "Changelog file (default CHANGELOG.md)." },
147
+ "style": { "enum": ["keep-a-changelog", "release-notes"] },
148
+ "version_source": { "enum": ["auto", "git-tag", "package.json", "release-please", "changesets", "semantic-release", "pyproject", "cargo", "gemspec", "manual"] },
149
+ "languages": { "type": "array", "items": { "type": "string" } },
150
+ "framework": { "enum": ["auto", "docusaurus", "vitepress", "mkdocs", "nextra", "plain"] },
151
+ "publish": { "enum": ["members", "domain", "public"], "description": "Who reads the changelog on Kaloko; domain and public need an admin on the service." },
152
+ "images": { "type": "object", "additionalProperties": false, "properties": { "viewport": { "type": "string" }, "locale": { "type": "string", "description": "reader (the reader's language) or a locale." } } }
153
+ }
154
+ },
109
155
  "record": {
110
156
  "description": "Recordings of walked steps (opt-in): true or step records each step from the previous screen to its capture; flow records the whole walk per locale with a chapter per step; failed keeps only steps that fail; false or off turns it off. Uploaded on Business and Enterprise.",
111
157
  "oneOf": [
@@ -58,6 +58,14 @@
58
58
  },
59
59
  "archived": {
60
60
  "type": "boolean"
61
+ },
62
+ "product": {
63
+ "type": ["string", "null"],
64
+ "description": "Product the flow documents (scenario product tag, or the only product of the config)."
65
+ },
66
+ "module": {
67
+ "type": ["string", "null"],
68
+ "description": "Module of the product (scenario module tag)."
61
69
  }
62
70
  }
63
71
  },
@@ -166,6 +166,14 @@
166
166
  "$ref": "#/$defs/slug",
167
167
  "description": "Optional project this flow belongs to; overrides `project` from kaloko.config.yml and the repository name for its runs."
168
168
  },
169
+ "product": {
170
+ "$ref": "#/$defs/slug",
171
+ "description": "Product this flow documents (a key of `products:` in kaloko.config.yml). The visual changelog and docs of that product use its steps; with one product in the config, untagged flows belong to it."
172
+ },
173
+ "module": {
174
+ "$ref": "#/$defs/slug",
175
+ "description": "Module of the product (one of its `modules:`), for changelog and docs sections per module."
176
+ },
169
177
  "capture": {
170
178
  "$ref": "#/$defs/capture"
171
179
  }
@@ -16,7 +16,9 @@ description: >
16
16
  reference, checking implementation against it), and when implementing a
17
17
  screen that has an approved design (read the step spec, build with its
18
18
  tokens, check drift), and when a step should be recorded on video or its
19
- trace read (actions, requests, console).
19
+ trace read (actions, requests, console), and when a user-visible change
20
+ should land in the visual changelog (CHANGELOG.md with step references,
21
+ kaloko changelog draft, kaloko release) or a guide should show a step.
20
22
  ---
21
23
 
22
24
  # Kaloko
@@ -37,6 +39,11 @@ the canvas, storage and collaboration are the service.
37
39
  for them (`kaloko share` prints it; `kaloko review` repeats it), and you
38
40
  read `kaloko feedback` and `kaloko inbox` before continuing on that task.
39
41
  - Changes to intent are written back to `ACCEPTANCE.md` (change log row).
42
+ - When the project keeps a visual changelog (`CHANGELOG.md`, `docs:` or
43
+ `products:` in the config) and the change is user-visible: the Unreleased
44
+ entry says it for people, with step references for the screens it changed
45
+ (`kaloko changelog draft`), and new scenarios carry `product:` (and
46
+ `module:`) when the config has products.
40
47
  - When you implemented a step from an approved design: you read its spec
41
48
  (`kaloko spec <step>`), walked the implementation with `packs: [design]`,
42
49
  and `kaloko drift` is clean or the PR names each difference left for a
@@ -52,7 +59,8 @@ Start the shared browser, walk a scenario on a non-production environment,
52
59
  create test data there (users, roles, carts), capture screens and e-mails,
53
60
  evaluate, build the preview, and fix scenario mechanics (selectors, scripts)
54
61
  that do not change what is being accepted, including applying a selector
55
- proposal with `kaloko walk --heal` when it names the same element. Walk only
62
+ proposal with `kaloko walk --heal` when it names the same element, and pulling
63
+ the regions people drew to ignore into the scenario (`kaloko stability --pull`). Walk only
56
64
  the steps a change reaches (`--affected`) and import screenshots into a run. Record steps locally
57
65
  (`walk --record`) when a screenshot cannot show what a person has to judge, read traces, and
58
66
  export a walkthrough video into the run folder. On a design environment: change
@@ -60,6 +68,8 @@ the design folder, walk, and sync the draft (including taking others' steps
60
68
  with `--theirs`). Move to the trash runs you uploaded in this session that
61
69
  were superseded before anyone looked at them (debug rounds: no comments, no
62
70
  verdict), and run `kaloko prune` without `--yes` to see what a clean-up would do.
71
+ Draft and edit the Unreleased section of the changelog (`kaloko changelog draft
72
+ --apply`) and add step references to it and to guides.
63
73
 
64
74
  ## Ask first
65
75
 
@@ -69,11 +79,13 @@ replacing a CI workflow (`kaloko ci github|gitlab`), uploading with
69
79
  design reference or baseline, merging a design branch, keeping your version of
70
80
  a step in a sync conflict (`--mine`), turning on `html_view`, turning on recordings for
71
81
  a whole project (`capture.record` in the config: storage), a real clean-up
72
- (`kaloko prune --yes`), trashing someone else's run, archiving a scenario, and
82
+ (`kaloko prune --yes`), trashing someone else's run, archiving a scenario,
83
+ recording a release (`kaloko release`) or asking to publish a changelog, and
73
84
  anything the environment profile blocks. Never trash an accepted run, a
74
85
  baseline, a run with review comments, or a run linked from an open PR or issue
75
86
  comment. Never approve a
76
- step or accept a run on a person's behalf; report what waits for them
87
+ step or accept a run on a person's behalf, and never hand out a signed
88
+ acceptance record (`kaloko signoff`) for a run a person has not accepted; report what waits for them
77
89
  (`kaloko review`, MCP `get_review_queue`) instead. Ask the person
78
90
  for secret values (passwords, tokens, gate credentials) and for sign-ins only
79
91
  they can do; never write secrets into the config, a scenario or a script.
@@ -118,6 +130,10 @@ they can do; never write secrets into the config, a scenario or a script.
118
130
  [reference/collaboration.md](reference/collaboration.md)
119
131
  - Reading runs, feedback and the inbox over MCP instead of the CLI:
120
132
  [reference/mcp.md](reference/mcp.md)
133
+ - The visual changelog and guides with step references (`kaloko:<scenario>/<step>`):
134
+ drafting the Unreleased entry, templates for entries, client release notes and
135
+ how-tos, products, modules and versions, who reads it:
136
+ [reference/docs.md](reference/docs.md)
121
137
  - Refreshing a manual, course or product documentation from the newest
122
138
  captures (latest URLs, changed steps, webhooks, export):
123
139
  [reference/documentation.md](reference/documentation.md)
@@ -342,5 +342,7 @@ design pixel check (`AC801`) leave them out:
342
342
 
343
343
  Do not guess them: `kaloko walk --stability 3` notes what moves while the
344
344
  page sits still, and `kaloko stability` compares the step with earlier runs
345
- and writes suggestions (see [execution.md](execution.md)). Ignore only noise;
346
- a region that matters to a criterion stays in.
345
+ and writes suggestions (see [execution.md](execution.md)). Reviewers can also
346
+ draw a region on a screenshot on kaloko.app; `kaloko stability --pull` writes
347
+ those into `ignore:`. Ignore only noise; a region that matters to a criterion
348
+ stays in.
@@ -72,8 +72,11 @@ comments; at the end they accept or return the run.
72
72
  Comments are threads in three places:
73
73
 
74
74
  - **A step:** optionally pinned to a position on the screenshot
75
- (`pin: {x, y}` as fractions, per viewport) or to an element of a live
76
- design step (`anchor`).
75
+ (`pin: {x, y}` as fractions, per viewport), drawn on it (a box, an arrow or
76
+ a line: `shape`, with `region` giving the area as fractions and in CSS
77
+ pixels of the page, and for an arrow the point it aims at), or attached to
78
+ an element of a live design step (`anchor`). Comments may carry images
79
+ (`attachments`, each with a download URL that needs the token).
77
80
  - **The whole run:** `node_id` is `''`.
78
81
  - **The whole flow:** these stay across runs, e.g. "add the empty-cart
79
82
  state".
@@ -85,8 +88,12 @@ said what.
85
88
 
86
89
  The loop, for every open thread:
87
90
 
88
- 1. **Understand it.** Open the canvas link when a pin or an element
89
- matters; the position is on the screenshot of that viewport and locale.
91
+ 1. **Understand it.** A `region` says exactly where to look: `px` is
92
+ `[x, y, width, height]` in CSS pixels of the captured page for that
93
+ viewport (`region.viewport`) and locale; find the element there in the
94
+ step's HTML or screenshot. Download attached images (a corrected copy, a
95
+ reference) before you change anything. Open the canvas link when a pin or
96
+ an element matters.
90
97
  2. **Fix it** in the code or the scenario. When the comment asks for a
91
98
  change of intent (criteria, scope), ask the person first.
92
99
  3. **Answer and close.** Use
@@ -181,14 +188,25 @@ e-mail works too). Use it when a step needs a decision from a specific person
181
188
  Put the relevant lines in the issue comment. On the canvas the same
182
189
  comparison is the **Compare** selector in the top bar (or `#cmp=<run>` in
183
190
  the URL): pixel differences per step, changed criteria, and a side-by-side
184
- or diff view in the lightbox. Pixel diffs are computed in the browser;
185
- nothing is uploaded.
191
+ or diff view in the lightbox, plus *Swipe* (a divider dragged across both
192
+ screenshots) and *Onion skin* (this run faded over the other). Pixel diffs
193
+ are computed in the browser; nothing is uploaded. **G** opens the grid: one
194
+ step in every locale and viewport at once, failing cells marked.
186
195
  - **Manual criteria** are decided on the canvas by a reviewer; treat a
187
196
  reviewer's `fail` like a failing deterministic check.
188
197
  - Admins may name **required approvers** per scenario (Settings). Such a
189
198
  run stays `pending` until every one of them approved; `kaloko feedback`
190
199
  prints `awaiting approval from: …`, so do not treat a single approval as
191
200
  acceptance there.
201
+ - An accepted run has a **signed acceptance record** (Business and up): the
202
+ run, scenario, commit and environment, who approved what and when (people
203
+ apart from tokens and agents, approvals carried over unchanged steps with
204
+ where they came from), criteria results, capture hashes and the hash of
205
+ `run.json`, signed with the service's Ed25519 key. `kaloko signoff <run>`
206
+ downloads the JSON and the PDF and checks them; `kaloko signoff --verify
207
+ <file>` checks a record someone handed over (public key at
208
+ `/.well-known/kaloko-signoff.json`). Give it to the person when they ask
209
+ for proof of acceptance; never create one for a run that is not accepted.
192
210
 
193
211
  ## Cleaning up runs
194
212
 
@@ -245,6 +263,17 @@ Everything above is available over the API with an organization token:
245
263
  (the whole flow), and per comment `PATCH`, `DELETE`, `POST …/<cid>/resolve`
246
264
  (with `note`) and `…/<cid>/reopen`; `GET /api/v1/orgs/<org>/comments?state=open|all&scenario=&run=&mine=1`
247
265
  across the organization. Lists of runs and scenarios carry `open_comments`.
266
+ A comment body may carry `shape` (`{kind: box, box: [x, y, w, h]}`,
267
+ `{kind: arrow, from, to}` or `{kind: pen, points}` in fractions, with
268
+ `viewport` and `size`) and `attachments` (ids from
269
+ `POST …/comments/attachments?name=<file>` with the image as the body: PNG,
270
+ JPEG, WebP or GIF up to 5 MB, counted in the plan's storage).
271
+ - `GET|POST /api/v1/orgs/<org>/runs/<id>/ignore-regions`,
272
+ `DELETE …/ignore-regions/<rid>`, `GET …/scenarios/<id>/ignore-regions[?state=all]`
273
+ and `POST …/scenarios/<id>/ignore-regions/applied` (`{ids}`): regions drawn
274
+ to leave out of pixel diffs (drawing needs Developer / Tester).
275
+ - `GET /api/v1/orgs/<org>/runs/<id>/signoff` (JSON), `…/signoff.pdf`,
276
+ `…/signoff.html`: the signed acceptance record of an accepted run.
248
277
  - `GET /api/v1/orgs/<org>/notifications[?unread=1]`, `POST` with
249
278
  `{"read": "all"}` or `{"read": [ids]}`
250
279
  - `GET /api/v1/orgs/<org>/runs[?project=&scenario=&kind=&verdict=&author=&environment=&branch=&q=][&latest=1]`
@@ -0,0 +1,127 @@
1
+ # Visual changelog and docs with step references
2
+
3
+ The project keeps `CHANGELOG.md` (and guides in `docs/`) in the repository. You write and update them as part of
4
+ normal work; Kaloko turns step references into pictures from accepted runs and shows the changelog as a page that
5
+ clients, support and marketing can read.
6
+
7
+ ## Step references
8
+
9
+ A picture in Markdown names a step instead of a PNG file:
10
+
11
+ ```markdown
12
+ ![Payment](kaloko:checkout/payment) newest accepted capture
13
+ ![Payment](kaloko:checkout/payment?version=2.4.0) the capture of release 2.4.0
14
+ ![Payment](kaloko:checkout/payment?version=prev) the release before the one this entry belongs to
15
+ ![Payment](kaloko:checkout/payment?locale=cs&viewport=mobile&state=dark)
16
+ ![Payment](kaloko:payment) a step of the product's default_scenario
17
+ ```
18
+
19
+ `<scenario>` is the scenario id, `<step>` the node id. Without `locale` and `viewport` the reader's language and
20
+ the product's default screen are used. `state` picks a capture variant (`dark`, `webkit`, `reduce`: the values in
21
+ capture keys like `mobile.webkit.dark`). Check a reference with MCP `resolve_step_image` or
22
+ `GET /api/v1/orgs/<org>/steps/resolve?ref=…`: it answers the signed image URL, the run and how the version was found
23
+ (`release`, `app_version`, `reference_env`, `accepted`; `exact: false` means a fallback).
24
+
25
+ Never invent a step id or a version. Use ids from the scenario files and versions from `CHANGELOG.md` or git tags.
26
+
27
+ ## After a user-visible change
28
+
29
+ 1. Walk the affected steps and share the run as usual; a person accepts it on the canvas.
30
+ 2. `kaloko changelog draft` prints the Unreleased entry: merged pull requests and commits since the last release,
31
+ grouped Added / Changed / Fixed / Removed, plus before/after pictures of the screens that accepted runs show
32
+ differently (it needs a token for the pictures). `--apply` writes it into `CHANGELOG.md`.
33
+ 3. Edit the draft for people: what they can do now or what looks different, one change per line, no commit jargon.
34
+ Delete internal items (refactors, tests, CI). Keep the step references; move a picture under the line it shows.
35
+ Remove the `<!-- … -->` hints.
36
+ 4. Commit `CHANGELOG.md` with the change. At release time `kaloko release <version>` (ask first: it records the
37
+ release on Kaloko) turns Unreleased into the version, records its pictures and prints the changelog page.
38
+
39
+ `--since v2.3.0` drafts from another tag; `--product shop` picks a product when the config has several.
40
+
41
+ ## Templates
42
+
43
+ A changelog entry (Keep a Changelog):
44
+
45
+ ```markdown
46
+ ## [2.4.0] - 2026-10-12
47
+
48
+ ### Added
49
+
50
+ - You can pay with Apple Pay in the checkout. ([#412](https://github.com/acme/shop/pull/412))
51
+ ![Payment before](kaloko:checkout/payment?version=prev) ![Payment after](kaloko:checkout/payment)
52
+
53
+ ### Fixed
54
+
55
+ - The cart total no longer jumps while prices load on phones.
56
+ ![Cart](kaloko:checkout/cart?viewport=mobile)
57
+ ```
58
+
59
+ Release notes for a client (a sibling file, or the text of a release on your Git host):
60
+
61
+ ```markdown
62
+ # What's new in the web shop, October
63
+
64
+ Customers can pay with Apple Pay. The button sits above the card form on phones and computers.
65
+
66
+ ![Payment](kaloko:checkout/payment?locale=cs)
67
+
68
+ Also fixed: the cart total no longer jumps on phones.
69
+ ```
70
+
71
+ A how-to guide (`docs/how-to/pay-with-apple-pay.md`):
72
+
73
+ ```markdown
74
+ # Pay with Apple Pay
75
+
76
+ 1. Open the cart and choose **Checkout**.
77
+ ![Cart](kaloko:checkout/cart)
78
+ 2. Choose **Apple Pay** above the card form and confirm on your phone or Mac.
79
+ ![Payment](kaloko:checkout/payment)
80
+ ```
81
+
82
+ Rules: write for the person using the product; one change per line; before/after pictures for changes people see;
83
+ no internal names, prices or numbers you cannot show.
84
+
85
+ ## Products, modules and versions
86
+
87
+ Without `products:` in `kaloko.config.yml` the project is the product and `CHANGELOG.md` in the root is its
88
+ changelog. Pick the pattern that fits; tag new scenarios accordingly without asking each time:
89
+
90
+ 1. **One app, one team**: no products. Optional `docs: { changelog: CHANGELOG.md }`.
91
+ 2. **Monorepo with several apps**: one product per app, each with its version file and changelog; every scenario
92
+ says `product: <slug>`.
93
+ ```yaml
94
+ products:
95
+ shop:
96
+ name: { en: Web shop, cs: E-shop }
97
+ version: { source: package.json, path: apps/shop/package.json }
98
+ docs: { changelog: apps/shop/CHANGELOG.md }
99
+ project: eshop
100
+ reference_env: staging
101
+ admin:
102
+ version: { source: git-tag, pattern: "admin-v*" }
103
+ ```
104
+ 3. **Agency**: a project per client, a product per client deliverable; client guests of the project read only that
105
+ product's changelog.
106
+ 4. **Large app with modules**: one product with `modules: [checkout, account, …]`; scenarios carry
107
+ `product:` and `module:`; one combined release changelog with a section per module if the team wants it.
108
+
109
+ The version comes from what the repository already uses: release-please, changesets, semantic-release,
110
+ `package.json` (or pyproject/Cargo/gemspec), else git tags `v*`. When a release tool writes `CHANGELOG.md`, Kaloko
111
+ reads its entry and never rewrites the file; put your draft into the pull request or release notes instead.
112
+ `reference_env` says which environment the pictures come from (default: any accepted run).
113
+
114
+ `kaloko doctor` warns when a product's version cannot be read or a scenario names no product while several exist.
115
+
116
+ ## Readers
117
+
118
+ The changelog page (`/<org>/products/<product>/changelog`, or `/<org>/projects/<project>/changelog`) is read by
119
+ everyone who sees one of the product's projects, guests included. An admin of those projects may open it to
120
+ readers from the organization's verified domains or publish it (`/p/<org>/<product>/changelog` with an Atom feed;
121
+ not indexed until the organization allows it). `publish:` in the config only asks for it; an admin confirms on the
122
+ page. Never publish without the person asking.
123
+
124
+ ## MCP
125
+
126
+ `get_changelog` (releases with entries; `resolve: true` adds the pictures), `draft_changelog_entry` (the service's
127
+ half of a draft: changed screens with before/after references), `resolve_step_image` (one reference).
@@ -88,6 +88,7 @@ When pixel diffs between runs keep flagging the same clock, ad or carousel:
88
88
  kaloko walk --stability 3 # 3 screenshots per capture, a moment apart; what moved is noted
89
89
  kaloko stability # this run against the 3 previous local runs of the scenario
90
90
  kaloko stability --apply # adds the suggested ignore: to each step (block-style YAML only)
91
+ kaloko stability --pull # regions people drew on screenshots on kaloko.app go into ignore:
91
92
  ```
92
93
 
93
94
  `kaloko stability` writes `stability.json` and `stability.yml` into the run
@@ -98,6 +99,14 @@ changed is not noise. `--same-commit` compares only runs of the same commit,
98
99
  `--runs a,b` names them, `--last N` sets how many runs are compared. Capture
99
100
  the steps again after applying: the capture records the ignored regions.
100
101
 
102
+ People mark noise by hand too: a Developer / Tester draws a rectangle on a
103
+ screenshot (step detail → *Mark a changing region*). It is kept per flow, shows
104
+ dashed on every run and the canvas pixel diff already skips it.
105
+ `kaloko stability --pull` writes those regions into the scenario's `ignore:`
106
+ (appended to an existing block list, never twice) and tells the service they
107
+ are in the file; walk those steps again afterwards. MCP `list_ignore_regions`
108
+ lists them, `add_ignore_region` suggests one.
109
+
101
110
  ## Only what changed
102
111
 
103
112
  After a fix, walk the steps the change reaches instead of the whole flow:
@@ -33,6 +33,9 @@ file.
33
33
  | `decide_step` | records your (the agent's) decision on a step: `approve`, or `return` with a `note`; marked as an agent's and not counted as a person's. Never use it to approve for a person |
34
34
  | `revoke_carried_approval` | revokes an approval carried over to a step that looks unchanged but should be looked at again (`run_id`, `step`) |
35
35
  | `get_step_assets` | documentation layer (Business): newest capture of every step of a scenario with stable image, HTML and metadata URLs (`scenario`, `step`, `locale`, `viewport`, `accepted`) |
36
+ | `get_changelog` | the visual changelog of a product (`product`, `version`, `resolve: true` for the pictures, `limit`): releases newest first with the entry as written and its groups; see [docs.md](docs.md) |
37
+ | `draft_changelog_entry` | what accepted runs since the last release (or `since`) show differently, as a Keep a Changelog draft with before/after step references (`product`, `since`) |
38
+ | `resolve_step_image` | one step reference (`ref` = `kaloko:<scenario>/<step>?…`, `product`, `version`, `locale`, `viewport`) as a signed image URL with its run, how the version was found and canvas links |
36
39
  | `list_step_changes` | documentation layer: steps whose capture or status changed since the previous accepted run or `since` (`scenario`, `since`, `accepted`); see [documentation.md](documentation.md) |
37
40
  | `get_started` | where the organization stands (`empty`, `sample`, `active`), its sample run, the next steps and a prompt; call it in a new project, see [first-run.md](first-run.md) |
38
41
  | `add_sample_run` | adds the sample run (or returns the one there is); needs an upload or full token and the Developer / Tester role |
@@ -42,8 +45,11 @@ file.
42
45
 
43
46
  | Tool | Use |
44
47
  |---|---|
45
- | `list_comments` | open threads (or `state: all`) across the organization, filtered by `scenario` or `run_id`, with replies, pins, anchors and who wrote them |
46
- | `add_comment` | comment on a step (`run_id` + `step`), the whole run (`run_id`) or the whole flow (`scenario`); `parent_id` replies; optional `pin` `{ x, y, viewport }` |
48
+ | `list_comments` | open threads (or `state: all`) across the organization, filtered by `scenario` or `run_id`, with replies, pins, anchors, drawn regions (`region.px`: CSS pixels of the page in `region.viewport`), attached images with URLs, and who wrote them |
49
+ | `add_comment` | comment on a step (`run_id` + `step`), the whole run (`run_id`) or the whole flow (`scenario`); `parent_id` replies; optional `pin` `{ x, y, viewport }` or `shape` (box or arrow in fractions, with `viewport` and `size`) |
50
+ | `list_ignore_regions` | regions people drew to leave out of pixel diffs, per step, with the `ignore:` entry each becomes (`kaloko stability --pull` writes them) |
51
+ | `add_ignore_region` | suggest such a region (`run_id`, `step`, `viewport`, `rect` in CSS px); Developer / Tester, scope upload or full |
52
+ | `get_signoff_record` | the signed acceptance record of an accepted run (Business): approvals with provenance, criteria, capture hashes, signature |
47
53
  | `resolve_comment` | close a thread with a `note` that says what changed (it becomes the last reply) |
48
54
  | `reopen_comment`, `edit_comment`, `delete_comment` | reopen; edit or delete your own comment |
49
55