Fix short-intent discovery and publish verified browser provider guidance
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 2s
ci / validate-registry (push) Successful in 1m40s
Build and Publish Container Image / build-and-push (push) Successful in 40s

Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13690-1c84-77a2-aeee-7f517ec60f5d
This commit is contained in:
tegwick 2026-10-13 20:48:05 +02:00
parent 9042dec5ed
commit 50077c9bea
22 changed files with 736 additions and 87 deletions

View file

@ -2,12 +2,18 @@
# Custodian Brief — reuse-surface # Custodian Brief — reuse-surface
**Domain:** infotech **Domain:** infotech
**Last synced:** 2026-10-13 11:59 UTC **Last synced:** 2026-10-13 18:43 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)* **State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Active Workstreams ## Active Workstreams
*(none — repo may need first-session setup)* ### Resolve browser discovery relevance and publish verified provider consumption
Progress: 0/3 done | workplan_id: `3d62d0af-5deb-55b5-b570-e62f05a43666`
**Open tasks:**
- ► Publish the verified provider path `dd75f033`
- · Fix short-intent relevance `a689bc2a`
- · Validate, publish and synchronize `0be283ba`
## Inbox Hygiene ## Inbox Hygiene

View file

@ -10,8 +10,12 @@
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| workplan | ADHOC-2026-10-13 | finished | — | workplans/ADHOC-2026-10-13.md | | workplan | ADHOC-2026-10-13 | finished | — | workplans/ADHOC-2026-10-13.md |
| workplan | REUSE-WP-0023 | finished | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | workplan | REUSE-WP-0023 | finished | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
| workplan | REUSE-WP-0024 | active | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
| task | ADHOC-2026-10-13-T01 | done | — | workplans/ADHOC-2026-10-13.md | | task | ADHOC-2026-10-13-T01 | done | — | workplans/ADHOC-2026-10-13.md |
| task | ADHOC-2026-10-13-T02 | done | — | workplans/ADHOC-2026-10-13.md | | task | ADHOC-2026-10-13-T02 | done | — | workplans/ADHOC-2026-10-13.md |
| task | REUSE-WP-0023-T01 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | task | REUSE-WP-0023-T01 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
| task | REUSE-WP-0023-T02 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | task | REUSE-WP-0023-T02 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
| task | REUSE-WP-0024-T01 | progress | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
| task | REUSE-WP-0024-T02 | todo | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
| task | REUSE-WP-0024-T03 | todo | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
| intake | REUSE-IN-0001 | open | green | intakes/REUSE-IN-0001-headless-browser-runnable-answer.md | | intake | REUSE-IN-0001 | open | green | intakes/REUSE-IN-0001-headless-browser-runnable-answer.md |

View file

@ -36,13 +36,14 @@ Generated by `reuse-surface catalog`. Do not edit manually.
### Headless Browser Automation ### Headless Browser Automation
- **ID:** `capability.infotech.headless-browser` - **ID:** `capability.infotech.headless-browser`
- **Vector:** D3 / A2 / C2 / R2 - **Vector:** D3 / A5 / C2 / R2
- **Owner:** reuse-surface - **Owner:** reuse-surface
- **Path:** `registry/capabilities/capability.infotech.headless-browser.md` - **Path:** `registry/capabilities/capability.infotech.headless-browser.md`
- **Summary:** Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available). - **Summary:** Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
**Known limitations:** **Known limitations:**
- This is a dated source inspection; run the target-repo trial before claiming adoption success. - This is a dated source inspection; run the target-repo trial before claiming adoption success.
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection. - Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here. - Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
- The forthcoming rapp-playwright service has no verified endpoint or launch receipt in this record yet. - Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
- Provider fixture success does not establish consumer target reachability or application acceptance.

View file

@ -32,8 +32,8 @@
<section><h2>infotech</h2> <section><h2>infotech</h2>
<article class="card"> <article class="card">
<h3>Headless Browser Automation</h3> <h3>Headless Browser Automation</h3>
<p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A2 / C2 / R2</p> <p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A5 / C2 / R2</p>
<p>Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).</p> <p>Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.</p>
<p class="path">registry/capabilities/capability.infotech.headless-browser.md</p> <p class="path">registry/capabilities/capability.infotech.headless-browser.md</p>
</article></section> </article></section>
</body> </body>

View file

