@wix/himalaya-cli 0.808.0 → 0.809.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/dist/cli.mjs +961 -325
- package/guides/himi-test.md +46 -1
- package/package.json +2 -2
package/guides/himi-test.md
CHANGED
|
@@ -107,6 +107,10 @@ Only **unambiguous** defects, so a green run stays worth trusting:
|
|
|
107
107
|
| `no-request-issued` | **warning** | A worker that uses the Wix transport but never fetches — "the screen loaded with sample data." A warning: a conditional or tap-triggered fetch is legitimate. |
|
|
108
108
|
| `native-decode-failed` | error | Under `--native`, the real Swift/Kotlin decoder rejected the baked descriptor bytes (one bad enum blanks the whole screen on device). |
|
|
109
109
|
| `journey-failed` | error | A `himi-test.json` journey named an action the screen lacks, threw, or never rendered its `expectText`. |
|
|
110
|
+
| `inverse-pair-diverges` | **warning** | An action and the action that undoes it do not return to the state the boot settled on — `add` then `remove` leaving a different list, or a counter it forgot to put back. |
|
|
111
|
+
| `refresh-not-idempotent` | **warning** | `refresh` from a fresh boot settles somewhere other than the boot did, on identical data — usually a refresh that appends instead of replacing. |
|
|
112
|
+
| `list-shrank-on-load-more` | **warning** | A "load more" returned FEWER rows than before it ran: the new page replaced the list instead of extending it. |
|
|
113
|
+
| `list-grew-on-filter` | **warning** | A filter, search or sort made a list longer. Narrowing can reorder or remove, never add. |
|
|
110
114
|
|
|
111
115
|
**Deliberately never reported:** an empty collection · an `error` state (often the correct
|
|
112
116
|
answer to empty input) · a `null` optional · whether a nav target *exists* (approximating
|
|
@@ -230,7 +234,7 @@ chromium`. Fully hermetic; `--no-shots` opts out.
|
|
|
230
234
|
- **JSON is the default off a TTY.** `--json` forces it; a pipe or redirect gets it anyway.
|
|
231
235
|
- **The envelope** carries `himiReport: 1`, `findings[]` (stable `id`s), `gaps[]` (the ledger), `artifacts[]`,
|
|
232
236
|
and `evidence { runId, gitDiffHash }`; the legacy fields (`failures`, `warnings`, `crawled`, …) ride along.
|
|
233
|
-
- **`himi-test.json` `skip[]`** suppresses a known-benign finding: `{ "screen"?, "action"?, "component"?, "reason" }`;
|
|
237
|
+
- **`himi-test.json` `skip[]`** suppresses a known-benign finding: `{ "screen"?, "action"?, "component"?, "invariant"?, "reason" }`;
|
|
234
238
|
`reason` is mandatory and every suppression is echoed as a `suppressed` ledger gap.
|
|
235
239
|
- **A `functions/` dir short-circuits the crawl**: `himi test` on a content dir with local HTTP functions
|
|
236
240
|
invokes each function once with a canned input instead of crawling screens.
|
|
@@ -241,6 +245,47 @@ chromium`. Fully hermetic; `--no-shots` opts out.
|
|
|
241
245
|
map would name the wrong lines — `no-source` — no source dir exists for the bundle at all — or
|
|
242
246
|
`build-failed` — the source no longer compiles. Each pairs with the exact rebuild command.
|
|
243
247
|
|
|
248
|
+
## Relations — catching a wrong value without knowing the right one
|
|
249
|
+
|
|
250
|
+
Every invariant above says *this can never be right*: a throw, a stuck skeleton, a `NaN`, a raw
|
|
251
|
+
binding token on screen. That leaves the bug whose output is **plausible** — reading the wrong key
|
|
252
|
+
off a response gives you an empty list that looks like an empty list; a total that is off by one is
|
|
253
|
+
still a perfectly good number. Nothing that checks a single settled state can tell those from
|
|
254
|
+
correct ones, which is why the measured catch rate for that class is zero.
|
|
255
|
+
|
|
256
|
+
Relations compare **two** settled states of the same screen and assert what must hold for any
|
|
257
|
+
correct reducer, whatever the right answer happens to be:
|
|
258
|
+
|
|
259
|
+
| Relation | What must hold |
|
|
260
|
+
|---|---|
|
|
261
|
+
| **Inverse round trip** | An action and the DISTINCT action that undoes it return to where the boot started: `add` then `remove`, `archive` then `unarchive`. A toggle applied twice is deliberately NOT checked — real toggles raise toasts, reorder lists and randomise, so the round trip fired on correct code 18 times across the corpus. |
|
|
262
|
+
| **Refresh idempotence** | `refresh` from a fresh boot, on identical data, lands where the boot landed. |
|
|
263
|
+
| **Monotonic paging** | "Load more" never returns fewer rows than it started with. |
|
|
264
|
+
| **Narrowing filters** | A filter, search or sort never makes a list longer. |
|
|
265
|
+
|
|
266
|
+
They need **nothing authored**: the pairs and verbs are read from the action names your descriptor
|
|
267
|
+
already declares, and each relation replays only the handful of paths it needs, from a fresh boot,
|
|
268
|
+
so they run by default without `--deep`.
|
|
269
|
+
|
|
270
|
+
All four are **warnings**, deliberately. A divergence is strong evidence of a bug rather than proof
|
|
271
|
+
of one — a worker may legitimately reshape state in a way the relation cannot model — and a run
|
|
272
|
+
where the crawl cannot replay a path faithfully skips the relation instead of guessing.
|
|
273
|
+
|
|
274
|
+
Comparison ignores what legitimately differs between two correct states: freshly minted ids,
|
|
275
|
+
`*At` timestamps, `_`-prefixed counters. Everything else is compared, including list contents and
|
|
276
|
+
totals, because those are exactly where the plausible-wrong-value bugs live.
|
|
277
|
+
|
|
278
|
+
To silence one deliberately, `skip[]` takes an `invariant` — a relation is a property of the whole
|
|
279
|
+
app, so one entry covers it everywhere rather than one per screen:
|
|
280
|
+
|
|
281
|
+
```json
|
|
282
|
+
{ "skip": [{ "invariant": "refresh-not-idempotent", "reason": "the activity feed appends by design" }] }
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
The report always carries `relations.checked`. **Zero is the informative case**: it means no screen
|
|
286
|
+
declared a pair, refresh or filter the axis could use, so "no relational warnings" does not mean
|
|
287
|
+
the relations held.
|
|
288
|
+
|
|
244
289
|
## The contract — why a green run is trustworthy
|
|
245
290
|
|
|
246
291
|
- **Measured, not asserted.** A committed kill-rate benchmark records what fraction of planted,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.809.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
|
|
6
6
|
"keywords": [
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"artifactId": "himalaya-cli"
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
|
-
"falconPackageHash": "
|
|
66
|
+
"falconPackageHash": "24ab5926849593b42d271f6a38201197b2ff1d7963739f2c0de07525"
|
|
67
67
|
}
|