diff --git a/.custodian-brief.md b/.custodian-brief.md index 96418f7..acae414 100644 --- a/.custodian-brief.md +++ b/.custodian-brief.md @@ -2,12 +2,18 @@ # Custodian Brief — reuse-surface **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)* ## 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 diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index 2746b8e..2b2c7aa 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -10,8 +10,12 @@ | --- | --- | --- | --- | --- | | 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-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-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-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 | diff --git a/docs/CapabilityCatalog.md b/docs/CapabilityCatalog.md index 504b0b2..fbc72ee 100644 --- a/docs/CapabilityCatalog.md +++ b/docs/CapabilityCatalog.md @@ -36,13 +36,14 @@ Generated by `reuse-surface catalog`. Do not edit manually. ### Headless Browser Automation - **ID:** `capability.infotech.headless-browser` -- **Vector:** D3 / A2 / C2 / R2 +- **Vector:** D3 / A5 / C2 / R2 - **Owner:** reuse-surface - **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:** - 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. - 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. diff --git a/docs/catalog/index.html b/docs/catalog/index.html index 386e802..99328ac 100644 --- a/docs/catalog/index.html +++ b/docs/catalog/index.html @@ -32,8 +32,8 @@

infotech

Headless Browser Automation

-

capability.infotech.headless-browser · D3 / A2 / C2 / R2

-

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).

+

capability.infotech.headless-browser · D3 / A5 / C2 / R2

+

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.

registry/capabilities/capability.infotech.headless-browser.md

diff --git a/docs/catalog/registry.json b/docs/catalog/registry.json index 895f28f..f9642fb 100644 --- a/docs/catalog/registry.json +++ b/docs/catalog/registry.json @@ -5,8 +5,8 @@ { "id": "capability.infotech.headless-browser", "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).", - "vector": "D3 / A2 / C2 / R2", + "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 / A5 / C2 / R2", "domain": "infotech", "status": "reviewed", "owner": "reuse-surface", @@ -29,7 +29,10 @@ "informational", "source adaptation", "JavaScript library", - "Python library" + "Python library", + "cli", + "service API", + "container" ] }, { diff --git a/docs/evidence/2026-10-13-browser-discovery.md b/docs/evidence/2026-10-13-browser-discovery.md new file mode 100644 index 0000000..d2c3287 --- /dev/null +++ b/docs/evidence/2026-10-13-browser-discovery.md @@ -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. diff --git a/docs/evidence/2026-10-13-browser-discovery/artifact-checks.json b/docs/evidence/2026-10-13-browser-discovery/artifact-checks.json new file mode 100644 index 0000000..c7e6c95 --- /dev/null +++ b/docs/evidence/2026-10-13-browser-discovery/artifact-checks.json @@ -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 + } +] diff --git a/docs/evidence/2026-10-13-browser-discovery/desktop-final.png b/docs/evidence/2026-10-13-browser-discovery/desktop-final.png new file mode 100644 index 0000000..91a2040 Binary files /dev/null and b/docs/evidence/2026-10-13-browser-discovery/desktop-final.png differ diff --git a/docs/evidence/2026-10-13-browser-discovery/narrow-final.png b/docs/evidence/2026-10-13-browser-discovery/narrow-final.png new file mode 100644 index 0000000..c2ad4e9 Binary files /dev/null and b/docs/evidence/2026-10-13-browser-discovery/narrow-final.png differ diff --git a/docs/evidence/2026-10-13-browser-discovery/preflight.json b/docs/evidence/2026-10-13-browser-discovery/preflight.json new file mode 100644 index 0000000..0a0f4fd --- /dev/null +++ b/docs/evidence/2026-10-13-browser-discovery/preflight.json @@ -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 + } +} diff --git a/docs/evidence/2026-10-13-browser-discovery/receipt.json b/docs/evidence/2026-10-13-browser-discovery/receipt.json new file mode 100644 index 0000000..c30efdf --- /dev/null +++ b/docs/evidence/2026-10-13-browser-discovery/receipt.json @@ -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" + } + ] +} diff --git a/docs/graph/capability-graph.mmd b/docs/graph/capability-graph.mmd index 907f454..b66c008 100644 --- a/docs/graph/capability-graph.mmd +++ b/docs/graph/capability-graph.mmd @@ -1,5 +1,5 @@ graph LR - capability_infotech_headless_browser["capability.infotech.headless-browser
D3 / A2 / C2 / R2"] + capability_infotech_headless_browser["capability.infotech.headless-browser
D3 / A5 / C2 / R2"] capability_registry_register["capability.registry.register
D3 / A4 / C2 / R3"] capability_registry_validate["capability.registry.validate
D4 / A3 / C3 / R3"] capability_registry_register -->|supports| capability_feature_control_evaluate diff --git a/docs/graph/index.html b/docs/graph/index.html index fbf84b7..19366f8 100644 --- a/docs/graph/index.html +++ b/docs/graph/index.html @@ -17,7 +17,7 @@