@ -5,8 +5,8 @@
{ {
"id": "capability.infotech.headless-browser", "id": "capability.infotech.headless-browser",
"name": "Headless Browser Automation", "name": "Headless Browser Automation",
"summary": "Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).", "summary": "Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.",
"vector": "D3 / A2 / C2 / R2", "vector": "D3 / A5 / C2 / R2",
"domain": "infotech", "domain": "infotech",
"status": "reviewed", "status": "reviewed",
"owner": "reuse-surface", "owner": "reuse-surface",
@ -29,7 +29,10 @@
"informational", "informational",
"source adaptation", "source adaptation",
"JavaScript library", "JavaScript library",
"Python library" "Python library",
"cli",
"service API",
"container"
] ]
}, },
{ {

View file

@ -0,0 +1,84 @@
# Browser discovery review — 2026-10-13
REUSE-WP-0024 resolves the registry-owned portion of REUSE-IN-0001 on the
existing `capability.infotech.headless-browser` record. Provider implementation
and managed lifecycle remain with rapp-playwright and railiance-platform;
CONTENT-WP-0000-T04 remains the consumer's acceptance task.
## Published provider evidence
Fetched the raw client, consumer contract, independent-consumer report and
release manifest at provider commit
`8831a05aeba5ce588f3b395ade676dde2a151c5d`. All four matched `git show` at that
revision byte for byte. The single-file Python client SHA-256 is
`9967a0831ed04e27fde419098af707722d5c81c993e4c294b3677ffb75729c12`.
Pinned public links are retained in the
[capability card](../../registry/capabilities/capability.infotech.headless-browser.md).
The published image is
`forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441`
for linux/amd64. Provider publication evidence includes immutable registry
verification and railiance01 pull. This review did not redeploy the provider.
## Fresh client-only local trial
Executed the downloaded client, without installing Playwright or Chromium:
```sh
python3 /tmp/reuse-browser-review/rapp_playwright.py --url http://127.0.0.1:18083 preflight
python3 /tmp/reuse-browser-review/rapp_playwright.py --url http://127.0.0.1:18083 trial --out /tmp/reuse-browser-review/trial-01
```
Both exited 0. Run `6c710b36-319b-45b8-b062-ac2065f5e81b` completed at
**18:42:58 UTC** with **14 passed steps**: visibility, counter checks, Tab,
focused-button assertion, Enter and screenshot in two viewports. The provider
reported service 0.1.0, Playwright 1.64.0, Chromium 156.0.8078.4,
`workstation-release-check`, and the published digest above. Preflight permitted
no external origins; only the synthetic fixture was exercised.
Independently parsed all four PNG headers and recomputed hashes against the
client receipt. Desktop screenshots are 1280×800 and narrow screenshots are
390×844. This validates dimensions and integrity, not visual-baseline quality.
- [Preflight](2026-10-13-browser-discovery/preflight.json)
- [Receipt](2026-10-13-browser-discovery/receipt.json)
- [Independent artifact checks](2026-10-13-browser-discovery/artifact-checks.json)
- [Desktop fixture](2026-10-13-browser-discovery/desktop-final.png)
- [Narrow fixture](2026-10-13-browser-discovery/narrow-final.png)
Private run handles are excluded. The endpoint is ephemeral and was available
on this workstation at trial time; it is not a managed service or a promise of
future availability. The source examples remain a fallback when a provider is
unavailable. No consumer app, remote target or managed browser was tested.
## Assessment and matching
Promoted availability **A2 → A5** under the standard's deployable-container
definition. **A6 managed platform capability remains pending**. D3/C2/R2 stay
conservative; fixture execution does not prove broader target compatibility or
platform operation. Decision recorded in State Hub as
`b8ef28c1-9164-4678-8a61-1652e0f07407`.
Before this fix, `plan-check --intent "headless browser" --no-llm` returned
`new`, with an unrelated context engine first at 0.0476 and the browser third.
After scoring names independently from summaries/tags, the same query returns
`reuse`, with the browser first at **0.6667** and unrelated matches at **0.2 or
less**. Long command/evidence summaries no longer dilute direct name matches.
The output includes the standalone client link, preflight/trial commands,
ephemeral endpoint warning, managed-admission condition and availability-gap
fallback. Reuse advice now describes relevance rather than asserting readiness.
Regressions cover short-name relevance despite long summaries and higher-maturity
unrelated services, summary-only matching, equal-relevance maturity ties, and
hosted CLI output carrying conditional provider instructions. Stats tests now
use a fixed temporary registry rather than assuming the live repo always has
two capabilities.
## Validation
- `.venv/bin/python -m pytest -q`: **212 passed**. One existing Starlette
TestClient/httpx deprecation warning remains.
- `validate --relations --fail-on-warnings`: **3 entries valid**.
- `catalog`, `graph --check`, and `federation compose`: generated successfully;
**66 federated capabilities**, preserving one browser capability.
- `git diff --check`: clean.

View file

@ -0,0 +1,30 @@
[
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
"width": 1280,
"height": 800
},
{
"name": "desktop-final.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
"width": 1280,
"height": 800
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
"width": 390,
"height": 844
},
{
"name": "narrow-final.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
"width": 390,
"height": 844
}
]

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View file

@ -0,0 +1,22 @@
{
"available": true,
"error": null,
"checked_at": "2026-10-13T18:42:18.136Z",
"browser_version": "156.0.8078.4",
"api_version": "1",
"service_version": "0.1.0",
"playwright_version": "1.64.0",
"execution_location": "workstation-release-check",
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
"allowed_origins": [],
"fixture": true,
"active": 0,
"queued": 0,
"limits": {
"concurrency": 1,
"max_queue": 4,
"max_timeout_ms": 120000,
"retention_ms": 3600000,
"max_runs": 64
}
}

View file

@ -0,0 +1,184 @@
{
"id": "6c710b36-319b-45b8-b062-ac2065f5e81b",
"api_version": "1",
"status": "passed",
"error": null,
"label": "independent-browser-trial",
"target": "fixture",
"viewports": [
{
"name": "desktop",
"width": 1280,
"height": 800
},
{
"name": "narrow",
"width": 390,
"height": 844
}
],
"timeout_ms": 60000,
"created_at": "2026-10-13T18:42:41.545Z",
"expires_at": "2026-10-13T19:42:41.545Z",
"service_version": "0.1.0",
"playwright_version": "1.64.0",
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
"execution_location": "workstation-release-check",
"browser_version": "156.0.8078.4",
"completed_steps": 14,
"steps": [
{
"viewport": "desktop",
"index": 0,
"action": "visible",
"status": "passed",
"at": "2026-10-13T18:42:52.067Z",
"selector": "h1"
},
{
"viewport": "desktop",
"index": 1,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:52.461Z",
"selector": "#count"
},
{
"viewport": "desktop",
"index": 2,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:52.576Z",
"key": "Tab"
},
{
"viewport": "desktop",
"index": 3,
"action": "focused",
"status": "passed",
"at": "2026-10-13T18:42:52.660Z",
"selector": "#increment"
},
{
"viewport": "desktop",
"index": 4,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:52.674Z",
"key": "Enter"
},
{
"viewport": "desktop",
"index": 5,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:52.754Z",
"selector": "#count"
},
{
"viewport": "desktop",
"index": 6,
"action": "screenshot",
"status": "passed",
"at": "2026-10-13T18:42:52.764Z"
},
{
"viewport": "narrow",
"index": 0,
"action": "visible",
"status": "passed",
"at": "2026-10-13T18:42:55.566Z",
"selector": "h1"
},
{
"viewport": "narrow",
"index": 1,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:55.959Z",
"selector": "#count"
},
{
"viewport": "narrow",
"index": 2,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:56.177Z",
"key": "Tab"
},
{
"viewport": "narrow",
"index": 3,
"action": "focused",
"status": "passed",
"at": "2026-10-13T18:42:56.253Z",
"selector": "#increment"
},
{
"viewport": "narrow",
"index": 4,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:56.265Z",
"key": "Enter"
},
{
"viewport": "narrow",
"index": 5,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:56.275Z",
"selector": "#count"
},
{
"viewport": "narrow",
"index": 6,
"action": "screenshot",
"status": "passed",
"at": "2026-10-13T18:42:56.359Z"
}
],
"artifacts": [
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622
},
{
"name": "desktop-final.png",
"bytes": 26622
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280
},
{
"name": "narrow-final.png",
"bytes": 24280
}
],
"started_at": "2026-10-13T18:42:41.550Z",
"blocked_requests": 13,
"finished_at": "2026-10-13T18:42:58.107Z",
"downloads": [
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
},
{
"name": "desktop-final.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
},
{
"name": "narrow-final.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
}
]
}

