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.
Files changed (46) hide show
  1. package/README.md +6 -2
  2. package/package.json +1 -1
  3. package/schemas/config.v1.json +3 -1
  4. package/schemas/evidence.v1.json +257 -0
  5. package/schemas/run.v1.json +71 -1
  6. package/schemas/scenario.v1.json +52 -1
  7. package/skills/kaloko/SKILL.md +35 -6
  8. package/skills/kaloko/reference/acceptance.md +41 -30
  9. package/skills/kaloko/reference/apps.md +1 -1
  10. package/skills/kaloko/reference/design.md +2 -1
  11. package/skills/kaloko/reference/docs.md +24 -0
  12. package/skills/kaloko/reference/evaluation.md +42 -1
  13. package/skills/kaloko/reference/evidence.md +82 -0
  14. package/skills/kaloko/reference/first-run.md +37 -4
  15. package/skills/kaloko/reference/integrations.md +6 -1
  16. package/skills/kaloko/reference/mcp.md +5 -1
  17. package/skills/kaloko/reference/stacks.md +1 -1
  18. package/src/cli.mjs +172 -21
  19. package/src/lib/build.mjs +12 -4
  20. package/src/lib/capture.mjs +57 -4
  21. package/src/lib/changelog-core.mjs +12 -6
  22. package/src/lib/cli-args.mjs +7 -3
  23. package/src/lib/detail.mjs +102 -0
  24. package/src/lib/docs-export.mjs +2 -1
  25. package/src/lib/docs.mjs +14 -9
  26. package/src/lib/draft.mjs +1 -1
  27. package/src/lib/evaluate.mjs +7 -2
  28. package/src/lib/evidence-core.mjs +300 -0
  29. package/src/lib/git.mjs +1 -1
  30. package/src/lib/health-core.mjs +205 -0
  31. package/src/lib/health.mjs +219 -0
  32. package/src/lib/init-detect.mjs +336 -17
  33. package/src/lib/integrations-cli.mjs +3 -1
  34. package/src/lib/jev.mjs +4 -2
  35. package/src/lib/manifest-core.mjs +58 -12
  36. package/src/lib/pack-help.mjs +53 -51
  37. package/src/lib/packs.mjs +67 -55
  38. package/src/lib/pr.mjs +2 -0
  39. package/src/lib/projects-cli.mjs +88 -0
  40. package/src/lib/run.mjs +13 -1
  41. package/src/lib/scenario.mjs +8 -0
  42. package/src/lib/signoff.mjs +86 -6
  43. package/src/lib/util.mjs +6 -2
  44. package/templates/kaloko.config.yml +2 -0
  45. package/templates/scenario.yml +1 -1
  46. package/viewer/index.html +608 -63
@@ -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), and when a run has
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`). Write, translate and fix
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, any production run, writing or
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; report what waits for them
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): [reference/first-run.md](reference/first-run.md)
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
- criteria (ids `AC1xx` for `seo`, `AC2xx` for `usability`) at load time:
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. A node's own criterion with the
47
- same id wins. Pack criteria are marked `pack` on the canvas and do not count
48
- as drift in `--coverage`; the plan may still mention them by id. Use packs
49
- for public pages and landings; task flows keep their own criteria.
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 (`AC201`), exactly one primary call to action (`AC202`) |
57
- | `work` | app screens where people work: overview, canvas, detail, inbox item | the heading says what the screen is for (`AC205`) |
58
- | `list` | lists and tables: runs, projects, inbox | `AC205`, each item says what it is and how to open it (`AC207`) |
59
- | `settings` | settings, billing, tokens | `AC205`, each setting says what it changes and how it is saved (`AC208`) |
60
- | `form` | sign-up, sign-in, a form to fill in | `AC205`, how to send it and what happens next (`AC206`) |
61
- | `doc` | documentation, guides, terms | `AC201`, headings and short paragraphs (`AC209`) |
62
-
63
- Every type also gets `AC203` and `AC204`. Without `page` a step with the
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` (`AC3xx`): images with alt, links and buttons with a name, labelled
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 (`AC301`–`AC307`, read from the page). After the
84
- screenshot the walk also presses Tab through the page: `AC308` tab order
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), `AC309` visible focus with at least 3 : 1 contrast (each stop
87
- screenshotted focused and unfocused), `AC310` no keyboard trap (a modal
88
- dialog may keep focus), `AC311` a skip link or main content within three
89
- stops, `AC312` names from Chrome's accessibility tree (what a screen
90
- reader announces). `AC313` landmarks (one `main`, labelled repeats) and
91
- `AC314` ARIA (unknown roles and attributes, references to missing ids,
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 and the canvas can draw the tab
94
- order on the capture. The walk only moves focus: nothing is clicked or
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` (`AC4xx`): LCP ≤ 2.5 s, CLS ≤ 0.1, TTFB ≤ 800 ms, page weight ≤ 3 MB,
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 of the same id, e.g.
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` (`AC501`): the evaluator reads the step's console errors with its
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` (`AC6xx`) is for error pages. It checks:
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` (AC7xx):** those four checks, plus a semantic question about
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: `packs: [design, a11y]`.
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
  ![Payment](kaloko:checkout/payment?version=prev) the release before the one this entry belongs to
15
15
  ![Payment](kaloko:checkout/payment?locale=cs&viewport=mobile&state=dark)
16
16
  ![Payment](kaloko:checkout/payment?media=video) the step's recording plays on the picture
17
+ ![Pay](kaloko:checkout/payment#pay-button) a named detail of the step (details: in the scenario)
17
18
  ![Payment](kaloko:payment) 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, and the preview path. Do not claim a criterion passed when
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>` (it prints the sample link
28
- and these steps). Fill `environments` in `kaloko.config.yml` with the URL
29
- the app runs on.
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>?…`, `product`, `version`, `locale`, `viewport`) 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) |
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] # the pack criteria apply to every page
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