Generated from entry relations fields. Regenerate with reuse-surface graph.


   
 
 
diff --git a/registry/capabilities/capability.infotech.headless-browser.md b/registry/capabilities/capability.infotech.headless-browser.md
index f13af73..3adb61d 100644
--- a/registry/capabilities/capability.infotech.headless-browser.md
+++ b/registry/capabilities/capability.infotech.headless-browser.md
@@ -2,11 +2,18 @@
 id: capability.infotech.headless-browser
 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).
+  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.
 owner: reuse-surface
 status: reviewed
 domain: infotech
@@ -20,14 +27,15 @@ maturity:
       Inspected four implemented Playwright consumers and separated optional
       dependencies and plans from usage. No comprehensive alternatives benchmark.
   availability:
-    current: A2
-    target: A2
+    current: A5
+    target: A6
     confidence: medium
     rationale: >
-      Existing JavaScript and Python source examples can be adapted in a consumer
-      repo. This entry does not deliver a shared wrapper or hosted browser service.
-      The founder announced a forthcoming rapp-playwright service on 2026-10-13;
-      that planned delivery does not change the evidenced current A2 level.
+      rapp-playwright 0.1.0 is a published immutable container with a versioned
+      HTTP contract and standalone Python client, independently trialled locally.
+      A5 describes deployable container availability, not managed operation (A6).
+      Railiance admission is pending. Existing A2 source adaptation remains usable;
+      no endpoint uptime or caller browser installation is implied.
 external_evidence:
   completeness:
     level: C2
@@ -36,8 +44,10 @@ external_evidence:
     satisfied_expectations:
       - Identifies implemented consumers, browser engines and source entry points.
       - Gives a scoped default recommendation and a practical trial procedure.
+      - Published provider client and container have independent fixture screenshots and keyboard receipts.
     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:
       - Exhaustive estate dependency inventory or comparative browser benchmark.
       - Browser service implementation or operation by reuse-surface.
@@ -49,10 +59,13 @@ external_evidence:
     known_reliability_risks:
       - Browser binaries and system libraries must match the selected Playwright version.
       - 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:
       satisfied_signals:
         - 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:
   intent: >
     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.
     - JavaScript UI tests, screenshots and page extraction examples.
     - Python visual-check example and Firefox experiment evidence.
+    - Published rapp-playwright container, Python client and bounded HTTP fixture trials.
   excludes:
     - Browser hosting or workstation provisioning by reuse-surface.
     - Credential provisioning and permission to automate external targets.
     - Claims that a dependency declaration or a workplan proves executed browser usage.
   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:
     - 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.
 availability:
-  current_level: A2
-  target_level: A2
+  current_level: A5
+  target_level: A6
   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/tests/visual/ui-kit.spec.mjs
     - ../coulomb-social/scripts/test-usecase-browser.mjs
@@ -81,10 +99,9 @@ availability:
     - ../frontend-patterns/research/experiments/navigation-history/experiment.mjs
   target_artifacts:
     - >-
-      Planned rapp-playwright-provided service, announced by the founder on
-      2026-10-13 as available shortly; endpoint, consumption contract and readiness
-      evidence have not yet been verified by reuse-surface.
-  consumption_modes: [informational, source adaptation, JavaScript library, Python library]
+      Managed Railiance deployment after platform admission, with consumer
+      access and live recovery/rollback evidence; not currently available.
+  consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
 relations:
   depends_on: []
   supports: []
@@ -95,9 +112,12 @@ evidence:
     - ../frontend-patterns/research/experiments/navigation-history/README.md
     - ../test-driver/SCOPE.md
     - ../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
   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
     - ../coulomb-social/scripts/test-usecase-browser.mjs
     - ../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 coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments.
     - >-