View file

@ -1,5 +1,5 @@
graph LR graph LR
capability_infotech_headless_browser["capability.infotech.headless-browser<br/>D3 / A2 / C2 / R2"] capability_infotech_headless_browser["capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2"]
capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"] capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"]
capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"] capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"]
capability_registry_register -->|supports| capability_feature_control_evaluate capability_registry_register -->|supports| capability_feature_control_evaluate

View file

@ -17,7 +17,7 @@
<p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p> <p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p>
<pre class="mermaid" id="graph"></pre> <pre class="mermaid" id="graph"></pre>
<script> <script>
document.getElementById('graph').textContent = "graph LR\n capability_infotech_headless_browser[\"capability.infotech.headless-browser<br/>D3 / A2 / C2 / R2\"]\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n"; document.getElementById('graph').textContent = "graph LR\n capability_infotech_headless_browser[\"capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2\"]\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n";
</script> </script>
</body> </body>
</html> </html>

View file

@ -2,11 +2,18 @@
id: capability.infotech.headless-browser id: capability.infotech.headless-browser
name: Headless Browser Automation name: Headless Browser Automation
summary: >- summary: >-
Headless browser automation with Playwright and Chromium for UI testing, Headless browser automation, screenshots and keyboard trials through
screenshots and page extraction; recommended default based on existing rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4).
whynot-design, coulomb-social, core-hub and frontend-patterns implementations. Published A5 local container; managed Railiance admission is pending.
A rapp-playwright-provided service will be available shortly (announced Download the Python 3.10+ standalone client from
2026-10-13; planned, not yet verified available). https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`,
then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
with a fresh output directory. This endpoint was verified locally on 2026-10-13
and is ephemeral; it installs no browser for the caller. If unreachable,
follow the local container setup in the capability card or adapt its A2 source
examples; this is an availability gap on the existing capability.
Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
owner: reuse-surface owner: reuse-surface
status: reviewed status: reviewed
domain: infotech domain: infotech
@ -20,14 +27,15 @@ maturity:
Inspected four implemented Playwright consumers and separated optional Inspected four implemented Playwright consumers and separated optional
dependencies and plans from usage. No comprehensive alternatives benchmark. dependencies and plans from usage. No comprehensive alternatives benchmark.
availability: availability:
current: A2 current: A5
target: A2 target: A6
confidence: medium confidence: medium
rationale: > rationale: >
Existing JavaScript and Python source examples can be adapted in a consumer rapp-playwright 0.1.0 is a published immutable container with a versioned
repo. This entry does not deliver a shared wrapper or hosted browser service. HTTP contract and standalone Python client, independently trialled locally.
The founder announced a forthcoming rapp-playwright service on 2026-10-13; A5 describes deployable container availability, not managed operation (A6).
that planned delivery does not change the evidenced current A2 level. Railiance admission is pending. Existing A2 source adaptation remains usable;
no endpoint uptime or caller browser installation is implied.
external_evidence: external_evidence:
completeness: completeness:
level: C2 level: C2
@ -36,8 +44,10 @@ external_evidence:
satisfied_expectations: satisfied_expectations:
- Identifies implemented consumers, browser engines and source entry points. - Identifies implemented consumers, browser engines and source entry points.
- Gives a scoped default recommendation and a practical trial procedure. - Gives a scoped default recommendation and a practical trial procedure.
- Published provider client and container have independent fixture screenshots and keyboard receipts.
broken_expectations: broken_expectations:
- No shared package, standard configuration or consumer-independent trial receipt. - Managed admission and persistent platform endpoint are still pending.
- Consumer application acceptance remains the consuming repo's responsibility.
out_of_scope_expectations: out_of_scope_expectations:
- Exhaustive estate dependency inventory or comparative browser benchmark. - Exhaustive estate dependency inventory or comparative browser benchmark.
- Browser service implementation or operation by reuse-surface. - Browser service implementation or operation by reuse-surface.
@ -49,10 +59,13 @@ external_evidence:
known_reliability_risks: known_reliability_risks:
- Browser binaries and system libraries must match the selected Playwright version. - Browser binaries and system libraries must match the selected Playwright version.
- Existing examples contain application-specific fixtures and assumptions. - Existing examples contain application-specific fixtures and assumptions.
- Browser launch and target-repo compatibility have not been tested by this registration. - Local fixture receipts do not prove managed operation or arbitrary target compatibility.
- Local provider endpoints are ephemeral; check preflight for each trial.
evidence: evidence:
satisfied_signals: satisfied_signals:
- frontend-patterns navigation-history records a completed Chromium/Firefox experiment. - frontend-patterns navigation-history records a completed Chromium/Firefox experiment.
- rapp-playwright independent final-release trial passed 14 steps across desktop and narrow viewports.
- Independent provider evidence includes wrong-token, failed assertion and unavailable-service checks.
discovery: discovery:
intent: > intent: >
Help a worker select and reuse existing headless browser tooling instead of Help a worker select and reuse existing headless browser tooling instead of
@ -61,19 +74,24 @@ discovery:
- Playwright automation with headless Chromium as the default starting point. - Playwright automation with headless Chromium as the default starting point.
- JavaScript UI tests, screenshots and page extraction examples. - JavaScript UI tests, screenshots and page extraction examples.
- Python visual-check example and Firefox experiment evidence. - Python visual-check example and Firefox experiment evidence.
- Published rapp-playwright container, Python client and bounded HTTP fixture trials.
excludes: excludes:
- Browser hosting or workstation provisioning by reuse-surface. - Browser hosting or workstation provisioning by reuse-surface.
- Credential provisioning and permission to automate external targets. - Credential provisioning and permission to automate external targets.
- Claims that a dependency declaration or a workplan proves executed browser usage. - Claims that a dependency declaration or a workplan proves executed browser usage.
assumptions: assumptions:
- The consumer chooses a version compatible with its runtime and installs matching browsers. - Source-adaptation consumers install matching browsers; provider clients need only Python 3.10+.
- Provider consumers establish an available endpoint and run preflight before a trial.
use_cases: use_cases:
- Find which working repos already use a headless browser and where to start reusing it. - Find which working repos already use a headless browser and where to start reusing it.
- Run a local UI assertion and screenshot in a target repo before adopting the tooling. - Run a local UI assertion and screenshot in a target repo before adopting the tooling.
availability: availability:
current_level: A2 current_level: A5
target_level: A2 target_level: A6
current_artifacts: current_artifacts:
- forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
- https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json
- ../whynot-design/playwright.config.mjs - ../whynot-design/playwright.config.mjs
- ../whynot-design/tests/visual/ui-kit.spec.mjs - ../whynot-design/tests/visual/ui-kit.spec.mjs
- ../coulomb-social/scripts/test-usecase-browser.mjs - ../coulomb-social/scripts/test-usecase-browser.mjs
@ -81,10 +99,9 @@ availability:
- ../frontend-patterns/research/experiments/navigation-history/experiment.mjs - ../frontend-patterns/research/experiments/navigation-history/experiment.mjs
target_artifacts: target_artifacts:
- >- - >-
Planned rapp-playwright-provided service, announced by the founder on Managed Railiance deployment after platform admission, with consumer
2026-10-13 as available shortly; endpoint, consumption contract and readiness access and live recovery/rollback evidence; not currently available.
evidence have not yet been verified by reuse-surface. consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
consumption_modes: [informational, source adaptation, JavaScript library, Python library]
relations: relations:
depends_on: [] depends_on: []
supports: [] supports: []
@ -95,9 +112,12 @@ evidence:
- ../frontend-patterns/research/experiments/navigation-history/README.md - ../frontend-patterns/research/experiments/navigation-history/README.md
- ../test-driver/SCOPE.md - ../test-driver/SCOPE.md
- ../testdrive-jsui/pyproject.toml - ../testdrive-jsui/pyproject.toml
- ../rapp-playwright/README.md - https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md
- intakes/REUSE-IN-0001-headless-browser-runnable-answer.md - intakes/REUSE-IN-0001-headless-browser-runnable-answer.md
tests: tests:
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md
- docs/evidence/2026-10-13-browser-discovery.md
- ../whynot-design/tests/visual/ui-kit.spec.mjs - ../whynot-design/tests/visual/ui-kit.spec.mjs
- ../coulomb-social/scripts/test-usecase-browser.mjs - ../coulomb-social/scripts/test-usecase-browser.mjs
- ../core-hub/scripts/check_console_visual.py - ../core-hub/scripts/check_console_visual.py
@ -114,9 +134,10 @@ consumer_guidance:
- Reuse whynot-design for JavaScript visual tests and core-hub for Python visual checks. - Reuse whynot-design for JavaScript visual tests and core-hub for Python visual checks.
- Reuse coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments. - Reuse coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments.
- >- - >-
For service consumption, rapp-playwright is the announced provider and its For bounded screenshot and keyboard jobs, use the published rapp-playwright
service will be available shortly. Use its published contract and readiness Python client against an available local provider and run preflight first.
evidence when delivered; current availability remains source reuse only. Use the immutable container to reproduce the provider; managed Railiance
access requires admission and a working tunnel before consumption.
not_recommended_for: not_recommended_for:
- Treating this recommendation as an approved mandatory estate standard. - Treating this recommendation as an approved mandatory estate standard.
- Selecting test-driver as an implemented JavaScript-capable browser engine. - Selecting test-driver as an implemented JavaScript-capable browser engine.
@ -125,8 +146,19 @@ consumer_guidance:
- This is a dated source inspection; run the target-repo trial before claiming adoption success. - This is a dated source inspection; run the target-repo trial before claiming adoption success.
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection. - Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here. - Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
- The forthcoming rapp-playwright service has no verified endpoint or launch receipt in this record yet. - Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
promotion_history: [] - Provider fixture success does not establish consumer target reachability or application acceptance.
promotion_history:
- date: "2026-10-13"
dimension: availability
from: A2
to: A5
rationale: >-
Published immutable rapp-playwright 0.1.0 container, versioned client/contract
and independent local release receipts satisfy deployable-container availability.
This is not an A6 managed-platform claim. D3, C2 and R2 remain conservative
assessments pending broader target and operational evidence.
author: codex
--- ---
# Headless Browser Automation # Headless Browser Automation
@ -147,24 +179,101 @@ implementations and the upstream Playwright project maintains the library.
## Service provider and delivery status ## Service provider and delivery status
**A `rapp-playwright`-provided service will be available shortly**, as announced by **rapp-playwright 0.1.0 is published and verified as a local container provider.**
the founder on 2026-10-13. Its [repository description](../../../rapp-playwright/README.md) The current vector is **D3 / A5 / C2 / R2**. A5 means a deployable container under
identifies a Railiance wrapper for a Playwright and headless Chromium environment [the maturity standard](../../specs/CapabilityMaturityStandard.md); managed
supporting use-case testing. Service availability is **planned**, not verified: platform operation is A6 and remains **pending Railiance admission**. Source
this record has no confirmed endpoint, consumption contract or launch receipt yet. examples remain available at A2. No browser is installed on the caller's machine
The current **D3 / A2 / C2 / R2** vector continues to describe evidenced source reuse. by discovery or by running the Python client.
`rapp-playwright` owns the forthcoming browser service. `reuse-surface` owns `rapp-playwright` owns the browser service; `railiance-platform` owns managed
discovery, consumption guidance, maturity assessment and evidence references; it lifecycle admission. `reuse-surface` owns this record, discovery, consumption
does not implement or operate the browser service or install browsers on behalf guidance and evidence assessment. The
of consumers. Its `owner` field here denotes the maintainer of this registry record. [content-explorer intake](../../intakes/REUSE-IN-0001-headless-browser-runnable-answer.md)
concerns registry relevance and availability clarity; CONTENT-WP-0000-T04
acceptance remains with the consumer.
The [content-explorer feedback](../../intakes/REUSE-IN-0001-headless-browser-runnable-answer.md) ### Verified client path
is retained as consumer evidence. Browser delivery is assigned to the provider;
the reported relevance, false-`new` verdict and availability-clarity issues remain Only Python 3.10+ is needed by the consumer. Download the single revision-pinned
reuse-surface concerns. A2 means source/library reuse, not proof of a locally client into a working directory; a sibling checkout is not required:
installed browser. The service announcement does not complete the consumer's
screenshot and keyboard-walkthrough task. ```sh
curl -fL --output rapp_playwright.py https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight
python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01
```
Use a fresh output directory for each run. Port **18083** was verified on this
workstation on **2026-10-13**; it is an ephemeral local provider, not a permanent
or remotely reachable endpoint. Preflight must report `available: true`, API 1,
service 0.1.0, Playwright **1.64.0**, Chromium **156.0.8078.4**, and the expected
release/location. Connection failure means the provider or tunnel is unavailable,
not that another browser capability is needed. Use the local setup below or the
source-adaptation fallback. Repeat `--url` on later status/download commands.
The fixture trial checks Tab focus, Enter activation and the counter assertion
across **1280×800** and **390×844** viewports, then downloads screenshots and a
receipt. It does not inspect or accept the consumer's own UI. `run.json` is a
private run handle and must not be published. For `trial`/`run`, exit 0 means
passed, 2 means UI assertion failed, and 3 means infrastructure/setup or another
unsuccessful result; `status` exit 0 only means retrieval succeeded.
### Reproduce the local provider
The published release targets **linux/amd64**. With Docker and image pull access,
start the immutable container in one terminal, then point the client at port
**18081** in another:
```sh
docker run --rm --name rapp-playwright-local --read-only \
--tmpfs /tmp:rw,size=512m --shm-size=256m --memory=1g --cpus=1 \
--cap-drop ALL --security-opt no-new-privileges \
--mount type=volume,src=rapp-playwright-local-data,dst=/data \
-p 127.0.0.1:18081:8080 -e HOST=0.0.0.0 \
-e EXECUTION_LOCATION=workstation-container \
-e RELEASE_ID=sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441 \
forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
python3 rapp_playwright.py --url http://127.0.0.1:18081 preflight
python3 rapp_playwright.py --url http://127.0.0.1:18081 trial --out trial-local-01
```
This is the provider's documented local setup with the published digest pinned;
it was not redeployed by this registry review. Existing independent final-release
receipts and the fresh discovery trial use the same digest. The default fixture
requires no external target grant. The provider supports trusted/synthetic pages,
not hostile-page or mutually untrusted tenant execution.
### Conditional managed path
Only **after platform admission, deployment and caller access are confirmed**:
```sh
kubectl -n playwright port-forward deployment/playwright 18081:8080 --address 127.0.0.1
# In another terminal, while the tunnel remains running:
python3 rapp_playwright.py preflight
python3 rapp_playwright.py trial --out trial-managed-01
```
No managed deployment or successful managed invocation is claimed here. A remote
browser's localhost belongs to the provider. Consumer applications need a
provider-reachable, explicitly allowed origin; the browser API tunnel does not
forward a workstation app. See the provider contract before running a target
scenario.
### Pinned delivery evidence
All provider links below are pinned to published commit
`8831a05aeba5ce588f3b395ade676dde2a151c5d`:
- [Consumer contract](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md).
- [Release manifest](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json)
and [publication/pull evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md).
- [Independent consumer evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md),
including final-release screenshots, keyboard assertions, wrong-token rejection,
UI failure and unavailable-service results. These are retained provider-side
reports; this review separately verified the fixture path.
- [Fresh registry review and trial](../../docs/evidence/2026-10-13-browser-discovery.md).
## Existing implementations ## Existing implementations
@ -196,15 +305,14 @@ copy its workstation paths as a portable browser installation recipe.
- **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained - **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained
experiment evidence here; WebKit has no verified local example in this record. experiment evidence here; WebKit has no verified local example in this record.
## Practical trial for the consuming worker ## Source-adaptation fallback for the consuming worker
1. Query this checkout with `python3 -m reuse_surface.cli query --keyword browser` 1. Query this checkout with `python3 -m reuse_surface.cli query --keyword browser`
from the reuse-surface root, then open this entry. If the CLI is installed, from the reuse-surface root, then open this entry. If the CLI is installed,
`reuse-surface query --keyword browser` is equivalent. `reuse-surface query --keyword browser` is equivalent.
`plan-check --intent "headless browser" --no-llm` also includes this candidate, `plan-check --intent "headless browser" --no-llm` ranks this entry first.
but its token-overlap thresholds and maturity tie-breaking currently return Its reuse verdict describes relevance; provider preflight determines current
`new` for this short query. That verdict does not establish absence of reuse; runtime availability. Use source adaptation when the provider path is unsuitable.
use the explicit keyword query and read the evidence for this trial.
2. Pick the example matching the target repo's language and task. Inspect its 2. Pick the example matching the target repo's language and task. Inspect its
fixture/server assumptions before adapting the smallest useful test or script. fixture/server assumptions before adapting the smallest useful test or script.
3. Use the target repo's package manager and lockfile. Select a compatible 3. Use the target repo's package manager and lockfile. Select a compatible

View file

@ -6,18 +6,25 @@ capabilities:
- id: capability.infotech.headless-browser - id: capability.infotech.headless-browser
name: Headless Browser Automation name: Headless Browser Automation
summary: >- summary: >-
Headless browser automation with Playwright and Chromium for UI testing, Headless browser automation, screenshots and keyboard trials through
screenshots and page extraction; recommended default based on existing rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4).
whynot-design, coulomb-social, core-hub and frontend-patterns implementations. Published A5 local container; managed Railiance admission is pending.
A rapp-playwright-provided service will be available shortly (announced Download the Python 3.10+ standalone client from
2026-10-13; planned, not yet verified available). https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
vector: D3 / A2 / C2 / R2 and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`,
then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
with a fresh output directory. This endpoint was verified locally on 2026-10-13
and is ephemeral; it installs no browser for the caller. If unreachable,
follow the local container setup in the capability card or adapt its A2 source
examples; this is an availability gap on the existing capability.
Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
vector: D3 / A5 / C2 / R2
domain: infotech domain: infotech
status: reviewed status: reviewed
owner: reuse-surface owner: reuse-surface
path: registry/capabilities/capability.infotech.headless-browser.md path: registry/capabilities/capability.infotech.headless-browser.md
tags: [headless, browser, automation, playwright, chromium, testing, screenshots, extraction, firefox, webkit, selenium, puppeteer] tags: [headless, browser, automation, playwright, chromium, testing, screenshots, extraction, firefox, webkit, selenium, puppeteer]
consumption_modes: [informational, source adaptation, JavaScript library, Python library] consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
- id: capability.registry.register - id: capability.registry.register
name: Capability Registration name: Capability Registration

