diff --git a/README.md b/README.md index 12c76b2..4bfe688 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ LabConstrictor Tools turns declared Python functions into a tool manifest: a machine-readable description of inputs, outputs and interface hints. Each host reads that description to build a form and handle results. The analysis runs in the application's own Python environment. -**The bridge is application-independent.** An application with valid, registered tool declarations can be discovered by the hosts without a dedicated plugin for that application. Whether its tools are useful in Fiji, Napari or QuPath depends on the work being done there, not on a list of approved applications. Which hosts list an app is the binding `hosts:` line of the app (rule in Tools: PROTOCOL.md, section "App hosts (which host lists an app)"; hosts honour it once their PRs merge, installers pass it from template 0.1.18). +**The bridge is application-independent.** An application with valid, registered tool declarations can be discovered by the hosts without a dedicated plugin for that application. Whether its tools are useful in Fiji, Napari or QuPath depends on the work being done there, not on a list of approved applications. Which hosts list an app is the binding `hosts:` line of the app (rule in Tools: PROTOCOL.md, section "App hosts (which host lists an app)"; the three hosts honour it; installers pass it from template 0.1.18, which is not released yet, so an app installed before that has no declaration and is listed in every host). This repository provides the declaration API, schema, registry, worker, CLI and tests. The graphical hosts are separate repositories. diff --git a/docs/HOST_FEATURES.md b/docs/HOST_FEATURES.md index 1d4bc50..8226b14 100644 --- a/docs/HOST_FEATURES.md +++ b/docs/HOST_FEATURES.md @@ -15,7 +15,7 @@ All three need an app whose Tools is **0.3.0a1 or newer**; how to install each h **Fiji limits (known, stated in the Fiji README):** a pixel-size field linked to an image follows that image's calibration by itself and there is **no "use the image's calibration" button**; typing the value the box already shows cannot be detected in a SciJava dialog (conformance case CAL-T9), so that field is cleared and the run blocked with a message, never a wrong value sent; `EnabledWhen` is ignored; `Collapsed` is a plain heading; no kept worker (a new worker for each run); the Macro Recorder does not record the plugin (a hand-typed macro line works, jar only). ## Which apps a host offers -Each host reads the registry. Which app each host *must* offer is the discovery rule (decided 14 Oct 2026; binding rule in Tools, feature `app_hosts_v1`, Tools PR #133, merged): **CellTracksColab** is hidden from Napari, Fiji and QuPath (notebook only); **NucleiSky, Guess the Condition and Playground** are offered by all three; **VLab4Mic** is offered by Napari and Fiji and **not** by QuPath. discovery rule: see PROTOCOL.md, section "App hosts (which host lists an app)". Hosts honour the rule once their PRs merge (Napari #61, Fiji #47, QuPath #35: open, not merged), and installers pass it from template 0.1.18 (template PR #33, not merged); until then a host offers every registered app that passes its compatibility check (not verified for each host). A host also leaves out, with a sentence in its Log, an app whose Tools is too old. The test steps are in [HUMAN_TEST_PROTOCOL.md](HUMAN_TEST_PROTOCOL.md#6-discovery-who-shows-which-app). +Each host reads the registry. Which app each host *must* offer is the discovery rule (decided 14 Oct 2026; binding rule in Tools, feature `app_hosts_v1`, Tools PR #133, merged): **CellTracksColab** is hidden from Napari, Fiji and QuPath (notebook only); **NucleiSky, Guess the Condition and Playground** are offered by all three; **VLab4Mic** is offered by Napari and Fiji and **not** by QuPath. discovery rule: see PROTOCOL.md, section "App hosts (which host lists an app)". All three hosts honour the rule (merged: Napari #61, Fiji #47, QuPath #35; no host has a tag or release yet). Installers pass it from template 0.1.18 (template PR #33, not merged: it waits for the Tools tag `v0.3.0-alpha.1`); an app installed before that has no declaration and every host lists it, logging the 'declares no hosts' sentence of [PROTOCOL.md](PROTOCOL.md#app-hosts-which-host-lists-an-app). A host also leaves out, with a sentence in its Log, an app whose Tools is too old. The test steps are in [HUMAN_TEST_PROTOCOL.md](HUMAN_TEST_PROTOCOL.md#6-discovery-who-shows-which-app). | Feature | Napari | Fiji | QuPath | @@ -42,7 +42,7 @@ Each host reads the registry. Which app each host *must* offer is the discovery | `Affine` | overlay layer | overlay window | matrix shown | | Shared-memory image `order` (feature id `shm_order_v1`, Tools 0.3.0a1) | Worker side, same for every host: `C` / `F` (and Appose's `C_ORDER` / `F_ORDER`) are read in the order they were written, anything else is refused with `unreadable_image`. A host that sends an F-ordered block must require `shm_order_v1` ([PROTOCOL.md](PROTOCOL.md#tools-version-and-features)). Which host sends which order is not checked in this repository | same | same | | Big TIFF inputs are memory-mapped (Tools 0.3.0a1, no feature id) | Worker side, same for every host, nothing to do: a TIFF of 8 MiB or more that is uncompressed and contiguous is mapped copy-on-write; any other big TIFF is read the plain way and the worker says why in the log and on stderr (`LC_TIFF_MEMMAP=0` turns it off). On Windows a tool that keeps its input keeps the file locked until the worker ends ([OPERATIONS.md](OPERATIONS.md#troubleshooting)) | same | same | -| Per-host listing of apps (`hosts` of the app, feature id `app_hosts_v1`, Tools 0.3.0a1) | binding rule in Tools; once Napari PR #61 merges: lists an app only if its registry entry names `napari` (or has no `hosts`, logged); an excluded app is skipped with the sentence of [PROTOCOL.md](PROTOCOL.md#app-hosts-which-host-lists-an-app) | same, once Fiji PR #47 merges | same, once QuPath PR #35 merges | +| Per-host listing of apps (`hosts` of the app, feature id `app_hosts_v1`, Tools 0.3.0a1) | binding rule in Tools; Napari (PR #61, merged) lists an app only if its registry entry names `napari` (or has no `hosts`, logged); an excluded app is skipped with the sentence of [PROTOCOL.md](PROTOCOL.md#app-hosts-which-host-lists-an-app) | same (Fiji PR #47, merged) | same (QuPath PR #35, merged) | | Progress, Cancel, kept worker, run details | yes | progress and Esc | yes | | Macro / command recording | no | yes (macro recorder, replay) | no | diff --git a/docs/HUMAN_TEST_PROTOCOL.md b/docs/HUMAN_TEST_PROTOCOL.md index 799731c..51a198c 100644 --- a/docs/HUMAN_TEST_PROTOCOL.md +++ b/docs/HUMAN_TEST_PROTOCOL.md @@ -139,9 +139,9 @@ Nothing in `<...>` is a variable your terminal understands: type the real folder --- ## 3. Which host shows which app (the discovery matrix) -This is the **decided rule**; it is the binding rule in Tools (feature `app_hosts_v1`, Tools PR #133, merged); hosts honour it once their PRs merge (Napari #61, Fiji #47, -QuPath #35: open) and installers pass it from template 0.1.18 (template PR #33, not merged). Check the Tools tag, the host versions and the installer of your test set. -Without them every host lists every registered app that passes its compatibility check ([REPOSITORIES.md](REPOSITORIES.md)); the tests D1 to D3 are written for the rule. +This is the **decided rule**; it is the binding rule in Tools (feature `app_hosts_v1`, Tools PR #133, merged); the three hosts honour it (merged: Napari #61, Fiji #47, +QuPath #35; no host has a tag yet) and installers pass it from template 0.1.18 (template PR #33, not merged). Check the Tools tag, the host versions and the installer of your test set. +An app installed by an older installer has no declaration and every host lists it, logging the 'declares no hosts' sentence ([REPOSITORIES.md](REPOSITORIES.md)); the tests D1 to D3 are written for the rule. discovery rule: see PROTOCOL.md, section "App hosts (which host lists an app)" | App | Napari | Fiji | QuPath | Notebook (the app's own window) | @@ -275,13 +275,13 @@ A mismatch is a **Major** FAIL (an app that must be hidden is shown, or one that ### D2. VLab4Mic is not offered in QuPath **Do:** install VLab4Mic. Open QuPath's app chooser. Press **Rescan apps**. -**Expect:** VLab4Mic is not there, while it is in Napari and Fiji; the other apps are unaffected. The host writes `'VLab4Mic' is not listed in qupath: the app declares hosts: notebook, napari, fiji` to the Tools log (`/logs/labconstrictor.log`) and shows it wherever it reports left-out apps. This holds only once the installers pass `--app-manifest` (template 0.1.18 and the app sync are not merged yet): not verified until the apps are re-installed with an installer that passes the hosts. For an app registered by an installer that passes no hosts the sentence is `'' declares no hosts, so it is listed in every host; register it with --app-manifest (or --hosts) to choose`, and the app is then listed in every host. +**Expect:** VLab4Mic is not there, while it is in Napari and Fiji; the other apps are unaffected. The host writes `'VLab4Mic' is not listed in qupath: the app declares hosts: notebook, napari, fiji` to the Tools log (`/logs/labconstrictor.log`) and shows it wherever it reports left-out apps. The hosts honour the rule; what is still future is the declaration: it exists only once the installers pass `--app-manifest` (template 0.1.18 and the app sync are not merged yet), so this is not verified until the apps are re-installed with an installer that passes the hosts. For an app registered by an installer that passes no hosts the sentence is `'' declares no hosts, so it is listed in every host; register it with --app-manifest (or --hosts) to choose`, and the app is then listed in every host. - [ ] PASS - [ ] FAIL - [ ] N/A Notes: ______________________________ ### D3. CellTracksColab is offered nowhere **Do:** install CellTracksColab next to another app. Look at all three hosts (Rescan apps / restart Fiji). -**Expect:** not in any list, no error. The host writes `'CellTracksColab' is not listed in : the app declares hosts: notebook` to the Tools log and shows it wherever it reports left-out apps (write down the line you see). The other app still works. This holds only once the installers pass `--app-manifest` (template 0.1.18 and the app sync are not merged yet): not verified until the apps are re-installed with an installer that passes the hosts. +**Expect:** not in any list, no error. The host writes `'CellTracksColab' is not listed in : the app declares hosts: notebook` to the Tools log and shows it wherever it reports left-out apps (write down the line you see). The other app still works. The hosts honour the rule; the declaration exists only once the installers pass `--app-manifest` (template 0.1.18 and the app sync are not merged yet), so this is not verified until the apps are re-installed with an installer that passes the hosts; before that the app is listed in every host. - [ ] PASS - [ ] FAIL - [ ] N/A Notes: ______________________________ @@ -398,7 +398,6 @@ Send, in one message or issue titled `Test report: /pkgs` or uninstall first); testers install only tagged versions and only the latest. -* Napari (nothing is on PyPI yet; **Python 3.11 or newer, Qt6 backend**): `pip install "napari[pyqt6]" https://github.com/CellMigrationLab/LabConstrictor-Tools/archive/refs/tags/v0.3.0-alpha.1.zip https://github.com/CellMigrationLab/LabConstrictor-napari/archive/refs/tags/.zip` in the napari environment. The plugin had no tag when this was written, so `` does not exist yet; its README and user guide still give `refs/heads/main.zip` lines for both Tools and the plugin (an untagged install, which the rule above forbids for testers). Source archives: no `git` program needed. Plugins > LabConstrictor tools. +* Napari (nothing is on PyPI yet; **Python 3.11 or newer, Qt6 backend**): `pip install "napari[pyqt6]" https://github.com/CellMigrationLab/LabConstrictor-Tools/archive/refs/tags/v0.3.0-alpha.1.zip https://github.com/CellMigrationLab/LabConstrictor-napari/archive/refs/tags/.zip` in the napari environment. The plugin has no tag yet (14 Oct 2026), so `` is a placeholder that does not resolve; its README and user guide now give the same tag lines (Napari PR #60, merged) and no longer use `refs/heads/main.zip`. Source archives: no `git` program needed. Plugins > LabConstrictor tools. * Fiji (jar from the release, `labconstrictor-fiji-.jar`): copy it to `Fiji.app/plugins/`, restart: Plugins > LabConstrictor > LabConstrictor Tools... The release also carries `labconstrictor-fiji-script-.zip` (the script **and its `lib` folder**, to unzip into `Fiji.app/scripts/Plugins/LabConstrictor/`; entry without the dots; macro calls need the jar) and `SHA256SUMS` (Fiji README at f9277af; no Fiji release existed when this was written). * QuPath 0.7.0 (jar from the release, `labconstrictor-qupath-.jar`): drag it onto the QuPath window and restart: Extensions > LabConstrictor tools... The Script Editor alternative is the **single file** `LabConstrictorTools-all.groovy` of the release; the repository's script is split into part files that only the jar and the build join (QuPath README at 9e64c6d; no QuPath release existed when this was written). * Fiji, Napari and QuPath never import an app's packages, so apps with conflicting dependencies can coexist. @@ -30,13 +30,13 @@ State at 14 Oct 2026 (read from the `main` branches of the repositories; search | Repository | Pin today (file and line) | Pin pull request (draft, do not merge before the tag) | New app release after it | Still open outside the hooks | |---|---|---|---|---| -| `labconstrictor-playground` | `app/bash_bat_scripts/post_install.sh:83` and `post_install.bat:232` | #27 | 0.0.4 (latest 0.0.3) | `notebooks/LabConstrictorPlayground/LabConstrictorPlayground.ipynb` line 48 (`!pip install -q ...refs/heads/main.zip`); `.github/workflows/ci.yml` installs Tools `@main` on purpose (development CI) | -| `NucleiSky` | `post_install.sh:73` and `post_install.bat:223`: the bridge is **merged** (`nucleisky_lc_tools` is on `main`) | #38 | 0.1.4 (latest 0.1.3) | none found | -| `labconstrictor-vlab4mic` | `post_install.sh:73` and `post_install.bat:223` | #17 | proposed 0.1.6, to be confirmed (latest 0.1.5) | `README.md` lines 56-57 tell users to `pip install` Tools and the Napari plugin from `refs/heads/main.zip` | -| `guessthecondition` | `post_install.sh:73` and `post_install.bat:223` | #14 | proposed 0.0.1, to be confirmed (latest 0.0.0) | none found | +| `labconstrictor-playground` | `app/bash_bat_scripts/post_install.sh:83` and `post_install.bat:232` | #27 | 0.0.4, stated by the maintainer (latest 0.0.3) | `notebooks/LabConstrictorPlayground/LabConstrictorPlayground.ipynb` line 48 (`!pip install -q ...refs/heads/main.zip`); `.github/workflows/ci.yml` installs Tools `@main` on purpose (development CI) | +| `NucleiSky` | `post_install.sh:73` and `post_install.bat:223`: the bridge is **merged** (`nucleisky_lc_tools` is on `main`) | #38 | 0.1.4, stated by the maintainer (latest 0.1.3) | none found | +| `labconstrictor-vlab4mic` | `post_install.sh:73` and `post_install.bat:223` | #17 | 0.1.6, proposed, to be confirmed (latest 0.1.5) | `README.md` lines 56-57 tell users to `pip install` Tools and the Napari plugin from `refs/heads/main.zip` | +| `guessthecondition` | `post_install.sh:73` and `post_install.bat:223` | #14 | 0.0.1, proposed, to be confirmed (latest 0.0.0) | none found | | `CellTracksColab` | **no Tools step on `main`** (no tools registered); the held branch `bridge-test` has an unpinned `refs/heads/main.zip` line | none | 1.1.2 is held until the bridge decision (latest 1.1.1) | the bridge must be pinned to a tag before it is merged | | `LabConstrictor` (template) | `post_install.sh:73` and `post_install.bat:223` | #33 (template 0.1.18: pin, pinned actions, template CI, install rules) | template release after #33 (tag: ) | apps get the pin and the install page by the template sync after it is released | -| Docs that tell people to `pip install` Tools | `LabConstrictor-napari/README.md` lines 75-76 and 135 and `docs/user-guide.md` lines 20-21 (`refs/heads/main.zip`, the development version); this repository's README and docs name the tag | | | say `refs/tags/.zip` once the tags exist (the napari row is updated after napari PR #60 is merged, because that PR changes the napari docs) | +| Docs that tell people to `pip install` Tools | `LabConstrictor-napari/README.md` (line 77) and `docs/user-guide.md` (line 20) already say `refs/tags/.zip` with the placeholder `` (Napari PR #60, merged); this repository's README and docs name the tag | | | replace `` by the real tag once Napari has one | The tests of this repository keep the strings `LC_TOOLS_SPEC`, `refs/tags/`, `refs/heads/main.zip`, `post_install.sh` and `post_install.bat` in the pinning section above. diff --git a/docs/PROTOCOL.md b/docs/PROTOCOL.md index b18714e..885d597 100644 --- a/docs/PROTOCOL.md +++ b/docs/PROTOCOL.md @@ -63,7 +63,7 @@ Feature ids (the implemented ones are in `FEATURES`; a planned id appears there | `calibration_per_axis` | the worker copies the per-axis `_calibration` into the run record ([SPEC_WRONG_SCIENCE.md](SPEC_WRONG_SCIENCE.md) 2.3.4) | planned (registration/calibration PRs) | | `retention_prune` | the CLI command `labconstrictor-tools prune [--root results\|runs\|all] [--dry-run] [--json]` and `labconstrictor_tools.retention`: only folders carrying a valid `.lc-owner.json` and a `.lc-done.json` are ever removed ([SPEC_WRONG_SCIENCE.md](SPEC_WRONG_SCIENCE.md) section 3; hosts only mark a run finished, then start `prune`) | in 0.2.0rc1 (tag `v0.2.0-rc.1`) and every later version | | `shm_order_v1` | a shared-memory image descriptor's `order` is honoured: `C` / `C_ORDER` (or no `order`) and `F` / `F_ORDER` read the block in the order it was written, the tool always gets a C-ordered copy; any other value is refused with `unreadable_image` and a message naming `'C' or 'F'` (a block read in the wrong order would give the transposed image with no error) | in 0.3.0a1. **The behaviour already existed (PR #125) before the id: this is the one case where the id is added after the change, because versions 0.2.0rc1 and 0.2.0rc2 and `main` all reported the same `features` and could not be told apart; from now on an id is added in the change that implements the behaviour.** A host that sends `F` blocks requires it | -| `app_hosts_v1` | `register` records the app's declared `hosts` (a list of `notebook`, `napari`, `fiji`, `qupath`) in the registry entry, and every host lists an app only for a host named in that list ([App hosts](#app-hosts-which-host-lists-an-app) below); an entry without `hosts` stays listed in every host and says so | in 0.3.0a1 (added before the tag `v0.3.0-alpha.1`). A host that honours the rule requires it | +| `app_hosts_v1` | `register` records the app's declared `hosts` (a list of `notebook`, `napari`, `fiji`, `qupath`) in the registry entry, and every host lists an app only for a host named in that list ([App hosts](#app-hosts-which-host-lists-an-app) below); an entry without `hosts` stays listed in every host and says so | in 0.3.0a1 (added before the tag `v0.3.0-alpha.1`). Napari, Fiji and QuPath honour the rule (merged 14 Oct) and require it | ### Compatibility rules for hosts A host that needs a minimum states it as `(min_tools_version, required_features)` and applies the rules below to every schema it loads, with `labconstrictor_tools.compat.check_schema` (Python hosts: Napari, notebooks) or the same rules written in its own language (Fiji, QuPath; the data is in `conformance.json`, [CONFORMANCE.md](CONFORMANCE.md), `compat` section). The result is `ok`, `warn` or `refuse`, with one sentence for the person: diff --git a/docs/REPOSITORIES.md b/docs/REPOSITORIES.md index e711b47..31fb71d 100644 --- a/docs/REPOSITORIES.md +++ b/docs/REPOSITORIES.md @@ -18,12 +18,12 @@ Two other kinds of repository have different jobs: | Application | Repository | Tools registered for hosts | Tag of the next release (planned) | |---|---|---|---| | NucleiSky | [NucleiSky](https://github.com/CellMigrationLab/NucleiSky) | 2 (List the devices, Relocalize 2D) | 0.1.4 (latest 0.1.3) | -| Guess the Condition | [GuessTheCondition](https://github.com/CellMigrationLab/GuessTheCondition) | 6 (five game actions and one helper) | 0.0.1 (latest 0.0.0) | +| Guess the Condition | [GuessTheCondition](https://github.com/CellMigrationLab/GuessTheCondition) | 6 (five game actions and one helper) | 0.0.1, proposed (latest 0.0.0) | | Playground | the Playground row above | 17 | 0.0.4 (latest 0.0.3) | -| VLab4Mic | [LabConstrictor-VLab4Mic](https://github.com/CellMigrationLab/LabConstrictor-VLab4Mic) | 2 (Simulate imaging of a virtual sample, Compare an image with a reference) | 0.1.6 (latest 0.1.5) | +| VLab4Mic | [LabConstrictor-VLab4Mic](https://github.com/CellMigrationLab/LabConstrictor-VLab4Mic) | 2 (Simulate imaging of a virtual sample, Compare an image with a reference) | 0.1.6, proposed (latest 0.1.5) | | CellTracksColab | [CellTracksColab](https://github.com/CellMigrationLab/CellTracksColab) (its desktop app is released from this repository; the repository name `CellTracksColab_LabConstrictor` that this page and the README used to link was not reachable from here: not verified that it exists) | none on `main` (a bridge exists on the held branch `bridge-test`) | 1.1.2, held until the bridge decision (latest 1.1.1) | -Tool counts and latest releases are as of 14 Oct 2026 (the code of each repository's `main`, the GitHub release lists); "planned" numbers are the next free ones after the pin pull requests ([OPERATIONS.md](OPERATIONS.md#pinning-tools-in-app-installers)). +Tool counts and latest releases are as of 14 Oct 2026 (the code of each repository's `main`, the GitHub release lists); "planned" numbers are the next free ones after the pin pull requests (NucleiSky 0.1.4 and Playground 0.0.4 are stated by the maintainer; VLab4Mic 0.1.6 and Guess the Condition 0.0.1 are proposed and to be confirmed; [OPERATIONS.md](OPERATIONS.md#pinning-tools-in-app-installers)). ## What is shared @@ -31,7 +31,7 @@ The toolkit defines the [schema and worker protocol](PROTOCOL.md). Hosts read ca Hosts do **not** need to install the application's scientific dependencies. The application does **not** need to import Napari, Fiji or QuPath. -**Which host shows which app is a rule, not a side effect of registration.** An application with a valid registered manifest is discoverable by every host its `hosts:` line names; no other host lists it ([PROTOCOL.md](PROTOCOL.md#app-hosts-which-host-lists-an-app)). Decided 14 Oct 2026; the rule is in Tools (feature `app_hosts_v1`, Tools PR #133, merged). The hosts honour it once their pull requests merge (Napari #61, Fiji #47, QuPath #35: open, not merged); until then a host lists every registered app that passes its compatibility check. The practical value of a particular tool still depends on the host's workflow and on whether its inputs and outputs are relevant there. +**Which host shows which app is a rule, not a side effect of registration.** An application with a valid registered manifest is discoverable by every host its `hosts:` line names; no other host lists it ([PROTOCOL.md](PROTOCOL.md#app-hosts-which-host-lists-an-app)). Decided 14 Oct 2026; the rule is in Tools (feature `app_hosts_v1`, Tools PR #133, merged). The three hosts honour it (merged: Napari #61, Fiji #47, QuPath #35); an app with no declaration (installed before template 0.1.18 reaches the apps) is listed in every host, with the 'declares no hosts' sentence in the Tools log. The practical value of a particular tool still depends on the host's workflow and on whether its inputs and outputs are relevant there. | App | Napari | Fiji | QuPath | Notebook | |---|---|---|---|---| @@ -41,7 +41,7 @@ Hosts do **not** need to install the application's scientific dependencies. The discovery rule: see PROTOCOL.md, section "App hosts (which host lists an app)" -The `hosts:` line of an app's `labconstrictor-app.yaml` (App-Centre metadata, schema `.tools/schema/labconstrictor-app.schema.json` of the template) is the binding rule in Tools (PROTOCOL.md, section "App hosts (which host lists an app)"); hosts honour it once their PRs merge; installers pass it from template 0.1.18 (`--app-manifest` or `--hosts`; template PR #33, not merged). +The `hosts:` line of an app's `labconstrictor-app.yaml` (App-Centre metadata, schema `.tools/schema/labconstrictor-app.schema.json` of the template) is the binding rule in Tools (PROTOCOL.md, section "App hosts (which host lists an app)"); the three hosts honour it (merged); installers pass it from template 0.1.18 (`--app-manifest` or `--hosts`; template PR #33, not merged: it waits for the Tools tag `v0.3.0-alpha.1`). This is a shared contract, **not a promise that every host implements every presentation hint**. For example, an image selection, a dynamic dropdown or an output table may be handled differently by each host. Consult the relevant host README for current behavior and limits. diff --git a/docs/TESTING.md b/docs/TESTING.md index ed7350e..f4d1210 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -137,6 +137,10 @@ runs them again and **fails when one starts to pass**, so the fix PR must delete `:`, `property:`, `hint:`, `failure:`, `lifecycle:`, `test:`, `winquote: