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
**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

View file

@ -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 |

View file

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

View file

@ -32,8 +32,8 @@
<section><h2>infotech</h2>
<article class="card">
<h3>Headless Browser Automation</h3>
<p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A2 / 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 class="meta"><code>capability.infotech.headless-browser</code> · D3 / A5 / C2 / R2</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>
</article></section>
</body>

View file

@ -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"
]
},
{

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
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_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"]
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>
<pre class="mermaid" id="graph"></pre>
<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>
</body>
</html>

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

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

View file

@ -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"},

View file

@ -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(

View file

@ -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():

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.