View file

@ -943,12 +943,17 @@ capabilities:
source_index: registry/federation/cache/email-connect.yaml source_index: registry/federation/cache/email-connect.yaml
- id: capability.infotech.headless-browser - id: capability.infotech.headless-browser
name: Headless Browser Automation name: Headless Browser Automation
summary: Headless browser automation with Playwright and Chromium for UI testing, summary: 'Headless browser automation, screenshots and keyboard trials through rapp-playwright
screenshots and page extraction; recommended default based on existing whynot-design, 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container;
coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided managed Railiance admission is pending. Download the Python 3.10+ standalone client
service will be available shortly (announced 2026-10-13; planned, not yet verified from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
available). and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then
vector: D3 / A2 / C2 / R2 `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
with a fresh output directory. This endpoint was verified locally on 2026-10-13
and is ephemeral; it installs no browser for the caller. If unreachable, follow
the local container setup in the capability card or adapt its A2 source examples;
this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.'
vector: D3 / A5 / C2 / R2
domain: infotech domain: infotech
status: reviewed status: reviewed
owner: reuse-surface owner: reuse-surface
@ -971,6 +976,9 @@ capabilities:
- source adaptation - source adaptation
- JavaScript library - JavaScript library
- Python library - Python library
- cli
- service API
- container
source_repo: reuse-surface source_repo: reuse-surface
source_index: registry/indexes/capabilities.yaml source_index: registry/indexes/capabilities.yaml
- id: capability.infotech.hub-core-library - id: capability.infotech.hub-core-library

View file

@ -147,7 +147,14 @@ def match_query(
tokens = _tokens(blob) tokens = _tokens(blob)
if not tokens: if not tokens:
continue continue
score = len(query.tokens & tokens) / len(query.tokens | tokens) # Score the name independently: descriptive summaries must not dilute
# a direct short-intent match (e.g. "headless browser"). Keep the full
# blob score for longer intents and summary/tag-only matches.
name_tokens = _tokens(item.get("name", ""))
score = max(
len(query.tokens & tokens) / len(query.tokens | tokens),
len(query.tokens & name_tokens) / len(query.tokens | name_tokens),
)
if score <= 0: if score <= 0:
continue continue
scored.append( scored.append(
@ -340,7 +347,7 @@ def format_plan_check_markdown(result: dict[str, Any]) -> str:
verdict = result["verdict"] verdict = result["verdict"]
if verdict == "reuse": if verdict == "reuse":
lines.append("**Verdict: REUSE** — an existing capability already covers this; link it instead of building new.") lines.append("**Verdict: REUSE** — a close lexical match exists; review its consumption contract and availability before adopting it.")
elif verdict == "extend": elif verdict == "extend":
lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.") lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.")
else: else:

View file

@ -61,9 +61,11 @@ Reuses the token-Jaccard approach already proven in `overlaps.py`
same codebase: same codebase:
1. **Tokenize** the query blob with the existing `TOKEN_RE`. 1. **Tokenize** the query blob with the existing `TOKEN_RE`.
2. **Score** against every federated capability's blob (`name` + `summary` + 2. **Score** with the maximum of two token-Jaccard similarities: query versus
`tags` + `discovery.intent` + `discovery.includes`, mirroring capability `name`, and query versus `name` + `summary` + `tags`.
`overlaps._entry_blob`) via Jaccard similarity. Scoring the name separately prevents detailed summaries and consumption
instructions from diluting a short direct query such as "headless browser".
Summary/tag matches and longer intents retain the full-blob signal.
3. **Rank signal, not just tie-break:** among candidates within 3. **Rank signal, not just tie-break:** among candidates within
`--tie-window` (default 0.05) of the top score, prefer the entry with the `--tie-window` (default 0.05) of the top score, prefer the entry with the
higher discovery/availability vector (a more mature capability is a safer higher discovery/availability vector (a more mature capability is a safer
@ -76,7 +78,7 @@ same codebase:
| Verdict | Condition | Meaning | | Verdict | Condition | Meaning |
|---|---|---| |---|---|---|
| `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | An existing capability already covers this need — link it, don't rebuild it. | | `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | A close lexical match exists; review its consumption contract and availability before adoption. |
| `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. | | `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. |
| `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). | | `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). |
@ -86,6 +88,12 @@ the same threshold reasoning as `overlaps.py`'s `--threshold 0.28` default,
shifted since plan-check matches short intent text against short summaries shifted since plan-check matches short intent text against short summaries
rather than long entry-to-entry blobs. rather than long entry-to-entry blobs.
Verdicts describe relevance, not runtime readiness. A source-only candidate or
an unavailable endpoint is an availability gap on the existing capability, not
evidence that a second capability should be built. The match summary carries
provider consumption guidance where published; callers must run its preflight
and respect any local-only or managed-admission conditions.
## 6. Output ## 6. Output
### Markdown (TTY default) ### Markdown (TTY default)

