kaloko 0.14.0 → 0.16.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/README.md +6 -2
- package/package.json +1 -1
- package/schemas/config.v1.json +3 -1
- package/schemas/evidence.v1.json +257 -0
- package/schemas/run.v1.json +71 -1
- package/schemas/scenario.v1.json +52 -1
- package/skills/kaloko/SKILL.md +35 -6
- package/skills/kaloko/reference/acceptance.md +41 -30
- package/skills/kaloko/reference/apps.md +1 -1
- package/skills/kaloko/reference/design.md +2 -1
- package/skills/kaloko/reference/docs.md +24 -0
- package/skills/kaloko/reference/evaluation.md +42 -1
- package/skills/kaloko/reference/evidence.md +82 -0
- package/skills/kaloko/reference/first-run.md +37 -4
- package/skills/kaloko/reference/integrations.md +6 -1
- package/skills/kaloko/reference/mcp.md +5 -1
- package/skills/kaloko/reference/stacks.md +1 -1
- package/src/cli.mjs +172 -21
- package/src/lib/build.mjs +12 -4
- package/src/lib/capture.mjs +57 -4
- package/src/lib/changelog-core.mjs +12 -6
- package/src/lib/cli-args.mjs +7 -3
- package/src/lib/detail.mjs +102 -0
- package/src/lib/docs-export.mjs +2 -1
- package/src/lib/docs.mjs +14 -9
- package/src/lib/draft.mjs +1 -1
- package/src/lib/evaluate.mjs +7 -2
- package/src/lib/evidence-core.mjs +300 -0
- package/src/lib/git.mjs +1 -1
- package/src/lib/health-core.mjs +205 -0
- package/src/lib/health.mjs +219 -0
- package/src/lib/init-detect.mjs +336 -17
- package/src/lib/integrations-cli.mjs +3 -1
- package/src/lib/jev.mjs +4 -2
- package/src/lib/manifest-core.mjs +58 -12
- package/src/lib/pack-help.mjs +53 -51
- package/src/lib/packs.mjs +67 -55
- package/src/lib/pr.mjs +2 -0
- package/src/lib/projects-cli.mjs +88 -0
- package/src/lib/run.mjs +13 -1
- package/src/lib/scenario.mjs +8 -0
- package/src/lib/signoff.mjs +86 -6
- package/src/lib/util.mjs +6 -2
- package/templates/kaloko.config.yml +2 -0
- package/templates/scenario.yml +1 -1
- package/viewer/index.html +608 -63
package/skills/kaloko/SKILL.md
CHANGED
|
@@ -22,8 +22,13 @@ description: >
|
|
|
22
22
|
kaloko changelog draft, kaloko release) or a guide should show a step or
|
|
23
23
|
be written, translated or checked (kaloko docs check), when screenshots,
|
|
24
24
|
HTML or recordings must hide personal data (capture masks, pii: redact or
|
|
25
|
-
pseudonymize, kaloko share stopping on unmasked data),
|
|
26
|
-
Clef triage findings (experimental) to read, mention or answer
|
|
25
|
+
pseudonymize, kaloko share stopping on unmasked data), when a run has
|
|
26
|
+
Clef triage findings (experimental) to read, mention or answer, when
|
|
27
|
+
a run's health (the advisory checks of packs: SEO, accessibility,
|
|
28
|
+
performance, console) should be checked, fixed or adopted into acceptance,
|
|
29
|
+
and when a team's own repository turns runs into quality evidence for its
|
|
30
|
+
QMS or GxP (requirement refs, kaloko evidence, the evidence package, the
|
|
31
|
+
evidence.ready webhook).
|
|
27
32
|
---
|
|
28
33
|
|
|
29
34
|
# Kaloko
|
|
@@ -39,6 +44,9 @@ the canvas, storage and collaboration are the service.
|
|
|
39
44
|
- The captures are evaluated (`kaloko walk` ends with the verdicts; after
|
|
40
45
|
`kaloko capture` run `kaloko evaluate`) and `kaloko build` ran; you report the summary line,
|
|
41
46
|
failing criteria with evidence, and the preview path (or shared URL).
|
|
47
|
+
- Health was checked before you hand over (`kaloko health`, MCP `get_health`):
|
|
48
|
+
you fixed what your change can fix, and you report the remaining counts and
|
|
49
|
+
what is new since the previous run, apart from the verdicts.
|
|
42
50
|
- When the run was shared, its URL and the summary are in the issue or PR
|
|
43
51
|
the work belongs to, the person got the review-mode link with what waits
|
|
44
52
|
for them (`kaloko share` prints it; `kaloko review` repeats it), and you
|
|
@@ -81,19 +89,27 @@ verdict), and run `kaloko prune` without `--yes` to see what a clean-up would do
|
|
|
81
89
|
Draft and edit the Unreleased section of the changelog (`kaloko changelog draft
|
|
82
90
|
--apply`) and add step references to it and to guides. Put the products of the
|
|
83
91
|
config on Kaloko (`kaloko products sync`: it records no release) and list them
|
|
84
|
-
(`kaloko products list`).
|
|
92
|
+
(`kaloko products list`). Create the project the config names
|
|
93
|
+
(`kaloko projects sync` or `kaloko projects create` with the name the person
|
|
94
|
+
gave). Write, translate and fix
|
|
85
95
|
guides in the docs folder, run `kaloko docs check`, and export them for a docs
|
|
86
96
|
site (`kaloko export docs --format …`) into a local folder.
|
|
87
97
|
|
|
88
98
|
## Ask first
|
|
89
99
|
|
|
90
|
-
Changing acceptance criteria or scope
|
|
100
|
+
Changing acceptance criteria or scope (adopting a health check into
|
|
101
|
+
acceptance with `kaloko health adopt` is such a change; pulling checks a
|
|
102
|
+
person already adopted with `kaloko health pull` is not), removing a pack or
|
|
103
|
+
keeping one in acceptance (`health.acceptance`), any production run, writing or
|
|
91
104
|
replacing a CI workflow (`kaloko ci github|gitlab`), uploading with
|
|
92
105
|
`kaloko share` (on a design environment: publishing a version), setting a
|
|
93
106
|
design reference or baseline, merging a design branch, keeping your version of
|
|
94
107
|
a step in a sync conflict (`--mine`), turning on `html_view`, turning on recordings for
|
|
95
108
|
a whole project (`capture.record` in the config: storage), a real clean-up
|
|
96
109
|
(`kaloko prune --yes`), trashing someone else's run, archiving a scenario,
|
|
110
|
+
renaming a project or restricting it (`kaloko projects rename`, a `kaloko
|
|
111
|
+
projects sync` that would rename), picking one site of a repository that
|
|
112
|
+
holds several (ask which one before `kaloko init` or a walk),
|
|
97
113
|
recording a release (`kaloko release`) or asking to publish a changelog,
|
|
98
114
|
publishing docs (`kaloko docs publish`, `--reviewed` above all: it says a
|
|
99
115
|
person checked the text), writing a release workflow (`kaloko ci github
|
|
@@ -102,7 +118,8 @@ anything the environment profile blocks. Never trash an accepted run, a
|
|
|
102
118
|
baseline, a run with review comments, or a run linked from an open PR or issue
|
|
103
119
|
comment. Never approve a
|
|
104
120
|
step or accept a run on a person's behalf, and never hand out a signed
|
|
105
|
-
acceptance record (`kaloko signoff`) for a run a person has not accepted
|
|
121
|
+
acceptance record (`kaloko signoff`) for a run a person has not accepted, never present an AI verdict as a person's
|
|
122
|
+
decision in generated documents, and never change the signature policy; report what waits for them
|
|
106
123
|
(`kaloko review`, MCP `get_review_queue`) instead. Ask the person
|
|
107
124
|
for secret values (passwords, tokens, gate credentials) and for sign-ins only
|
|
108
125
|
they can do; never write secrets into the config, a scenario or a script. When
|
|
@@ -113,7 +130,11 @@ only when a person says that value may be uploaded.
|
|
|
113
130
|
|
|
114
131
|
- A new project or an organization without runs of its own (install, sign in,
|
|
115
132
|
the sample run, the first flow from a URL or a task, share, point the person
|
|
116
|
-
to the canvas)
|
|
133
|
+
to the canvas), and naming the project on Kaloko (`project_name:`,
|
|
134
|
+
`kaloko projects create|rename|sync`): [reference/first-run.md](reference/first-run.md)
|
|
135
|
+
- A repository with several sites or apps (monorepo, Rails engines, Folio
|
|
136
|
+
sites): ask which one, then `kaloko init --site … --base-url …`:
|
|
137
|
+
[reference/first-run.md#several-sites-in-one-repository](reference/first-run.md#several-sites-in-one-repository)
|
|
117
138
|
- Writing or updating the plan and scenario: [reference/acceptance.md](reference/acceptance.md)
|
|
118
139
|
- Android, iOS (Simulator or a real iPhone), Electron, macOS and Windows apps,
|
|
119
140
|
several devices of one app, WebViews inside apps, or screens captured by
|
|
@@ -131,6 +152,9 @@ only when a person says that value may be uploaded.
|
|
|
131
152
|
(`--heal`): [reference/execution.md](reference/execution.md)
|
|
132
153
|
- Evaluation, JEV thresholds, the vision evaluator and its reasons, reading
|
|
133
154
|
results: [reference/evaluation.md](reference/evaluation.md)
|
|
155
|
+
- Health (CS Kondice): the advisory checks of packs, `kaloko health`,
|
|
156
|
+
severities, fixing before review, adopting a check into acceptance, alerts:
|
|
157
|
+
[reference/evaluation.md#health](reference/evaluation.md#health)
|
|
134
158
|
- Clef triage findings (experimental): what they are, how to report them apart
|
|
135
159
|
from the verdicts, `get_findings` and `answer_finding`:
|
|
136
160
|
[reference/evaluation.md#triage-findings-experimental](reference/evaluation.md#triage-findings-experimental)
|
|
@@ -154,6 +178,11 @@ only when a person says that value may be uploaded.
|
|
|
154
178
|
[reference/collaboration.md](reference/collaboration.md)
|
|
155
179
|
- Reading runs, feedback and the inbox over MCP instead of the CLI:
|
|
156
180
|
[reference/mcp.md](reference/mcp.md)
|
|
181
|
+
- Quality evidence for a team's QMS (ISO 9001, ISO 13485, IEC 62304, ISO 27001;
|
|
182
|
+
GxP is the strictest case): requirement `refs:`, `kaloko evidence`, the
|
|
183
|
+
evidence package and its check, the `evidence.ready` webhook, feeding a
|
|
184
|
+
team's own document templates, signatures and what an agent must never do:
|
|
185
|
+
[reference/evidence.md](reference/evidence.md)
|
|
157
186
|
- Filing a returned step or a failing criterion in Jira or Linear, issue keys in
|
|
158
187
|
branches, channels per project, and hosted runs of read-only scenarios on a
|
|
159
188
|
schedule (`kaloko issue`, `kaloko schedule`):
|
|
@@ -39,28 +39,35 @@ sharpen each purpose and add the criteria the page must really meet.
|
|
|
39
39
|
## Check packs
|
|
40
40
|
|
|
41
41
|
`packs: [seo]` or `packs: [seo, usability]` on a node adds a fixed set of
|
|
42
|
-
|
|
42
|
+
health checks (ids `HC1xx` for `seo`, `HC2xx` for `usability`; acceptance
|
|
43
|
+
criteria are `AC`, health checks `HC`, and the number is the check's: the
|
|
44
|
+
same check kept in acceptance or adopted is `AC103` for `HC103`) at load time:
|
|
43
45
|
`seo` checks one H1, title and description length, canonical, hreflang for
|
|
44
46
|
every locale, Open Graph, indexing, viewport, `html lang`, overflow and
|
|
45
47
|
console; `usability` checks unlabeled inputs and link texts and asks the
|
|
46
|
-
evaluator questions that fit the step's page type.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
for
|
|
48
|
+
evaluator questions that fit the step's page type. Pack checks are health,
|
|
49
|
+
not acceptance: they are evaluated on every walk but never decide a step's
|
|
50
|
+
verdict (see [evaluation.md#health](evaluation.md#health)). The `design` pack
|
|
51
|
+
always counts for acceptance; `health: { acceptance: [seo] }` on the scenario
|
|
52
|
+
keeps another pack in acceptance, which only the person decides. A node's own
|
|
53
|
+
criterion with the same id wins and counts for acceptance (that is what
|
|
54
|
+
`kaloko health adopt` writes). Pack checks do not count as drift in
|
|
55
|
+
`--coverage`; the plan lists only what the brief asks for. Use packs for
|
|
56
|
+
public pages and landings; task flows keep their own criteria.
|
|
50
57
|
|
|
51
58
|
Set `page` on every step (or once on the scenario) so the usability pack
|
|
52
59
|
asks the right questions:
|
|
53
60
|
|
|
54
61
|
| `page` | for | asks |
|
|
55
62
|
| --- | --- | --- |
|
|
56
|
-
| `landing` | public and marketing pages | purpose in the first screen (`
|
|
57
|
-
| `work` | app screens where people work: overview, canvas, detail, inbox item | the heading says what the screen is for (`
|
|
58
|
-
| `list` | lists and tables: runs, projects, inbox | `
|
|
59
|
-
| `settings` | settings, billing, tokens | `
|
|
60
|
-
| `form` | sign-up, sign-in, a form to fill in | `
|
|
61
|
-
| `doc` | documentation, guides, terms | `
|
|
62
|
-
|
|
63
|
-
Every type also gets `
|
|
63
|
+
| `landing` | public and marketing pages | purpose in the first screen (`HC201`), exactly one primary call to action (`HC202`) |
|
|
64
|
+
| `work` | app screens where people work: overview, canvas, detail, inbox item | the heading says what the screen is for (`HC205`) |
|
|
65
|
+
| `list` | lists and tables: runs, projects, inbox | `HC205`, each item says what it is and how to open it (`HC207`) |
|
|
66
|
+
| `settings` | settings, billing, tokens | `HC205`, each setting says what it changes and how it is saved (`HC208`) |
|
|
67
|
+
| `form` | sign-up, sign-in, a form to fill in | `HC205`, how to send it and what happens next (`HC206`) |
|
|
68
|
+
| `doc` | documentation, guides, terms | `HC201`, headings and short paragraphs (`HC209`) |
|
|
69
|
+
|
|
70
|
+
Every type also gets `HC203` and `HC204`. Without `page` a step with the
|
|
64
71
|
`seo` pack, or any step of a scenario allowed on production, is `landing`;
|
|
65
72
|
everything else is `work`. Do not put `landing` on signed-in screens: "one
|
|
66
73
|
primary call to action" is a marketing rule, and a work screen rightly offers
|
|
@@ -78,34 +85,37 @@ When a scenario walks several locales, a text check (`text_matches`,
|
|
|
78
85
|
reads in one language only (it looks for diacritics and common Czech or
|
|
79
86
|
English words; one plain word such as a brand name is left alone).
|
|
80
87
|
|
|
81
|
-
- `a11y` (`
|
|
88
|
+
- `a11y` (`HC3xx`): images with alt, links and buttons with a name, labelled
|
|
82
89
|
fields, heading levels not skipped, WCAG AA text contrast, a `main`
|
|
83
|
-
landmark, unique ids (`
|
|
84
|
-
screenshot the walk also presses Tab through the page: `
|
|
90
|
+
landmark, unique ids (`HC301`–`HC307`, read from the page). After the
|
|
91
|
+
screenshot the walk also presses Tab through the page: `HC308` tab order
|
|
85
92
|
(hidden focus, big jumps back, positive `tabindex`, controls left out or
|
|
86
|
-
mouse-only), `
|
|
87
|
-
screenshotted focused and unfocused), `
|
|
88
|
-
dialog may keep focus), `
|
|
89
|
-
stops, `
|
|
90
|
-
reader announces). `
|
|
91
|
-
`
|
|
93
|
+
mouse-only), `HC309` visible focus with at least 3 : 1 contrast (each stop
|
|
94
|
+
screenshotted focused and unfocused), `HC310` no keyboard trap (a modal
|
|
95
|
+
dialog may keep focus), `HC311` a skip link or main content within three
|
|
96
|
+
stops, `HC312` names from Chrome's accessibility tree (what a screen
|
|
97
|
+
reader announces). `HC313` landmarks (one `main`, labelled repeats) and
|
|
98
|
+
`HC314` ARIA (unknown roles and attributes, references to missing ids,
|
|
92
99
|
`aria-hidden` over focusable content) are read from the page. The first
|
|
93
|
-
five focus stops are kept as screenshots
|
|
94
|
-
|
|
100
|
+
five focus stops are kept as screenshots (step attachments of kind
|
|
101
|
+
`focus`, "Keyboard focus · HC309" on the canvas, linked to the check; the
|
|
102
|
+
Health tab shows them under `HC309` and in the tab order) and the canvas
|
|
103
|
+
can draw the tab order on the capture. The walk only moves focus: nothing is clicked or
|
|
95
104
|
typed, and the page is left unfocused at the top. Stack steps walk the
|
|
96
105
|
keyboard on their first five pages. Still a subset of WCAG 2.2 AA; it
|
|
97
106
|
does not replace an audit with a screen reader.
|
|
98
|
-
- `perf` (`
|
|
107
|
+
- `perf` (`HC4xx`): LCP ≤ 2.5 s, CLS ≤ 0.1, TTFB ≤ 800 ms, page weight ≤ 3 MB,
|
|
99
108
|
measured in this walk's browser since the page load (lab values: the
|
|
100
109
|
machine and network of the walk matter; compare runs, not absolutes).
|
|
101
|
-
Override a limit with an own criterion
|
|
110
|
+
Override a limit with an own criterion with the check's number as an AC
|
|
111
|
+
id (`AC401` for `HC401`), e.g.
|
|
102
112
|
`{ id: AC401, text: LCP within 4 s, check: { type: deterministic, assert: perf_lcp, max: 4000 } }`.
|
|
103
|
-
- `console` (`
|
|
113
|
+
- `console` (`HC501`): the evaluator reads the step's console errors with its
|
|
104
114
|
purpose and decides whether they touch what the step accepts (pass: only
|
|
105
115
|
third-party noise; needs review: unsure; fail: relevant). Without errors it
|
|
106
116
|
passes without a call. Keep `no_console_errors` where any error must fail.
|
|
107
117
|
|
|
108
|
-
- `errors` (`
|
|
118
|
+
- `errors` (`HC6xx`) is for error pages. It checks:
|
|
109
119
|
- a real 4xx/5xx status (a "soft 404" answering 200 fails);
|
|
110
120
|
- a link to the home page and navigation or search;
|
|
111
121
|
- no stack trace, SQL error or framework debug page;
|
|
@@ -120,7 +130,7 @@ step with `packs: [errors]`:
|
|
|
120
130
|
- **404:** use `path: /no-such-page-{random}`. `{random}` becomes a new
|
|
121
131
|
token on every walk, so no cache or an accidentally created page makes it
|
|
122
132
|
pass. `kaloko draft` adds this step on its own.
|
|
123
|
-
- **Exact status:** override AC601, for example
|
|
133
|
+
- **Exact status:** override HC601 with your own AC601, for example
|
|
124
134
|
`{ id: AC601, text: Answers 410, check: { type: deterministic, assert: http_status, value: 410 } }`.
|
|
125
135
|
`http_status` also takes `min`/`max`; the default is 200–299.
|
|
126
136
|
- **Every step:** each capture records the document's HTTP status. The
|
|
@@ -192,7 +202,8 @@ When the work has a repository and an issue number, make them visible:
|
|
|
192
202
|
- scenario `id` carries the ticket (`TASK-1273-club-activation`, `WEB-12-checkout`); the CLI derives the issue number from it or from the branch (`feat/1273-…`) and links it to the repository's origin (`acme/shop#1273`);
|
|
193
203
|
- set `issue: { number, repo?, url? }` explicitly when the id or branch cannot carry it (for example a Plane item);
|
|
194
204
|
- the project is the repository name unless `project:` in `kaloko.config.yml` says otherwise; a single flow may sort itself elsewhere with `project: <slug>` in its scenario (optional). Projects are records of the organization: `kaloko projects` or MCP `list_projects` show the slugs to use; admins create them in Settings → Projects or assign a scenario in the overview, which wins over the scenario file;
|
|
195
|
-
- the canvas header, the organization overview and `kaloko feedback` show `repo#number · title`, so name the scenario `title` for humans, not for the ticket
|
|
205
|
+
- the canvas header, the organization overview and `kaloko feedback` show `repo#number · title`, so name the scenario `title` for humans, not for the ticket;
|
|
206
|
+
- requirement IDs from the team's tracker or QMS go into `refs:` on the scenario, a step or a criterion (`refs: [URS-12, FS-3.4]`, free text, never invented); they flow into the acceptance record and the trace matrix ([evidence.md](evidence.md)).
|
|
196
207
|
|
|
197
208
|
## Session and consent
|
|
198
209
|
|
|
@@ -216,7 +216,7 @@ dialog, webview and group.
|
|
|
216
216
|
- `app_no_truncation`: texts ending in "…";
|
|
217
217
|
- `app_no_crash`: FATAL EXCEPTION or ANR in logcat, a "keeps stopping"
|
|
218
218
|
dialog, or the iOS app no longer running.
|
|
219
|
-
- **Pack `app` (
|
|
219
|
+
- **Pack `app` (HC7xx):** those four checks, plus a semantic question about
|
|
220
220
|
the screen's purpose and next action.
|
|
221
221
|
- **Web-only checks** (`no_overflow`, `http_status`, meta, `a11y_contrast`,
|
|
222
222
|
`perf_*`, `url_*`, `style_*`, `js_equals`): these are "not evaluated" on
|
|
@@ -353,7 +353,8 @@ Turn on `packs: [design]` (usually `[design, a11y]`) for the steps in the implem
|
|
|
353
353
|
| AC802 | structure: headings, landmarks, actions and form fields as in the reference |
|
|
354
354
|
| AC803 | tokens: authored colors, fonts, sizes, spacing and radii come from the token set |
|
|
355
355
|
|
|
356
|
-
Contrast and the other accessibility basics come from the `a11y` pack
|
|
356
|
+
The design checks count for acceptance. Contrast and the other accessibility basics come from the `a11y` pack
|
|
357
|
+
(`packs: [design, a11y]`) as health: advisory, reported apart (see [evaluation.md#health](evaluation.md#health)).
|
|
357
358
|
|
|
358
359
|
`kaloko evaluate` fetches the design reference (of the design branch linked to the git branch, if any) and
|
|
359
360
|
fills the checks. Findings name what differs and the token to use; fix the implementation, not the reference.
|
|
@@ -14,6 +14,7 @@ A picture in Markdown names a step instead of a PNG file:
|
|
|
14
14
|
 the release before the one this entry belongs to
|
|
15
15
|

|
|
16
16
|
 the step's recording plays on the picture
|
|
17
|
+
 a named detail of the step (details: in the scenario)
|
|
17
18
|
 a step of the product's default_scenario
|
|
18
19
|
```
|
|
19
20
|
|
|
@@ -28,6 +29,29 @@ a dialog, a language switch), not for every step. Check a reference with MCP `re
|
|
|
28
29
|
`GET /api/v1/orgs/<org>/steps/resolve?ref=…`: it answers the signed image URL (and `video` with `mp4`, `webm` and `duration_ms` when it plays), the run and how the version was found
|
|
29
30
|
(`release`, `app_version`, `reference_env`, `accepted`; `exact: false` means a fallback).
|
|
30
31
|
|
|
32
|
+
## Details for guides
|
|
33
|
+
|
|
34
|
+
When a guide talks about one control, show that control in its part of the page instead of the whole screen. Declare
|
|
35
|
+
it on the step in the scenario and refer to it with `#<id>`:
|
|
36
|
+
|
|
37
|
+
```yaml
|
|
38
|
+
details:
|
|
39
|
+
- id: pay-button # letters, digits, - and _; used in references and file names
|
|
40
|
+
name: { en: Pay button, cs: Tlačítko Zaplatit } # one text or one per locale
|
|
41
|
+
selector: "#pay" # the first match is outlined
|
|
42
|
+
context: card # optional: section | card | page | a CSS selector of an ancestor
|
|
43
|
+
padding: 24 # optional, px around the context (default 16)
|
|
44
|
+
states: [error] # optional: only in these states of the step
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Without `context` the picture is the nearest section, landmark or card around the element that is at least
|
|
48
|
+
480 × 240 px (90 % of the width on a phone), at most one screen around the element, with a ring drawn around the
|
|
49
|
+
element. Every walk takes each detail in every locale and viewport, masked like the screenshot, as an attachment of
|
|
50
|
+
kind `detail` (canvas: Page tab → Step attachments → Details for guides, with the reference). Only screen steps take
|
|
51
|
+
details. A reference to a detail no accepted run has yet shows the whole screen; `kaloko docs check` warns under
|
|
52
|
+
`missing_details` (the scenario does not declare it) and `no_detail` (no accepted run has it: walk and accept).
|
|
53
|
+
Prefer a detail over a crop when the text names one button, field or message; keep the whole screen for orientation.
|
|
54
|
+
|
|
31
55
|
Never invent a step id or a version. Use ids from the scenario files and versions from `CHANGELOG.md` or git tags.
|
|
32
56
|
|
|
33
57
|
## After a user-visible change
|
|
@@ -68,6 +68,46 @@ evaluators:
|
|
|
68
68
|
Report the reason with each `needs_review` or failing criterion; when the
|
|
69
69
|
evaluator saw the screenshot, say so.
|
|
70
70
|
|
|
71
|
+
## Health
|
|
72
|
+
|
|
73
|
+
The checks of packs (`seo`, `a11y`, `perf`, `usability`, `console`,
|
|
74
|
+
`errors`, `app`) are the run's **health** (CS *kondice*): advisory, stored in
|
|
75
|
+
`node.health` and `summary.health` of `run.json`, never in `criteria`. They
|
|
76
|
+
do not change a step's status, the run verdict, the review queue, carried
|
|
77
|
+
approvals, required approvers, the acceptance record or exit codes. The
|
|
78
|
+
`design` pack and packs listed in `health.acceptance` stay acceptance
|
|
79
|
+
criteria. Runs shared before the split keep their stored verdicts; their pack
|
|
80
|
+
criteria show as health.
|
|
81
|
+
|
|
82
|
+
- **Check it before you hand over.** `kaloko walk` and `kaloko evaluate`
|
|
83
|
+
print one health line; `kaloko health` lists the findings by pack with
|
|
84
|
+
severity (error: people or search engines are shut out; warning: the rest;
|
|
85
|
+
info: the evaluator was unsure), what is new or fixed since the previous run
|
|
86
|
+
of the scenario, and a fix for each check. `--json` for the structure,
|
|
87
|
+
`--remote` (or MCP `get_health`) for a shared run.
|
|
88
|
+
- **Fix what your change can fix**, walk the step again and check that the
|
|
89
|
+
finding is gone. Leave the rest and say so.
|
|
90
|
+
- **Never hide health.** Do not remove a pack, raise a limit, narrow a
|
|
91
|
+
selector or add `environments:` to make a finding disappear. A limit or a
|
|
92
|
+
check that does not fit the project is the person's call; name it in the
|
|
93
|
+
report.
|
|
94
|
+
- **Ids.** Health checks are `HC<n>` (`home:HC103`), acceptance criteria
|
|
95
|
+
`AC<n>`. Runs from before 7 Oct 2026 say `AC103` for the health check;
|
|
96
|
+
read it as `HC103`, and both ids work in commands and MCP.
|
|
97
|
+
- **Adopting is the team's decision.** `kaloko health adopt <step>:<check>
|
|
98
|
+
[--text "…"]` writes the check into the scenario as an acceptance
|
|
99
|
+
criterion of the step (`home:HC103` becomes `AC103` with `from: HC103`),
|
|
100
|
+
so it counts for acceptance from the next walk. Do it only when
|
|
101
|
+
the person asks. Checks people adopted on the canvas (or through
|
|
102
|
+
`adopt_health_check`) wait on the service until `kaloko health pull` writes
|
|
103
|
+
them into the scenario; pulling them is routine, then walk those steps.
|
|
104
|
+
- **Report it apart from the verdicts**: "Health: 2 errors (1 new), 5
|
|
105
|
+
warnings; fixed HC108 on home". Never present a health finding as a
|
|
106
|
+
failing criterion, or a clean health as acceptance.
|
|
107
|
+
- `kaloko health --fail-on error` exits 1 on errors; use it in CI only where
|
|
108
|
+
the team asked for that gate. Hosted runs and CI runs alert on new errors
|
|
109
|
+
by themselves (inbox, mail, channels, webhook `health.worse`).
|
|
110
|
+
|
|
71
111
|
## Triage findings (experimental)
|
|
72
112
|
|
|
73
113
|
When the organization switched the experiment on, `kaloko evaluate` also asks
|
|
@@ -111,7 +151,8 @@ turns them off; they do not count against the hosted allowance.
|
|
|
111
151
|
|
|
112
152
|
After `kaloko build`, report: the summary line, each failing or
|
|
113
153
|
`needs_review` criterion with step, locale, viewport and evidence, blocked
|
|
114
|
-
requests if any,
|
|
154
|
+
requests if any, the health counts (apart from the verdicts), and the preview
|
|
155
|
+
path. Do not claim a criterion passed when
|
|
115
156
|
it was not evaluated.
|
|
116
157
|
|
|
117
158
|
`needs_review` is not a failure: look at the screenshot and state your
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Quality evidence for your own documentation
|
|
2
|
+
|
|
3
|
+
Use this when a team's own repository turns Kaloko runs into its documents: test protocols, reports, trace
|
|
4
|
+
matrices, release summaries for its quality management system (ISO 9001, ISO 13485, IEC 62304, ISO 27001, or GxP
|
|
5
|
+
under 21 CFR Part 11 and EU GMP Annex 11, the strictest case). Kaloko provides the evidence and a way to check it;
|
|
6
|
+
the team's own templates and skills write the documents. Kaloko never formats anything for a particular QMS, and you do not put
|
|
7
|
+
the team's SOP structure into Kaloko.
|
|
8
|
+
|
|
9
|
+
The background for people (what a record proves, the two signing paths, known gaps) is in Kaloko's help, page
|
|
10
|
+
*Quality evidence for your QMS* (it maps the frameworks and has a GxP section). Evidence is a Business feature.
|
|
11
|
+
Kaloko provides evidence; it never makes a team compliant or certified, so never write that it does.
|
|
12
|
+
|
|
13
|
+
## The contract
|
|
14
|
+
|
|
15
|
+
Everything below is `qawalk.evidence.v1` (`schemas/evidence.v1.json` in the `kaloko` package, every field
|
|
16
|
+
described). Within v1 fields are only added; read the fields you need and ignore the rest.
|
|
17
|
+
|
|
18
|
+
- `acceptance`: `none`, `accepted` or `returned`. Write your document from this field, never from the presence of
|
|
19
|
+
others.
|
|
20
|
+
- `signing`: `in_kaloko` when a signature made in Kaloko stands, `none` otherwise. With `none` the approval, if any,
|
|
21
|
+
is signed elsewhere; your document says so ("executed in Kaloko; approval recorded in <your eQMS>").
|
|
22
|
+
- `record.sha256` and `record.kind` (`acceptance` or `execution`): the signed record the evidence came from. Put the
|
|
23
|
+
hash into your document so a reader can tie it to the package.
|
|
24
|
+
- `scenario` (`version`, `file`, `sha256`, `refs`), `environment`, `git`, `tools` (CLI, Node.js, OS, browsers,
|
|
25
|
+
service version).
|
|
26
|
+
- `steps[].criteria[]`: the criterion text as walked, `refs`, and `results[]` per locale and viewport with
|
|
27
|
+
`assessed_by` (`person`, `deterministic`, `ai`, `none`) and `assessor` (an e-mail or a model id). `advisory: true`
|
|
28
|
+
means an AI result no person decided: never present it as a person's verdict.
|
|
29
|
+
- `steps[].decision`, `verdict`, `approvals`: people's decisions apart from tokens' and agents'
|
|
30
|
+
(`counts_as_person`).
|
|
31
|
+
- `signatures[]` (name, e-mail, `signed_at`, `time_zone`, `local_time`, `meaning`, `auth`, `withdrawn`) and
|
|
32
|
+
`decision_changes[]` with reasons.
|
|
33
|
+
- `audit[]`: the run's audit trail; `trace[]`: the trace matrix, one row per requirement, criterion, step, locale and
|
|
34
|
+
viewport (columns in `TRACE_COLUMNS` order, the same as `trace.csv`).
|
|
35
|
+
- A release (`kind: release`) has `runs[]` (each a run evidence), `missing[]` with reasons and one `trace[]`.
|
|
36
|
+
|
|
37
|
+
## Getting it
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npx kaloko evidence <run-id> --json > evidence.json # one run, any shared run
|
|
41
|
+
npx kaloko evidence --release 2.4.0 --product lims --json > release.json
|
|
42
|
+
npx kaloko evidence <run-id> --csv > trace.csv # the trace matrix only
|
|
43
|
+
npx kaloko signoff <run-id> --package --out evidence/ # the signed zip, checked on download
|
|
44
|
+
npx kaloko signoff --verify evidence/kaloko-evidence-<run-id>.zip # check it again later, no token needed
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Over the API with a read token: `GET /api/v1/orgs/<org>/runs/<id>/evidence`, `…/evidence.zip`, `…/trace.csv`,
|
|
48
|
+
`…/audit.csv`, and `GET /api/v1/orgs/<org>/evidence?product=<p>&version=<v>`. Over MCP: `get_evidence` with `run_id`, or
|
|
49
|
+
`product` and `version`.
|
|
50
|
+
|
|
51
|
+
## When it is ready
|
|
52
|
+
|
|
53
|
+
An organization admin adds a webhook with the event `evidence.ready` (Settings → Integrations → Webhooks). It fires
|
|
54
|
+
when a run is shared, accepted or returned, and when a release is recorded or updated. It is signed like every Kaloko
|
|
55
|
+
webhook (`Kaloko-Signature: t=<unix>,v1=<hex HMAC-SHA256 of "<t>.<body>">`); check the signature and the age of `t`
|
|
56
|
+
before you trust it. The body:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{ "id": "evt_…", "type": "evidence.ready", "created_at": "2026-10-07T10:00:00.000Z", "org": "acme",
|
|
60
|
+
"data": { "kind": "run", "reason": "accepted", "run": { "id": "2026-10-07-batch-x1y2z3", "scenario": "BATCH", "environment": "validation", "project": "lims", "verdict": "accepted" },
|
|
61
|
+
"acceptance": "accepted", "signing": "none", "schema": "qawalk.evidence.v1",
|
|
62
|
+
"evidence_url": "https://kaloko.app/api/v1/orgs/acme/runs/…/evidence", "package_url": "…/evidence.zip", "trace_csv_url": "…/trace.csv" } }
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The URLs need a token (`Authorization: Bearer …`); the webhook never carries the evidence itself.
|
|
66
|
+
|
|
67
|
+
A neutral client-side job, for example a small service or a CI job triggered by the webhook:
|
|
68
|
+
|
|
69
|
+
1. Check `Kaloko-Signature` with the webhook's secret; drop events older than five minutes.
|
|
70
|
+
2. Download `package_url` with a read token into your own storage.
|
|
71
|
+
3. Run `npx kaloko signoff --verify <zip>`; stop and alert on any failure.
|
|
72
|
+
4. Read `evidence.json` from the zip and hand it to your generator with your templates.
|
|
73
|
+
5. Store the generated document next to the package and the record's SHA-256; your eQMS takes it from there.
|
|
74
|
+
|
|
75
|
+
## Rules for an agent
|
|
76
|
+
|
|
77
|
+
- Never accept, approve or sign for a person. Tokens and agents cannot sign; where an organization signs in Kaloko,
|
|
78
|
+
only a person does, in the app.
|
|
79
|
+
- Never present `advisory` results as decisions, and never drop the AI model name from a result.
|
|
80
|
+
- Do not turn the signature policy on or off; that is an admin's decision in Settings → Security.
|
|
81
|
+
- Add `refs:` to scenarios, steps and criteria when the team gives you requirement IDs; do not invent them.
|
|
82
|
+
- Keep the package as you got it. To change anything, generate a new document; the package stays the evidence.
|
|
@@ -24,11 +24,17 @@ with a person who knows where to approve it.
|
|
|
24
24
|
## From zero to a first shared run
|
|
25
25
|
|
|
26
26
|
1. `npm install --save-dev kaloko`, then
|
|
27
|
-
`npx kaloko init --agent claude --org <org
|
|
28
|
-
and these steps).
|
|
29
|
-
the
|
|
27
|
+
`npx kaloko init --agent claude --org <org> --project <slug> --project-name "<name>"`
|
|
28
|
+
(it prints the sample link and these steps). Ask the person how the project
|
|
29
|
+
should be called on Kaloko when you do not know; the slug is lowercase
|
|
30
|
+
(`eco-podcasty`), the name is what people see (`ECO Podcasty`). Fill
|
|
31
|
+
`environments` in `kaloko.config.yml` with the URL the app runs on. When
|
|
32
|
+
the repository holds several sites, see [Several sites in one
|
|
33
|
+
repository](#several-sites-in-one-repository) first.
|
|
30
34
|
2. `npx kaloko login`: the person approves a token in the browser. Ask them
|
|
31
|
-
to; never create or paste tokens yourself.
|
|
35
|
+
to; never create or paste tokens yourself. Then `npx kaloko projects sync`
|
|
36
|
+
puts the project of the config on Kaloko with its name (a first
|
|
37
|
+
`kaloko share` would create it too).
|
|
32
38
|
3. `npx kaloko doctor` and fix what it marks ✕.
|
|
33
39
|
4. Draft the first scenario:
|
|
34
40
|
- public pages: `npx kaloko draft <url> [url…]` writes a read-only
|
|
@@ -49,3 +55,30 @@ with a person who knows where to approve it.
|
|
|
49
55
|
Done means: the scenario validates, the run is shared, its URL and summary
|
|
50
56
|
line are in your reply (and in the issue or PR the work belongs to), and the
|
|
51
57
|
person knows whether the sample or this run is what they should open.
|
|
58
|
+
|
|
59
|
+
## Several sites in one repository
|
|
60
|
+
|
|
61
|
+
A monorepo (`apps/*` with their own dev server), a Rails app with engines or
|
|
62
|
+
several Folio sites, or routes split by host: `kaloko init` lists the sites
|
|
63
|
+
it found and drafts no steps, because routes of the whole repository mix the
|
|
64
|
+
sites (favicons, ad endpoints and API routes of another site end up as
|
|
65
|
+
"pages").
|
|
66
|
+
|
|
67
|
+
1. Ask the person which site the work is about before `init` or a walk. Do
|
|
68
|
+
not pick one yourself.
|
|
69
|
+
2. Run init for that site, best against the running site so the pages come
|
|
70
|
+
from its sitemap or its navigation:
|
|
71
|
+
- `npx kaloko init --site eco-podcasty --base-url http://eco-podcasty.localhost:3000`
|
|
72
|
+
- `npx kaloko init --site apps/web` (a workspace app: its own routes and dev
|
|
73
|
+
server; `--base-url` still reads the running site when it is up)
|
|
74
|
+
Only the host of `--base-url` is asked, with short time limits; offline the
|
|
75
|
+
code is read.
|
|
76
|
+
3. Read the comment at the top of `qa/flows/main-pages.yml`: it says where the
|
|
77
|
+
pages came from and which paths were skipped and why. Sharpen the steps;
|
|
78
|
+
add pages the person names.
|
|
79
|
+
4. When the site is not running and has no routes of its own (a Folio site),
|
|
80
|
+
`npx kaloko init --site <name> --skeleton` writes a scenario with a TODO;
|
|
81
|
+
fill it with the pages the person names.
|
|
82
|
+
|
|
83
|
+
One config can serve one site. For a second site of the same repository use
|
|
84
|
+
another config (`--config kaloko.<site>.config.yml`) with its own `project:`.
|
|
@@ -34,7 +34,7 @@ Ask before filing issues in bulk; one issue per real problem, not per criterion.
|
|
|
34
34
|
|
|
35
35
|
Slack and Teams channels are chosen per project by an admin, with the events
|
|
36
36
|
each wants (new run, returned, accepted, comment, mention, release recorded,
|
|
37
|
-
waiting for approval) and quiet hours. Nothing to do from the CLI: sharing,
|
|
37
|
+
waiting for approval, health got worse) and quiet hours. Nothing to do from the CLI: sharing,
|
|
38
38
|
returning and recording a release reach the right channels. Restricted projects
|
|
39
39
|
reach only channels that name them.
|
|
40
40
|
|
|
@@ -72,6 +72,11 @@ kaloko schedule hook <id> # URL + secret that start the run after a deploy
|
|
|
72
72
|
script that only calls `page.goto`). Steps that click or type are left out and
|
|
73
73
|
named in the answer. Criteria decided: `exists`, `absent`, `count`, `text_*`,
|
|
74
74
|
`attr_*`, `title_matches`, `meta_matches`; the rest shows "not evaluated".
|
|
75
|
+
- Health alerts: a hosted run (and a run shared from CI) compares its health
|
|
76
|
+
with the previous run of the scenario and alerts the followers, the channels
|
|
77
|
+
and the `health.worse` webhook on a new error-level finding. Each schedule
|
|
78
|
+
sets it to `error` (default), `warning` or `off` on kaloko.app or with
|
|
79
|
+
`kaloko schedule add --health-alert`; changing it is the person's call.
|
|
75
80
|
- Does not work for: native apps, local or private addresses (localhost, IPs,
|
|
76
81
|
`.local`), header credentials, base URLs per locale.
|
|
77
82
|
- For those, or for the full walk on a schedule, write a GitHub Actions
|
|
@@ -32,6 +32,7 @@ is null. Projects and products come complete, without pages.
|
|
|
32
32
|
| `get_feedback` | run verdict with note, approved steps, unresolved rejections and comments, failed manual criteria (`run_id`, or `scenario` for its latest run) |
|
|
33
33
|
| `list_notifications` | the token owner's inbox (`unread_only`, `limit`, `cursor`) |
|
|
34
34
|
| `list_projects` | projects of the organization with counts; the slug is the `project` filter of `list_runs` and the value for `project:` in a scenario |
|
|
35
|
+
| `upsert_project` | creates a project (`slug`, `name`, `visibility`, `product`; `create: true` refuses an existing one) or renames it; the same rules as `kaloko projects create\|rename\|sync` (a full token; renaming is for the project's admin). Ask before renaming |
|
|
35
36
|
| `get_criteria_verdicts` | reviewer verdicts on manual or overridden criteria of a run |
|
|
36
37
|
| `get_stack_items` | the pages of a stack step (`run_id`, `step`; filters `status`, `criterion`, text): path, URL, title, status and failing criteria with evidence, screenshot URLs |
|
|
37
38
|
| `get_step_recording` | a step's recording and trace (`run_id`, `step`, `locale`, `viewport`, `trace: true` for the full trace): video URLs, duration, its chapter of a flow recording, failed attempts, the trace summary (failed requests, console errors, slowest request); see [recording.md](recording.md). `get_run_summary` lists trace summaries per step too |
|
|
@@ -42,13 +43,15 @@ is null. Projects and products come complete, without pages.
|
|
|
42
43
|
| `list_products` | the products the caller reads: name, modules, the projects it maps that the caller sees, the newest release, published docs (versions, languages), who reads it (and the public link), whether the caller manages it, links to its page, changelog and docs |
|
|
43
44
|
| `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) |
|
|
44
45
|
| `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`) |
|
|
45
|
-
| `resolve_step_image` | one step reference (`ref` = `kaloko:<scenario>/<step
|
|
46
|
+
| `resolve_step_image` | one step reference (`ref` = `kaloko:<scenario>/<step>?…[#<detail>]`, `product`, `version`, `locale`, `viewport`, `detail`) as a signed image URL with its run, how the version was found and canvas links; `video` (mp4, webm, duration_ms) when the step's recording plays (`media=video` / `media=image` in the ref); with a detail id the detail's picture and `detail` { id, name, box, size }, or the whole screen with `detail_missing` |
|
|
46
47
|
| `get_docs` | a product's published docs (`product`; without `path` the versions, languages and sidebar; with `path` one page with its Markdown, sections, stale sections and, with `resolve: true`, its pictures) |
|
|
47
48
|
| `docs_check` | what needs attention in the published docs of a version: broken step references, references without an accepted picture, stale sections, missing or outdated translations, release items without a picture |
|
|
48
49
|
| `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) |
|
|
49
50
|
| `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) |
|
|
50
51
|
| `add_sample_run` | adds the sample run (or returns the one there is); needs an upload or full token and the Developer / Tester role |
|
|
51
52
|
| `search_screens` | the screen library: newest screenshot of every step across the organization's flows (`q` words matched against titles, ids, paths, URLs, page title and H1; `project`, `product`, `module`, `scenario`, `locale`, `viewport`, `device`, `status`, `environment`; `source: design` or `all` for design versions; `group: none` for every locale and viewport; `cursor` from `next`), each with a signed image and the canvas link |
|
|
53
|
+
| `get_health` | the advisory health of a run (`run_id`), the newest run of a scenario (`scenario`) or the trend of a project (`project`): findings by severity, pack and step with evidence and a fix, and what is new or fixed since the previous run; never a verdict, see [evaluation.md#health](evaluation.md#health) |
|
|
54
|
+
| `adopt_health_check` | turns a health check into an acceptance criterion of the scenario (`run_id`, `step`, `check` such as `HC103`, `text` to reword it; it becomes `AC103` with `from: HC103`); Developer / Tester role. Only when the person asks; `kaloko health pull` then writes it into the scenario file |
|
|
52
55
|
| `get_affected_steps` | which steps of a scenario changed files reach, with the reason per step (`scenario`, `changed_files`, `run_id`, `upstream`); route files are matched against the step paths and URLs of the newest run. Imports and `affects:` globs need the repository: `kaloko affected` follows them |
|
|
53
56
|
|
|
54
57
|
## Comment tools
|
|
@@ -63,6 +66,7 @@ is null. Projects and products come complete, without pages.
|
|
|
63
66
|
| `answer_finding` | answers a finding (`run_id`, `node`, `locale`, `viewport`, `finding`, `kind`, `answer`: right, wrong or comment with the `comment_id` from `add_comment`); scope comment |
|
|
64
67
|
| `get_triage_report` | the organization's Clef numbers of the last 90 days (read-only): findings shown and answered, precision and calibration per kind, findings turned into comments, median hours to the first review with and without findings, triage requests per useful finding. Report them as they are; the go/no-go is a person's |
|
|
65
68
|
| `get_signoff_record` | the signed acceptance record of an accepted run (Business): approvals with provenance, criteria, capture hashes, signature |
|
|
69
|
+
| `get_evidence` | the evidence of a run (any shared run) or a release (Business, `qawalk.evidence.v1`): acceptance and signing state, criteria as walked with `refs`, who assessed each result (AI advisory), screenshots with SHA-256, decisions, signatures, audit trail, trace matrix ([evidence.md](evidence.md)) |
|
|
66
70
|
| `resolve_comment` | close a thread with a `note` that says what changed (it becomes the last reply) |
|
|
67
71
|
| `reopen_comment`, `edit_comment`, `delete_comment` | reopen; edit or delete your own comment |
|
|
68
72
|
| `create_issue` | a Jira or Linear issue from a step (`run_id`, `step`, `to`: jira or linear, optional `criterion`, `title`, `note`, `locale`, `viewport`, `target`): screenshot, criterion, notes and a link back; the step's thread resolves when the issue is done. Developer / Tester, scope comment; see [integrations.md](integrations.md) |
|
|
@@ -29,7 +29,7 @@ step script only to prepare each page, for example to dismiss a dialog
|
|
|
29
29
|
kind: stack
|
|
30
30
|
title: Magazine articles
|
|
31
31
|
purpose: Every article reads well and is findable.
|
|
32
|
-
packs: [seo] #
|
|
32
|
+
packs: [seo] # health checks of every page (advisory)
|
|
33
33
|
items:
|
|
34
34
|
sitemap: /sitemap.xml # or urls / file / crawl / script (exactly one)
|
|
35
35
|
match: '^/clanky/' # regex on the path with its query; exclude: '…' drops pages
|