-      For service consumption, rapp-playwright is the announced provider and its
-      service will be available shortly. Use its published contract and readiness
-      evidence when delivered; current availability remains source reuse only.
+      For bounded screenshot and keyboard jobs, use the published rapp-playwright
+      Python client against an available local provider and run preflight first.
+      Use the immutable container to reproduce the provider; managed Railiance
+      access requires admission and a working tunnel before consumption.
   not_recommended_for:
     - Treating this recommendation as an approved mandatory estate standard.
     - 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.
     - 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.
-    - The forthcoming rapp-playwright service has no verified endpoint or launch receipt in this record yet.
-promotion_history: []
+    - 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.
+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
@@ -147,24 +179,101 @@ implementations and the upstream Playwright project maintains the library.
 
 ## Service provider and delivery status
 
-**A `rapp-playwright`-provided service will be available shortly**, as announced by
-the founder on 2026-10-13. Its [repository description](../../../rapp-playwright/README.md)
-identifies a Railiance wrapper for a Playwright and headless Chromium environment
-supporting use-case testing. Service availability is **planned**, not verified:
-this record has no confirmed endpoint, consumption contract or launch receipt yet.
-The current **D3 / A2 / C2 / R2** vector continues to describe evidenced source reuse.
+**rapp-playwright 0.1.0 is published and verified as a local container provider.**
+The current vector is **D3 / A5 / C2 / R2**. A5 means a deployable container under
+[the maturity standard](../../specs/CapabilityMaturityStandard.md); managed
+platform operation is A6 and remains **pending Railiance admission**. Source
+examples remain available at A2. No browser is installed on the caller's machine
+by discovery or by running the Python client.
 
-`rapp-playwright` owns the forthcoming browser service. `reuse-surface` owns
-discovery, consumption guidance, maturity assessment and evidence references; it
-does not implement or operate the browser service or install browsers on behalf
-of consumers. Its `owner` field here denotes the maintainer of this registry record.
+`rapp-playwright` owns the browser service; `railiance-platform` owns managed
+lifecycle admission. `reuse-surface` owns this record, discovery, consumption
+guidance and evidence assessment. The
+[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)
-is retained as consumer evidence. Browser delivery is assigned to the provider;
-the reported relevance, false-`new` verdict and availability-clarity issues remain
-reuse-surface concerns. A2 means source/library reuse, not proof of a locally
-installed browser. The service announcement does not complete the consumer's
-screenshot and keyboard-walkthrough task.
+### Verified client path
+
+Only Python 3.10+ is needed by the consumer. Download the single revision-pinned
+client into a working directory; a sibling checkout is not required:
+
+```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
 
@@ -196,15 +305,14 @@ copy its workstation paths as a portable browser installation recipe.
 - **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained
   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`
    from the reuse-surface root, then open this entry. If the CLI is installed,
    `reuse-surface query --keyword browser` is equivalent.
-   `plan-check --intent "headless browser" --no-llm` also includes this candidate,
-   but its token-overlap thresholds and maturity tie-breaking currently return
-   `new` for this short query. That verdict does not establish absence of reuse;
-   use the explicit keyword query and read the evidence for this trial.
+   `plan-check --intent "headless browser" --no-llm` ranks this entry first.
+   Its reuse verdict describes relevance; provider preflight determines current
+   runtime availability. Use source adaptation when the provider path is unsuitable.
 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.
 3. Use the target repo's package manager and lockfile. Select a compatible
diff --git a/registry/indexes/capabilities.yaml b/registry/indexes/capabilities.yaml
index 23698cb..21ca35a 100644
--- a/registry/indexes/capabilities.yaml
+++ b/registry/indexes/capabilities.yaml
@@ -6,18 +6,25 @@ capabilities:
   - id: capability.infotech.headless-browser
     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).
-    vector: D3 / A2 / C2 / R2
+      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 / A5 / C2 / R2
     domain: infotech
     status: reviewed
     owner: reuse-surface
     path: registry/capabilities/capability.infotech.headless-browser.md
     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
     name: Capability Registration