View file

@ -58,6 +58,31 @@ def test_hosted_only_capability_and_provenance_without_local_fallback(monkeypatc
assert result["index_source"]["capability_count"] == 1 assert result["index_source"]["capability_count"] == 1
def test_hosted_browser_discovery_includes_conditional_trial_guidance(monkeypatch, capsys):
from reuse_surface.registry import load_index
browser = next(item for item in load_index()["capabilities"]
if item["id"] == "capability.infotech.headless-browser")
payload = snapshot()
payload["capabilities"] = [
{"id": "capability.example.headless", "name": "Headless Knowledge Engine",
"summary": "Headless information management", "tags": [],
"vector": "D7 / A7 / C6 / R6"},
browser,
]
serve(monkeypatch, payload)
assert main(["plan-check", "--intent", "headless browser", "--hub-url",
"https://registry.example", "--no-llm", "--format", "json"]) == 0
result = json.loads(capsys.readouterr().out)
assert result["verdict"] == "reuse"
assert result["matches"][0]["id"] == browser["id"]
summary = result["matches"][0]["summary"]
assert "rapp_playwright.py" in summary
assert "preflight" in summary and "trial --out" in summary
assert "ephemeral" in summary and "admission is pending" in summary
assert "availability gap" in summary
@pytest.mark.parametrize("change", [ @pytest.mark.parametrize("change", [
{"stale": True}, {"stale": None}, {"composed_at": None}, {"stale": True}, {"stale": None}, {"composed_at": None},
{"composed_at": "2020-01-01T00:00:00Z"}, {"composed_at": "2020-01-01T00:00:00Z"},

View file

@ -80,6 +80,63 @@ def test_match_query_no_capabilities():
assert match_query(query, []) == [] assert match_query(query, []) == []
def test_short_browser_intent_outranks_mature_headless_services(monkeypatch):
browser = {
"id": "capability.infotech.headless-browser",
"name": "Headless Browser Automation",
"summary": "Playwright Chromium screenshots keyboard " + " ".join(
f"detail{i}" for i in range(100)
),
"vector": "D3 / A2 / C2 / R2",
"tags": ["headless", "browser"],
}
other = {
"id": "capability.communication.context-engine",
"name": "Context Engine",
"summary": "Headless knowledge operations",
"vector": "D7 / A7 / C6 / R6",
}
monkeypatch.setattr(
"reuse_surface.plan_check.load_federated_capabilities",
lambda: ([other, browser], _recent_date()),
)
result = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
assert result["verdict"] == "reuse"
assert result["matches"][0]["id"] == browser["id"]
assert result["matches"][0]["score"] > result["matches"][1]["score"]
assert maybe_file_capability_request(
result, requesting_domain="infotech", requesting_agent="test"
) is None
# Extra operational documentation must not turn a direct name match into NEW.
original_score = result["top_score"]
browser["summary"] += " " + " ".join(f"command{i}" for i in range(100))
repeated = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
assert repeated["top_score"] == original_score
def test_summary_only_matching_survives_name_scoring():
query = load_query_from_intent("responsive screenshots keyboard assertions")
matches = match_query(query, [{
"id": "capability.infotech.headless-browser",
"name": "Browser Automation",
"summary": "Responsive screenshots keyboard assertions",
}])
assert verdict_for_score(matches[0].score) == "reuse"
def test_maturity_still_breaks_equally_relevant_name_ties():
candidates = [
{"id": "capability.example.early", "name": "Browser Automation",
"summary": "Early implementation", "vector": "D2 / A2 / C1 / R1"},
{"id": "capability.example.mature", "name": "Browser Automation",
"summary": "Documented implementation", "vector": "D4 / A5 / C3 / R3"},
]
matches = match_query(load_query_from_intent("browser automation"), candidates)
assert matches[0].id == "capability.example.mature"
assert matches[0].score == matches[1].score
def test_load_query_from_workplan(tmp_path): def test_load_query_from_workplan(tmp_path):
workplan = tmp_path / "TEST-WP-0001-thing.md" workplan = tmp_path / "TEST-WP-0001-thing.md"
workplan.write_text( workplan.write_text(

View file

@ -2,6 +2,8 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
import pytest
from reuse_surface.stats import ( from reuse_surface.stats import (
collect_roster_stats, collect_roster_stats,
collect_stats, collect_stats,
@ -10,19 +12,36 @@ from reuse_surface.stats import (
) )
def test_collect_stats_on_repo_root(): @pytest.fixture
root = Path(__file__).resolve().parent.parent def stats_repo(tmp_path, monkeypatch):
stats = collect_stats(root) monkeypatch.delenv("REUSE_SURFACE_URL", raising=False)
index = tmp_path / "registry/indexes/capabilities.yaml"
index.parent.mkdir(parents=True)
index.write_text("""version: 1
domain: infotech
capabilities:
- id: capability.example.source
vector: D3 / A2 / C2 / R2
path: registry/capabilities/source.md
- id: capability.example.service
vector: D4 / A5 / C3 / R3
path: registry/capabilities/service.md
""")
return tmp_path
def test_collect_stats_on_repo_root(stats_repo):
stats = collect_stats(stats_repo)
assert stats["capability_count"] == 2 assert stats["capability_count"] == 2
assert stats["index_present"] is True assert stats["index_present"] is True
assert "discovery" in stats["histograms"] assert stats["histograms"]["discovery"]["D3"] == 1
assert stats["histograms"]["discovery"]["D4"] == 1
assert stats["reliability"] == {"r0_r2": 1, "r3_plus": 1}
def test_format_stats_markdown_contains_count(): def test_format_stats_markdown_contains_count(stats_repo):
root = Path(__file__).resolve().parent.parent text = format_stats_markdown(collect_stats(stats_repo))
text = format_stats_markdown(collect_stats(root)) assert "**Capabilities:** 2" in text
assert "Capabilities:" in text
assert "2" in text
def test_collect_roster_stats_federation_ready(): def test_collect_roster_stats_federation_ready():

View file

@ -0,0 +1,76 @@
---
id: REUSE-WP-0024
type: workplan
title: "Resolve browser discovery relevance and publish verified provider consumption"
domain: infotech
repo: reuse-surface
status: active
owner: codex
origin: cross-repo
origin_ref: REUSE-IN-0001
created: "2026-10-13"
updated: "2026-10-13"
state_hub_workstream_id: "3d62d0af-5deb-55b5-b570-e62f05a43666"
---
# Browser discovery and provider evidence
Reviewed against the current checkout and rapp-playwright's published 0.1.0
contract, immutable release and independent consumer receipts. All prior
workplans are closed. REUSE-IN-0001 and the October 13 provider inbox handoffs
are the remaining actionable work. User authorized review, implementation,
commit and synchronization.
## Publish the verified provider path
```task
id: REUSE-WP-0024-T01
status: done
priority: high
state_hub_task_id: "dd75f033-02f1-521e-b5c3-cddb5dce80df"
```
Update the existing capability, index and generated views with pinned public
client/contract/release/evidence links and executable preflight/trial guidance.
Assess maturity against the standard; distinguish deployable local container
availability from pending managed platform admission and ephemeral endpoints.
Retain the source-adaptation fallback. No second browser capability or consumer
task closure. Verify published sources and the available local fixture path.
## Fix short-intent relevance
```task
id: REUSE-WP-0024-T02
status: done
priority: high
state_hub_task_id: "a689bc2a-a112-59d4-b00c-f6934665dffb"
```
Keep deterministic token matching, but score capability names separately so
long summaries cannot dilute a direct name match. Test browser versus unrelated
headless services, unrelated queries, long descriptions, and maturity ties.
Make reuse advice distinguish lexical relevance from runtime availability.
Verify the same behavior against the hosted snapshot using the local CLI.
## Validate, publish and synchronize
```task
id: REUSE-WP-0024-T03
status: progress
priority: medium
state_hub_task_id: "0be283ba-12da-52a1-b1af-0c2d6dcb58f1"
```
Run the appropriate tests and registry/generated-artifact checks. Commit and
push, refresh hosted federation, retain public readback evidence, reconcile
REUSE-IN-0001 and workplan statuses, and log progress to State Hub. Browser
deployment and CONTENT-WP-0000-T04 acceptance remain their owners' work.
## Implementation evidence
See [review and trial receipts](../docs/evidence/2026-10-13-browser-discovery.md).
The published client passed 14 fixture steps and produced four independently
checked screenshots. Availability is now A5 for the published local container;
A6 managed admission remains pending. Name scoring ranks the browser first at
0.6667 instead of returning false-new. Replaced stale live-registry stats
assumptions with a controlled fixture after the full suite exposed them.