diff --git a/registry/indexes/federated.yaml b/registry/indexes/federated.yaml
index 8672c50..ba26a8e 100644
--- a/registry/indexes/federated.yaml
+++ b/registry/indexes/federated.yaml
@@ -943,12 +943,17 @@ capabilities:
   source_index: registry/federation/cache/email-connect.yaml
 - id: capability.infotech.headless-browser
   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).
-  vector: D3 / A2 / C2 / R2
+  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 / A5 / C2 / R2
   domain: infotech
   status: reviewed
   owner: reuse-surface
@@ -971,6 +976,9 @@ capabilities:
   - source adaptation
   - JavaScript library
   - Python library
+  - cli
+  - service API
+  - container
   source_repo: reuse-surface
   source_index: registry/indexes/capabilities.yaml
 - id: capability.infotech.hub-core-library
diff --git a/reuse_surface/plan_check.py b/reuse_surface/plan_check.py
index 9118bba..7d424b6 100644
--- a/reuse_surface/plan_check.py
+++ b/reuse_surface/plan_check.py
@@ -147,7 +147,14 @@ def match_query(
         tokens = _tokens(blob)
         if not tokens:
             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:
             continue
         scored.append(
@@ -340,7 +347,7 @@ def format_plan_check_markdown(result: dict[str, Any]) -> str:
 
     verdict = result["verdict"]
     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":
         lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.")
     else:
diff --git a/specs/PlanCheck.md b/specs/PlanCheck.md
index 61b71f1..224f01c 100644
--- a/specs/PlanCheck.md
+++ b/specs/PlanCheck.md
@@ -61,9 +61,11 @@ Reuses the token-Jaccard approach already proven in `overlaps.py`
 same codebase:
 
 1. **Tokenize** the query blob with the existing `TOKEN_RE`.
-2. **Score** against every federated capability's blob (`name` + `summary` +
-   `tags` + `discovery.intent` + `discovery.includes`, mirroring
-   `overlaps._entry_blob`) via Jaccard similarity.
+2. **Score** with the maximum of two token-Jaccard similarities: query versus
+   capability `name`, and query versus `name` + `summary` + `tags`.
+   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
    `--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
@@ -76,7 +78,7 @@ same codebase:
 
 | 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. |
 | `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
 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
 
 ### Markdown (TTY default)
diff --git a/tests/test_hosted_plan_check.py b/tests/test_hosted_plan_check.py
index df687a6..35256fc 100644
--- a/tests/test_hosted_plan_check.py
+++ b/tests/test_hosted_plan_check.py
@@ -58,6 +58,31 @@ def test_hosted_only_capability_and_provenance_without_local_fallback(monkeypatc
     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", [
     {"stale": True}, {"stale": None}, {"composed_at": None},
     {"composed_at": "2020-01-01T00:00:00Z"},
diff --git a/tests/test_plan_check.py b/tests/test_plan_check.py
index fd9fccb..6cdaba5 100644
--- a/tests/test_plan_check.py
+++ b/tests/test_plan_check.py
@@ -80,6 +80,63 @@ def test_match_query_no_capabilities():
     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):
     workplan = tmp_path / "TEST-WP-0001-thing.md"
     workplan.write_text(
diff --git a/tests/test_stats.py b/tests/test_stats.py
index 339670e..d5f47e0 100644
--- a/tests/test_stats.py
+++ b/tests/test_stats.py
@@ -2,6 +2,8 @@ from __future__ import annotations
 
 from pathlib import Path
 
+import pytest
+
 from reuse_surface.stats import (
     collect_roster_stats,
     collect_stats,
@@ -10,19 +12,36 @@ from reuse_surface.stats import (
 )
 
 
-def test_collect_stats_on_repo_root():
-    root = Path(__file__).resolve().parent.parent
-    stats = collect_stats(root)
+@pytest.fixture
+def stats_repo(tmp_path, monkeypatch):
+    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["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():
-    root = Path(__file__).resolve().parent.parent
-    text = format_stats_markdown(collect_stats(root))
-    assert "Capabilities:" in text
-    assert "2" in text
+def test_format_stats_markdown_contains_count(stats_repo):
+    text = format_stats_markdown(collect_stats(stats_repo))
+    assert "**Capabilities:** 2" in text
 
 
 def test_collect_roster_stats_federation_ready():
diff --git a/workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md b/workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md
new file mode 100644
index 0000000..cf3decd
--- /dev/null
+++ b/workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md
@@ -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.