Fix short-intent discovery and publish verified browser provider guidance
Assistant: codex Assistant-Model: gpt-6-astra Assistant-Session: 01a13690-1c84-77a2-aeee-7f517ec60f5d
This commit is contained in:
parent
9042dec5ed
commit
50077c9bea
22 changed files with 736 additions and 87 deletions
|
|
@ -2,12 +2,18 @@
|
||||||
# Custodian Brief — reuse-surface
|
# Custodian Brief — reuse-surface
|
||||||
|
|
||||||
**Domain:** infotech
|
**Domain:** infotech
|
||||||
**Last synced:** 2026-10-13 11:59 UTC
|
**Last synced:** 2026-10-13 18:43 UTC
|
||||||
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
|
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
|
||||||
|
|
||||||
## Active Workstreams
|
## Active Workstreams
|
||||||
|
|
||||||
*(none — repo may need first-session setup)*
|
### Resolve browser discovery relevance and publish verified provider consumption
|
||||||
|
Progress: 0/3 done | workplan_id: `3d62d0af-5deb-55b5-b570-e62f05a43666`
|
||||||
|
|
||||||
|
**Open tasks:**
|
||||||
|
- ► Publish the verified provider path `dd75f033`
|
||||||
|
- · Fix short-intent relevance `a689bc2a`
|
||||||
|
- · Validate, publish and synchronize `0be283ba`
|
||||||
|
|
||||||
## Inbox Hygiene
|
## Inbox Hygiene
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,12 @@
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| workplan | ADHOC-2026-10-13 | finished | — | workplans/ADHOC-2026-10-13.md |
|
| workplan | ADHOC-2026-10-13 | finished | — | workplans/ADHOC-2026-10-13.md |
|
||||||
| workplan | REUSE-WP-0023 | finished | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
| workplan | REUSE-WP-0023 | finished | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
||||||
|
| workplan | REUSE-WP-0024 | active | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
|
||||||
| task | ADHOC-2026-10-13-T01 | done | — | workplans/ADHOC-2026-10-13.md |
|
| task | ADHOC-2026-10-13-T01 | done | — | workplans/ADHOC-2026-10-13.md |
|
||||||
| task | ADHOC-2026-10-13-T02 | done | — | workplans/ADHOC-2026-10-13.md |
|
| task | ADHOC-2026-10-13-T02 | done | — | workplans/ADHOC-2026-10-13.md |
|
||||||
| task | REUSE-WP-0023-T01 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
| task | REUSE-WP-0023-T01 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
||||||
| task | REUSE-WP-0023-T02 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
| task | REUSE-WP-0023-T02 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md |
|
||||||
|
| task | REUSE-WP-0024-T01 | progress | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
|
||||||
|
| task | REUSE-WP-0024-T02 | todo | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
|
||||||
|
| task | REUSE-WP-0024-T03 | todo | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md |
|
||||||
| intake | REUSE-IN-0001 | open | green | intakes/REUSE-IN-0001-headless-browser-runnable-answer.md |
|
| intake | REUSE-IN-0001 | open | green | intakes/REUSE-IN-0001-headless-browser-runnable-answer.md |
|
||||||
|
|
|
||||||
|
|
@ -36,13 +36,14 @@ Generated by `reuse-surface catalog`. Do not edit manually.
|
||||||
### Headless Browser Automation
|
### Headless Browser Automation
|
||||||
|
|
||||||
- **ID:** `capability.infotech.headless-browser`
|
- **ID:** `capability.infotech.headless-browser`
|
||||||
- **Vector:** D3 / A2 / C2 / R2
|
- **Vector:** D3 / A5 / C2 / R2
|
||||||
- **Owner:** reuse-surface
|
- **Owner:** reuse-surface
|
||||||
- **Path:** `registry/capabilities/capability.infotech.headless-browser.md`
|
- **Path:** `registry/capabilities/capability.infotech.headless-browser.md`
|
||||||
- **Summary:** Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).
|
- **Summary:** Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
|
||||||
|
|
||||||
**Known limitations:**
|
**Known limitations:**
|
||||||
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
|
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
|
||||||
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
|
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
|
||||||
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
|
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
|
||||||
- The forthcoming rapp-playwright service has no verified endpoint or launch receipt in this record yet.
|
- Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
|
||||||
|
- Provider fixture success does not establish consumer target reachability or application acceptance.
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@
|
||||||
<section><h2>infotech</h2>
|
<section><h2>infotech</h2>
|
||||||
<article class="card">
|
<article class="card">
|
||||||
<h3>Headless Browser Automation</h3>
|
<h3>Headless Browser Automation</h3>
|
||||||
<p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A2 / C2 / R2</p>
|
<p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A5 / C2 / R2</p>
|
||||||
<p>Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).</p>
|
<p>Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.</p>
|
||||||
<p class="path">registry/capabilities/capability.infotech.headless-browser.md</p>
|
<p class="path">registry/capabilities/capability.infotech.headless-browser.md</p>
|
||||||
</article></section>
|
</article></section>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
{
|
{
|
||||||
"id": "capability.infotech.headless-browser",
|
"id": "capability.infotech.headless-browser",
|
||||||
"name": "Headless Browser Automation",
|
"name": "Headless Browser Automation",
|
||||||
"summary": "Headless browser automation with Playwright and Chromium for UI testing, screenshots and page extraction; recommended default based on existing whynot-design, coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided service will be available shortly (announced 2026-10-13; planned, not yet verified available).",
|
"summary": "Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.",
|
||||||
"vector": "D3 / A2 / C2 / R2",
|
"vector": "D3 / A5 / C2 / R2",
|
||||||
"domain": "infotech",
|
"domain": "infotech",
|
||||||
"status": "reviewed",
|
"status": "reviewed",
|
||||||
"owner": "reuse-surface",
|
"owner": "reuse-surface",
|
||||||
|
|
@ -29,7 +29,10 @@
|
||||||
"informational",
|
"informational",
|
||||||
"source adaptation",
|
"source adaptation",
|
||||||
"JavaScript library",
|
"JavaScript library",
|
||||||
"Python library"
|
"Python library",
|
||||||
|
"cli",
|
||||||
|
"service API",
|
||||||
|
"container"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
84
docs/evidence/2026-10-13-browser-discovery.md
Normal file
84
docs/evidence/2026-10-13-browser-discovery.md
Normal 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.
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
BIN
docs/evidence/2026-10-13-browser-discovery/desktop-final.png
Normal file
BIN
docs/evidence/2026-10-13-browser-discovery/desktop-final.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
BIN
docs/evidence/2026-10-13-browser-discovery/narrow-final.png
Normal file
BIN
docs/evidence/2026-10-13-browser-discovery/narrow-final.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
22
docs/evidence/2026-10-13-browser-discovery/preflight.json
Normal file
22
docs/evidence/2026-10-13-browser-discovery/preflight.json
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
184
docs/evidence/2026-10-13-browser-discovery/receipt.json
Normal file
184
docs/evidence/2026-10-13-browser-discovery/receipt.json
Normal 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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
graph LR
|
graph LR
|
||||||
capability_infotech_headless_browser["capability.infotech.headless-browser<br/>D3 / A2 / C2 / R2"]
|
capability_infotech_headless_browser["capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2"]
|
||||||
capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"]
|
capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"]
|
||||||
capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"]
|
capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"]
|
||||||
capability_registry_register -->|supports| capability_feature_control_evaluate
|
capability_registry_register -->|supports| capability_feature_control_evaluate
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p>
|
<p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p>
|
||||||
<pre class="mermaid" id="graph"></pre>
|
<pre class="mermaid" id="graph"></pre>
|
||||||
<script>
|
<script>
|
||||||
document.getElementById('graph').textContent = "graph LR\n capability_infotech_headless_browser[\"capability.infotech.headless-browser<br/>D3 / A2 / C2 / R2\"]\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n";
|
document.getElementById('graph').textContent = "graph LR\n capability_infotech_headless_browser[\"capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2\"]\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n";
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,18 @@
|
||||||
id: capability.infotech.headless-browser
|
id: capability.infotech.headless-browser
|
||||||
name: Headless Browser Automation
|
name: Headless Browser Automation
|
||||||
summary: >-
|
summary: >-
|
||||||
Headless browser automation with Playwright and Chromium for UI testing,
|
Headless browser automation, screenshots and keyboard trials through
|
||||||
screenshots and page extraction; recommended default based on existing
|
rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4).
|
||||||
whynot-design, coulomb-social, core-hub and frontend-patterns implementations.
|
Published A5 local container; managed Railiance admission is pending.
|
||||||
A rapp-playwright-provided service will be available shortly (announced
|
Download the Python 3.10+ standalone client from
|
||||||
2026-10-13; planned, not yet verified available).
|
https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
|
||||||
|
and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`,
|
||||||
|
then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
|
||||||
|
with a fresh output directory. This endpoint was verified locally on 2026-10-13
|
||||||
|
and is ephemeral; it installs no browser for the caller. If unreachable,
|
||||||
|
follow the local container setup in the capability card or adapt its A2 source
|
||||||
|
examples; this is an availability gap on the existing capability.
|
||||||
|
Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
|
||||||
owner: reuse-surface
|
owner: reuse-surface
|
||||||
status: reviewed
|
status: reviewed
|
||||||
domain: infotech
|
domain: infotech
|
||||||
|
|
@ -20,14 +27,15 @@ maturity:
|
||||||
Inspected four implemented Playwright consumers and separated optional
|
Inspected four implemented Playwright consumers and separated optional
|
||||||
dependencies and plans from usage. No comprehensive alternatives benchmark.
|
dependencies and plans from usage. No comprehensive alternatives benchmark.
|
||||||
availability:
|
availability:
|
||||||
current: A2
|
current: A5
|
||||||
target: A2
|
target: A6
|
||||||
confidence: medium
|
confidence: medium
|
||||||
rationale: >
|
rationale: >
|
||||||
Existing JavaScript and Python source examples can be adapted in a consumer
|
rapp-playwright 0.1.0 is a published immutable container with a versioned
|
||||||
repo. This entry does not deliver a shared wrapper or hosted browser service.
|
HTTP contract and standalone Python client, independently trialled locally.
|
||||||
The founder announced a forthcoming rapp-playwright service on 2026-10-13;
|
A5 describes deployable container availability, not managed operation (A6).
|
||||||
that planned delivery does not change the evidenced current A2 level.
|
Railiance admission is pending. Existing A2 source adaptation remains usable;
|
||||||
|
no endpoint uptime or caller browser installation is implied.
|
||||||
external_evidence:
|
external_evidence:
|
||||||
completeness:
|
completeness:
|
||||||
level: C2
|
level: C2
|
||||||
|
|
@ -36,8 +44,10 @@ external_evidence:
|
||||||
satisfied_expectations:
|
satisfied_expectations:
|
||||||
- Identifies implemented consumers, browser engines and source entry points.
|
- Identifies implemented consumers, browser engines and source entry points.
|
||||||
- Gives a scoped default recommendation and a practical trial procedure.
|
- Gives a scoped default recommendation and a practical trial procedure.
|
||||||
|
- Published provider client and container have independent fixture screenshots and keyboard receipts.
|
||||||
broken_expectations:
|
broken_expectations:
|
||||||
- No shared package, standard configuration or consumer-independent trial receipt.
|
- Managed admission and persistent platform endpoint are still pending.
|
||||||
|
- Consumer application acceptance remains the consuming repo's responsibility.
|
||||||
out_of_scope_expectations:
|
out_of_scope_expectations:
|
||||||
- Exhaustive estate dependency inventory or comparative browser benchmark.
|
- Exhaustive estate dependency inventory or comparative browser benchmark.
|
||||||
- Browser service implementation or operation by reuse-surface.
|
- Browser service implementation or operation by reuse-surface.
|
||||||
|
|
@ -49,10 +59,13 @@ external_evidence:
|
||||||
known_reliability_risks:
|
known_reliability_risks:
|
||||||
- Browser binaries and system libraries must match the selected Playwright version.
|
- Browser binaries and system libraries must match the selected Playwright version.
|
||||||
- Existing examples contain application-specific fixtures and assumptions.
|
- Existing examples contain application-specific fixtures and assumptions.
|
||||||
- Browser launch and target-repo compatibility have not been tested by this registration.
|
- Local fixture receipts do not prove managed operation or arbitrary target compatibility.
|
||||||
|
- Local provider endpoints are ephemeral; check preflight for each trial.
|
||||||
evidence:
|
evidence:
|
||||||
satisfied_signals:
|
satisfied_signals:
|
||||||
- frontend-patterns navigation-history records a completed Chromium/Firefox experiment.
|
- frontend-patterns navigation-history records a completed Chromium/Firefox experiment.
|
||||||
|
- rapp-playwright independent final-release trial passed 14 steps across desktop and narrow viewports.
|
||||||
|
- Independent provider evidence includes wrong-token, failed assertion and unavailable-service checks.
|
||||||
discovery:
|
discovery:
|
||||||
intent: >
|
intent: >
|
||||||
Help a worker select and reuse existing headless browser tooling instead of
|
Help a worker select and reuse existing headless browser tooling instead of
|
||||||
|
|
@ -61,19 +74,24 @@ discovery:
|
||||||
- Playwright automation with headless Chromium as the default starting point.
|
- Playwright automation with headless Chromium as the default starting point.
|
||||||
- JavaScript UI tests, screenshots and page extraction examples.
|
- JavaScript UI tests, screenshots and page extraction examples.
|
||||||
- Python visual-check example and Firefox experiment evidence.
|
- Python visual-check example and Firefox experiment evidence.
|
||||||
|
- Published rapp-playwright container, Python client and bounded HTTP fixture trials.
|
||||||
excludes:
|
excludes:
|
||||||
- Browser hosting or workstation provisioning by reuse-surface.
|
- Browser hosting or workstation provisioning by reuse-surface.
|
||||||
- Credential provisioning and permission to automate external targets.
|
- Credential provisioning and permission to automate external targets.
|
||||||
- Claims that a dependency declaration or a workplan proves executed browser usage.
|
- Claims that a dependency declaration or a workplan proves executed browser usage.
|
||||||
assumptions:
|
assumptions:
|
||||||
- The consumer chooses a version compatible with its runtime and installs matching browsers.
|
- Source-adaptation consumers install matching browsers; provider clients need only Python 3.10+.
|
||||||
|
- Provider consumers establish an available endpoint and run preflight before a trial.
|
||||||
use_cases:
|
use_cases:
|
||||||
- Find which working repos already use a headless browser and where to start reusing it.
|
- Find which working repos already use a headless browser and where to start reusing it.
|
||||||
- Run a local UI assertion and screenshot in a target repo before adopting the tooling.
|
- Run a local UI assertion and screenshot in a target repo before adopting the tooling.
|
||||||
availability:
|
availability:
|
||||||
current_level: A2
|
current_level: A5
|
||||||
target_level: A2
|
target_level: A6
|
||||||
current_artifacts:
|
current_artifacts:
|
||||||
|
- forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
|
||||||
|
- https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
|
||||||
|
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json
|
||||||
- ../whynot-design/playwright.config.mjs
|
- ../whynot-design/playwright.config.mjs
|
||||||
- ../whynot-design/tests/visual/ui-kit.spec.mjs
|
- ../whynot-design/tests/visual/ui-kit.spec.mjs
|
||||||
- ../coulomb-social/scripts/test-usecase-browser.mjs
|
- ../coulomb-social/scripts/test-usecase-browser.mjs
|
||||||
|
|
@ -81,10 +99,9 @@ availability:
|
||||||
- ../frontend-patterns/research/experiments/navigation-history/experiment.mjs
|
- ../frontend-patterns/research/experiments/navigation-history/experiment.mjs
|
||||||
target_artifacts:
|
target_artifacts:
|
||||||
- >-
|
- >-
|
||||||
Planned rapp-playwright-provided service, announced by the founder on
|
Managed Railiance deployment after platform admission, with consumer
|
||||||
2026-10-13 as available shortly; endpoint, consumption contract and readiness
|
access and live recovery/rollback evidence; not currently available.
|
||||||
evidence have not yet been verified by reuse-surface.
|
consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
|
||||||
consumption_modes: [informational, source adaptation, JavaScript library, Python library]
|
|
||||||
relations:
|
relations:
|
||||||
depends_on: []
|
depends_on: []
|
||||||
supports: []
|
supports: []
|
||||||
|
|
@ -95,9 +112,12 @@ evidence:
|
||||||
- ../frontend-patterns/research/experiments/navigation-history/README.md
|
- ../frontend-patterns/research/experiments/navigation-history/README.md
|
||||||
- ../test-driver/SCOPE.md
|
- ../test-driver/SCOPE.md
|
||||||
- ../testdrive-jsui/pyproject.toml
|
- ../testdrive-jsui/pyproject.toml
|
||||||
- ../rapp-playwright/README.md
|
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md
|
||||||
|
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md
|
||||||
- intakes/REUSE-IN-0001-headless-browser-runnable-answer.md
|
- intakes/REUSE-IN-0001-headless-browser-runnable-answer.md
|
||||||
tests:
|
tests:
|
||||||
|
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md
|
||||||
|
- docs/evidence/2026-10-13-browser-discovery.md
|
||||||
- ../whynot-design/tests/visual/ui-kit.spec.mjs
|
- ../whynot-design/tests/visual/ui-kit.spec.mjs
|
||||||
- ../coulomb-social/scripts/test-usecase-browser.mjs
|
- ../coulomb-social/scripts/test-usecase-browser.mjs
|
||||||
- ../core-hub/scripts/check_console_visual.py
|
- ../core-hub/scripts/check_console_visual.py
|
||||||
|
|
@ -114,9 +134,10 @@ consumer_guidance:
|
||||||
- Reuse whynot-design for JavaScript visual tests and core-hub for Python visual checks.
|
- Reuse whynot-design for JavaScript visual tests and core-hub for Python visual checks.
|
||||||
- Reuse coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments.
|
- Reuse coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments.
|
||||||
- >-
|
- >-
|
||||||
For service consumption, rapp-playwright is the announced provider and its
|
For bounded screenshot and keyboard jobs, use the published rapp-playwright
|
||||||
service will be available shortly. Use its published contract and readiness
|
Python client against an available local provider and run preflight first.
|
||||||
evidence when delivered; current availability remains source reuse only.
|
Use the immutable container to reproduce the provider; managed Railiance
|
||||||
|
access requires admission and a working tunnel before consumption.
|
||||||
not_recommended_for:
|
not_recommended_for:
|
||||||
- Treating this recommendation as an approved mandatory estate standard.
|
- Treating this recommendation as an approved mandatory estate standard.
|
||||||
- Selecting test-driver as an implemented JavaScript-capable browser engine.
|
- Selecting test-driver as an implemented JavaScript-capable browser engine.
|
||||||
|
|
@ -125,8 +146,19 @@ consumer_guidance:
|
||||||
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
|
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
|
||||||
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
|
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
|
||||||
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
|
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
|
||||||
- The forthcoming rapp-playwright service has no verified endpoint or launch receipt in this record yet.
|
- Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
|
||||||
promotion_history: []
|
- Provider fixture success does not establish consumer target reachability or application acceptance.
|
||||||
|
promotion_history:
|
||||||
|
- date: "2026-10-13"
|
||||||
|
dimension: availability
|
||||||
|
from: A2
|
||||||
|
to: A5
|
||||||
|
rationale: >-
|
||||||
|
Published immutable rapp-playwright 0.1.0 container, versioned client/contract
|
||||||
|
and independent local release receipts satisfy deployable-container availability.
|
||||||
|
This is not an A6 managed-platform claim. D3, C2 and R2 remain conservative
|
||||||
|
assessments pending broader target and operational evidence.
|
||||||
|
author: codex
|
||||||
---
|
---
|
||||||
|
|
||||||
# Headless Browser Automation
|
# Headless Browser Automation
|
||||||
|
|
@ -147,24 +179,101 @@ implementations and the upstream Playwright project maintains the library.
|
||||||
|
|
||||||
## Service provider and delivery status
|
## Service provider and delivery status
|
||||||
|
|
||||||
**A `rapp-playwright`-provided service will be available shortly**, as announced by
|
**rapp-playwright 0.1.0 is published and verified as a local container provider.**
|
||||||
the founder on 2026-10-13. Its [repository description](../../../rapp-playwright/README.md)
|
The current vector is **D3 / A5 / C2 / R2**. A5 means a deployable container under
|
||||||
identifies a Railiance wrapper for a Playwright and headless Chromium environment
|
[the maturity standard](../../specs/CapabilityMaturityStandard.md); managed
|
||||||
supporting use-case testing. Service availability is **planned**, not verified:
|
platform operation is A6 and remains **pending Railiance admission**. Source
|
||||||
this record has no confirmed endpoint, consumption contract or launch receipt yet.
|
examples remain available at A2. No browser is installed on the caller's machine
|
||||||
The current **D3 / A2 / C2 / R2** vector continues to describe evidenced source reuse.
|
by discovery or by running the Python client.
|
||||||
|
|
||||||
`rapp-playwright` owns the forthcoming browser service. `reuse-surface` owns
|
`rapp-playwright` owns the browser service; `railiance-platform` owns managed
|
||||||
discovery, consumption guidance, maturity assessment and evidence references; it
|
lifecycle admission. `reuse-surface` owns this record, discovery, consumption
|
||||||
does not implement or operate the browser service or install browsers on behalf
|
guidance and evidence assessment. The
|
||||||
of consumers. Its `owner` field here denotes the maintainer of this registry record.
|
[content-explorer intake](../../intakes/REUSE-IN-0001-headless-browser-runnable-answer.md)
|
||||||
|
concerns registry relevance and availability clarity; CONTENT-WP-0000-T04
|
||||||
|
acceptance remains with the consumer.
|
||||||
|
|
||||||
The [content-explorer feedback](../../intakes/REUSE-IN-0001-headless-browser-runnable-answer.md)
|
### Verified client path
|
||||||
is retained as consumer evidence. Browser delivery is assigned to the provider;
|
|
||||||
the reported relevance, false-`new` verdict and availability-clarity issues remain
|
Only Python 3.10+ is needed by the consumer. Download the single revision-pinned
|
||||||
reuse-surface concerns. A2 means source/library reuse, not proof of a locally
|
client into a working directory; a sibling checkout is not required:
|
||||||
installed browser. The service announcement does not complete the consumer's
|
|
||||||
screenshot and keyboard-walkthrough task.
|
```sh
|
||||||
|
curl -fL --output rapp_playwright.py https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
|
||||||
|
python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight
|
||||||
|
python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01
|
||||||
|
```
|
||||||
|
|
||||||
|
Use a fresh output directory for each run. Port **18083** was verified on this
|
||||||
|
workstation on **2026-10-13**; it is an ephemeral local provider, not a permanent
|
||||||
|
or remotely reachable endpoint. Preflight must report `available: true`, API 1,
|
||||||
|
service 0.1.0, Playwright **1.64.0**, Chromium **156.0.8078.4**, and the expected
|
||||||
|
release/location. Connection failure means the provider or tunnel is unavailable,
|
||||||
|
not that another browser capability is needed. Use the local setup below or the
|
||||||
|
source-adaptation fallback. Repeat `--url` on later status/download commands.
|
||||||
|
|
||||||
|
The fixture trial checks Tab focus, Enter activation and the counter assertion
|
||||||
|
across **1280×800** and **390×844** viewports, then downloads screenshots and a
|
||||||
|
receipt. It does not inspect or accept the consumer's own UI. `run.json` is a
|
||||||
|
private run handle and must not be published. For `trial`/`run`, exit 0 means
|
||||||
|
passed, 2 means UI assertion failed, and 3 means infrastructure/setup or another
|
||||||
|
unsuccessful result; `status` exit 0 only means retrieval succeeded.
|
||||||
|
|
||||||
|
### Reproduce the local provider
|
||||||
|
|
||||||
|
The published release targets **linux/amd64**. With Docker and image pull access,
|
||||||
|
start the immutable container in one terminal, then point the client at port
|
||||||
|
**18081** in another:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run --rm --name rapp-playwright-local --read-only \
|
||||||
|
--tmpfs /tmp:rw,size=512m --shm-size=256m --memory=1g --cpus=1 \
|
||||||
|
--cap-drop ALL --security-opt no-new-privileges \
|
||||||
|
--mount type=volume,src=rapp-playwright-local-data,dst=/data \
|
||||||
|
-p 127.0.0.1:18081:8080 -e HOST=0.0.0.0 \
|
||||||
|
-e EXECUTION_LOCATION=workstation-container \
|
||||||
|
-e RELEASE_ID=sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441 \
|
||||||
|
forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
|
||||||
|
python3 rapp_playwright.py --url http://127.0.0.1:18081 preflight
|
||||||
|
python3 rapp_playwright.py --url http://127.0.0.1:18081 trial --out trial-local-01
|
||||||
|
```
|
||||||
|
|
||||||
|
This is the provider's documented local setup with the published digest pinned;
|
||||||
|
it was not redeployed by this registry review. Existing independent final-release
|
||||||
|
receipts and the fresh discovery trial use the same digest. The default fixture
|
||||||
|
requires no external target grant. The provider supports trusted/synthetic pages,
|
||||||
|
not hostile-page or mutually untrusted tenant execution.
|
||||||
|
|
||||||
|
### Conditional managed path
|
||||||
|
|
||||||
|
Only **after platform admission, deployment and caller access are confirmed**:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
kubectl -n playwright port-forward deployment/playwright 18081:8080 --address 127.0.0.1
|
||||||
|
# In another terminal, while the tunnel remains running:
|
||||||
|
python3 rapp_playwright.py preflight
|
||||||
|
python3 rapp_playwright.py trial --out trial-managed-01
|
||||||
|
```
|
||||||
|
|
||||||
|
No managed deployment or successful managed invocation is claimed here. A remote
|
||||||
|
browser's localhost belongs to the provider. Consumer applications need a
|
||||||
|
provider-reachable, explicitly allowed origin; the browser API tunnel does not
|
||||||
|
forward a workstation app. See the provider contract before running a target
|
||||||
|
scenario.
|
||||||
|
|
||||||
|
### Pinned delivery evidence
|
||||||
|
|
||||||
|
All provider links below are pinned to published commit
|
||||||
|
`8831a05aeba5ce588f3b395ade676dde2a151c5d`:
|
||||||
|
|
||||||
|
- [Consumer contract](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md).
|
||||||
|
- [Release manifest](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json)
|
||||||
|
and [publication/pull evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md).
|
||||||
|
- [Independent consumer evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md),
|
||||||
|
including final-release screenshots, keyboard assertions, wrong-token rejection,
|
||||||
|
UI failure and unavailable-service results. These are retained provider-side
|
||||||
|
reports; this review separately verified the fixture path.
|
||||||
|
- [Fresh registry review and trial](../../docs/evidence/2026-10-13-browser-discovery.md).
|
||||||
|
|
||||||
## Existing implementations
|
## Existing implementations
|
||||||
|
|
||||||
|
|
@ -196,15 +305,14 @@ copy its workstation paths as a portable browser installation recipe.
|
||||||
- **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained
|
- **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained
|
||||||
experiment evidence here; WebKit has no verified local example in this record.
|
experiment evidence here; WebKit has no verified local example in this record.
|
||||||
|
|
||||||
## Practical trial for the consuming worker
|
## Source-adaptation fallback for the consuming worker
|
||||||
|
|
||||||
1. Query this checkout with `python3 -m reuse_surface.cli query --keyword browser`
|
1. Query this checkout with `python3 -m reuse_surface.cli query --keyword browser`
|
||||||
from the reuse-surface root, then open this entry. If the CLI is installed,
|
from the reuse-surface root, then open this entry. If the CLI is installed,
|
||||||
`reuse-surface query --keyword browser` is equivalent.
|
`reuse-surface query --keyword browser` is equivalent.
|
||||||
`plan-check --intent "headless browser" --no-llm` also includes this candidate,
|
`plan-check --intent "headless browser" --no-llm` ranks this entry first.
|
||||||
but its token-overlap thresholds and maturity tie-breaking currently return
|
Its reuse verdict describes relevance; provider preflight determines current
|
||||||
`new` for this short query. That verdict does not establish absence of reuse;
|
runtime availability. Use source adaptation when the provider path is unsuitable.
|
||||||
use the explicit keyword query and read the evidence for this trial.
|
|
||||||
2. Pick the example matching the target repo's language and task. Inspect its
|
2. Pick the example matching the target repo's language and task. Inspect its
|
||||||
fixture/server assumptions before adapting the smallest useful test or script.
|
fixture/server assumptions before adapting the smallest useful test or script.
|
||||||
3. Use the target repo's package manager and lockfile. Select a compatible
|
3. Use the target repo's package manager and lockfile. Select a compatible
|
||||||
|
|
|
||||||
|
|
@ -6,18 +6,25 @@ capabilities:
|
||||||
- id: capability.infotech.headless-browser
|
- id: capability.infotech.headless-browser
|
||||||
name: Headless Browser Automation
|
name: Headless Browser Automation
|
||||||
summary: >-
|
summary: >-
|
||||||
Headless browser automation with Playwright and Chromium for UI testing,
|
Headless browser automation, screenshots and keyboard trials through
|
||||||
screenshots and page extraction; recommended default based on existing
|
rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4).
|
||||||
whynot-design, coulomb-social, core-hub and frontend-patterns implementations.
|
Published A5 local container; managed Railiance admission is pending.
|
||||||
A rapp-playwright-provided service will be available shortly (announced
|
Download the Python 3.10+ standalone client from
|
||||||
2026-10-13; planned, not yet verified available).
|
https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
|
||||||
vector: D3 / A2 / C2 / R2
|
and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`,
|
||||||
|
then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
|
||||||
|
with a fresh output directory. This endpoint was verified locally on 2026-10-13
|
||||||
|
and is ephemeral; it installs no browser for the caller. If unreachable,
|
||||||
|
follow the local container setup in the capability card or adapt its A2 source
|
||||||
|
examples; this is an availability gap on the existing capability.
|
||||||
|
Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
|
||||||
|
vector: D3 / A5 / C2 / R2
|
||||||
domain: infotech
|
domain: infotech
|
||||||
status: reviewed
|
status: reviewed
|
||||||
owner: reuse-surface
|
owner: reuse-surface
|
||||||
path: registry/capabilities/capability.infotech.headless-browser.md
|
path: registry/capabilities/capability.infotech.headless-browser.md
|
||||||
tags: [headless, browser, automation, playwright, chromium, testing, screenshots, extraction, firefox, webkit, selenium, puppeteer]
|
tags: [headless, browser, automation, playwright, chromium, testing, screenshots, extraction, firefox, webkit, selenium, puppeteer]
|
||||||
consumption_modes: [informational, source adaptation, JavaScript library, Python library]
|
consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
|
||||||
|
|
||||||
- id: capability.registry.register
|
- id: capability.registry.register
|
||||||
name: Capability Registration
|
name: Capability Registration
|
||||||
|
|
|
||||||
|
|
@ -943,12 +943,17 @@ capabilities:
|
||||||
source_index: registry/federation/cache/email-connect.yaml
|
source_index: registry/federation/cache/email-connect.yaml
|
||||||
- id: capability.infotech.headless-browser
|
- id: capability.infotech.headless-browser
|
||||||
name: Headless Browser Automation
|
name: Headless Browser Automation
|
||||||
summary: Headless browser automation with Playwright and Chromium for UI testing,
|
summary: 'Headless browser automation, screenshots and keyboard trials through rapp-playwright
|
||||||
screenshots and page extraction; recommended default based on existing whynot-design,
|
0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container;
|
||||||
coulomb-social, core-hub and frontend-patterns implementations. A rapp-playwright-provided
|
managed Railiance admission is pending. Download the Python 3.10+ standalone client
|
||||||
service will be available shortly (announced 2026-10-13; planned, not yet verified
|
from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
|
||||||
available).
|
and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then
|
||||||
vector: D3 / A2 / C2 / R2
|
`python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01`
|
||||||
|
with a fresh output directory. This endpoint was verified locally on 2026-10-13
|
||||||
|
and is ephemeral; it installs no browser for the caller. If unreachable, follow
|
||||||
|
the local container setup in the capability card or adapt its A2 source examples;
|
||||||
|
this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.'
|
||||||
|
vector: D3 / A5 / C2 / R2
|
||||||
domain: infotech
|
domain: infotech
|
||||||
status: reviewed
|
status: reviewed
|
||||||
owner: reuse-surface
|
owner: reuse-surface
|
||||||
|
|
@ -971,6 +976,9 @@ capabilities:
|
||||||
- source adaptation
|
- source adaptation
|
||||||
- JavaScript library
|
- JavaScript library
|
||||||
- Python library
|
- Python library
|
||||||
|
- cli
|
||||||
|
- service API
|
||||||
|
- container
|
||||||
source_repo: reuse-surface
|
source_repo: reuse-surface
|
||||||
source_index: registry/indexes/capabilities.yaml
|
source_index: registry/indexes/capabilities.yaml
|
||||||
- id: capability.infotech.hub-core-library
|
- id: capability.infotech.hub-core-library
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,14 @@ def match_query(
|
||||||
tokens = _tokens(blob)
|
tokens = _tokens(blob)
|
||||||
if not tokens:
|
if not tokens:
|
||||||
continue
|
continue
|
||||||
score = len(query.tokens & tokens) / len(query.tokens | tokens)
|
# Score the name independently: descriptive summaries must not dilute
|
||||||
|
# a direct short-intent match (e.g. "headless browser"). Keep the full
|
||||||
|
# blob score for longer intents and summary/tag-only matches.
|
||||||
|
name_tokens = _tokens(item.get("name", ""))
|
||||||
|
score = max(
|
||||||
|
len(query.tokens & tokens) / len(query.tokens | tokens),
|
||||||
|
len(query.tokens & name_tokens) / len(query.tokens | name_tokens),
|
||||||
|
)
|
||||||
if score <= 0:
|
if score <= 0:
|
||||||
continue
|
continue
|
||||||
scored.append(
|
scored.append(
|
||||||
|
|
@ -340,7 +347,7 @@ def format_plan_check_markdown(result: dict[str, Any]) -> str:
|
||||||
|
|
||||||
verdict = result["verdict"]
|
verdict = result["verdict"]
|
||||||
if verdict == "reuse":
|
if verdict == "reuse":
|
||||||
lines.append("**Verdict: REUSE** — an existing capability already covers this; link it instead of building new.")
|
lines.append("**Verdict: REUSE** — a close lexical match exists; review its consumption contract and availability before adopting it.")
|
||||||
elif verdict == "extend":
|
elif verdict == "extend":
|
||||||
lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.")
|
lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.")
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -61,9 +61,11 @@ Reuses the token-Jaccard approach already proven in `overlaps.py`
|
||||||
same codebase:
|
same codebase:
|
||||||
|
|
||||||
1. **Tokenize** the query blob with the existing `TOKEN_RE`.
|
1. **Tokenize** the query blob with the existing `TOKEN_RE`.
|
||||||
2. **Score** against every federated capability's blob (`name` + `summary` +
|
2. **Score** with the maximum of two token-Jaccard similarities: query versus
|
||||||
`tags` + `discovery.intent` + `discovery.includes`, mirroring
|
capability `name`, and query versus `name` + `summary` + `tags`.
|
||||||
`overlaps._entry_blob`) via Jaccard similarity.
|
Scoring the name separately prevents detailed summaries and consumption
|
||||||
|
instructions from diluting a short direct query such as "headless browser".
|
||||||
|
Summary/tag matches and longer intents retain the full-blob signal.
|
||||||
3. **Rank signal, not just tie-break:** among candidates within
|
3. **Rank signal, not just tie-break:** among candidates within
|
||||||
`--tie-window` (default 0.05) of the top score, prefer the entry with the
|
`--tie-window` (default 0.05) of the top score, prefer the entry with the
|
||||||
higher discovery/availability vector (a more mature capability is a safer
|
higher discovery/availability vector (a more mature capability is a safer
|
||||||
|
|
@ -76,7 +78,7 @@ same codebase:
|
||||||
|
|
||||||
| Verdict | Condition | Meaning |
|
| Verdict | Condition | Meaning |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | An existing capability already covers this need — link it, don't rebuild it. |
|
| `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | A close lexical match exists; review its consumption contract and availability before adoption. |
|
||||||
| `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. |
|
| `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. |
|
||||||
| `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). |
|
| `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). |
|
||||||
|
|
||||||
|
|
@ -86,6 +88,12 @@ the same threshold reasoning as `overlaps.py`'s `--threshold 0.28` default,
|
||||||
shifted since plan-check matches short intent text against short summaries
|
shifted since plan-check matches short intent text against short summaries
|
||||||
rather than long entry-to-entry blobs.
|
rather than long entry-to-entry blobs.
|
||||||
|
|
||||||
|
Verdicts describe relevance, not runtime readiness. A source-only candidate or
|
||||||
|
an unavailable endpoint is an availability gap on the existing capability, not
|
||||||
|
evidence that a second capability should be built. The match summary carries
|
||||||
|
provider consumption guidance where published; callers must run its preflight
|
||||||
|
and respect any local-only or managed-admission conditions.
|
||||||
|
|
||||||
## 6. Output
|
## 6. Output
|
||||||
|
|
||||||
### Markdown (TTY default)
|
### Markdown (TTY default)
|
||||||
|
|
|
||||||
|
|
@ -58,6 +58,31 @@ def test_hosted_only_capability_and_provenance_without_local_fallback(monkeypatc
|
||||||
assert result["index_source"]["capability_count"] == 1
|
assert result["index_source"]["capability_count"] == 1
|
||||||
|
|
||||||
|
|
||||||
|
def test_hosted_browser_discovery_includes_conditional_trial_guidance(monkeypatch, capsys):
|
||||||
|
from reuse_surface.registry import load_index
|
||||||
|
|
||||||
|
browser = next(item for item in load_index()["capabilities"]
|
||||||
|
if item["id"] == "capability.infotech.headless-browser")
|
||||||
|
payload = snapshot()
|
||||||
|
payload["capabilities"] = [
|
||||||
|
{"id": "capability.example.headless", "name": "Headless Knowledge Engine",
|
||||||
|
"summary": "Headless information management", "tags": [],
|
||||||
|
"vector": "D7 / A7 / C6 / R6"},
|
||||||
|
browser,
|
||||||
|
]
|
||||||
|
serve(monkeypatch, payload)
|
||||||
|
assert main(["plan-check", "--intent", "headless browser", "--hub-url",
|
||||||
|
"https://registry.example", "--no-llm", "--format", "json"]) == 0
|
||||||
|
result = json.loads(capsys.readouterr().out)
|
||||||
|
assert result["verdict"] == "reuse"
|
||||||
|
assert result["matches"][0]["id"] == browser["id"]
|
||||||
|
summary = result["matches"][0]["summary"]
|
||||||
|
assert "rapp_playwright.py" in summary
|
||||||
|
assert "preflight" in summary and "trial --out" in summary
|
||||||
|
assert "ephemeral" in summary and "admission is pending" in summary
|
||||||
|
assert "availability gap" in summary
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("change", [
|
@pytest.mark.parametrize("change", [
|
||||||
{"stale": True}, {"stale": None}, {"composed_at": None},
|
{"stale": True}, {"stale": None}, {"composed_at": None},
|
||||||
{"composed_at": "2020-01-01T00:00:00Z"},
|
{"composed_at": "2020-01-01T00:00:00Z"},
|
||||||
|
|
|
||||||
|
|
@ -80,6 +80,63 @@ def test_match_query_no_capabilities():
|
||||||
assert match_query(query, []) == []
|
assert match_query(query, []) == []
|
||||||
|
|
||||||
|
|
||||||
|
def test_short_browser_intent_outranks_mature_headless_services(monkeypatch):
|
||||||
|
browser = {
|
||||||
|
"id": "capability.infotech.headless-browser",
|
||||||
|
"name": "Headless Browser Automation",
|
||||||
|
"summary": "Playwright Chromium screenshots keyboard " + " ".join(
|
||||||
|
f"detail{i}" for i in range(100)
|
||||||
|
),
|
||||||
|
"vector": "D3 / A2 / C2 / R2",
|
||||||
|
"tags": ["headless", "browser"],
|
||||||
|
}
|
||||||
|
other = {
|
||||||
|
"id": "capability.communication.context-engine",
|
||||||
|
"name": "Context Engine",
|
||||||
|
"summary": "Headless knowledge operations",
|
||||||
|
"vector": "D7 / A7 / C6 / R6",
|
||||||
|
}
|
||||||
|
monkeypatch.setattr(
|
||||||
|
"reuse_surface.plan_check.load_federated_capabilities",
|
||||||
|
lambda: ([other, browser], _recent_date()),
|
||||||
|
)
|
||||||
|
result = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
|
||||||
|
assert result["verdict"] == "reuse"
|
||||||
|
assert result["matches"][0]["id"] == browser["id"]
|
||||||
|
assert result["matches"][0]["score"] > result["matches"][1]["score"]
|
||||||
|
assert maybe_file_capability_request(
|
||||||
|
result, requesting_domain="infotech", requesting_agent="test"
|
||||||
|
) is None
|
||||||
|
|
||||||
|
# Extra operational documentation must not turn a direct name match into NEW.
|
||||||
|
original_score = result["top_score"]
|
||||||
|
browser["summary"] += " " + " ".join(f"command{i}" for i in range(100))
|
||||||
|
repeated = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
|
||||||
|
assert repeated["top_score"] == original_score
|
||||||
|
|
||||||
|
|
||||||
|
def test_summary_only_matching_survives_name_scoring():
|
||||||
|
query = load_query_from_intent("responsive screenshots keyboard assertions")
|
||||||
|
matches = match_query(query, [{
|
||||||
|
"id": "capability.infotech.headless-browser",
|
||||||
|
"name": "Browser Automation",
|
||||||
|
"summary": "Responsive screenshots keyboard assertions",
|
||||||
|
}])
|
||||||
|
assert verdict_for_score(matches[0].score) == "reuse"
|
||||||
|
|
||||||
|
|
||||||
|
def test_maturity_still_breaks_equally_relevant_name_ties():
|
||||||
|
candidates = [
|
||||||
|
{"id": "capability.example.early", "name": "Browser Automation",
|
||||||
|
"summary": "Early implementation", "vector": "D2 / A2 / C1 / R1"},
|
||||||
|
{"id": "capability.example.mature", "name": "Browser Automation",
|
||||||
|
"summary": "Documented implementation", "vector": "D4 / A5 / C3 / R3"},
|
||||||
|
]
|
||||||
|
matches = match_query(load_query_from_intent("browser automation"), candidates)
|
||||||
|
assert matches[0].id == "capability.example.mature"
|
||||||
|
assert matches[0].score == matches[1].score
|
||||||
|
|
||||||
|
|
||||||
def test_load_query_from_workplan(tmp_path):
|
def test_load_query_from_workplan(tmp_path):
|
||||||
workplan = tmp_path / "TEST-WP-0001-thing.md"
|
workplan = tmp_path / "TEST-WP-0001-thing.md"
|
||||||
workplan.write_text(
|
workplan.write_text(
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ from __future__ import annotations
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from reuse_surface.stats import (
|
from reuse_surface.stats import (
|
||||||
collect_roster_stats,
|
collect_roster_stats,
|
||||||
collect_stats,
|
collect_stats,
|
||||||
|
|
@ -10,19 +12,36 @@ from reuse_surface.stats import (
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test_collect_stats_on_repo_root():
|
@pytest.fixture
|
||||||
root = Path(__file__).resolve().parent.parent
|
def stats_repo(tmp_path, monkeypatch):
|
||||||
stats = collect_stats(root)
|
monkeypatch.delenv("REUSE_SURFACE_URL", raising=False)
|
||||||
|
index = tmp_path / "registry/indexes/capabilities.yaml"
|
||||||
|
index.parent.mkdir(parents=True)
|
||||||
|
index.write_text("""version: 1
|
||||||
|
domain: infotech
|
||||||
|
capabilities:
|
||||||
|
- id: capability.example.source
|
||||||
|
vector: D3 / A2 / C2 / R2
|
||||||
|
path: registry/capabilities/source.md
|
||||||
|
- id: capability.example.service
|
||||||
|
vector: D4 / A5 / C3 / R3
|
||||||
|
path: registry/capabilities/service.md
|
||||||
|
""")
|
||||||
|
return tmp_path
|
||||||
|
|
||||||
|
|
||||||
|
def test_collect_stats_on_repo_root(stats_repo):
|
||||||
|
stats = collect_stats(stats_repo)
|
||||||
assert stats["capability_count"] == 2
|
assert stats["capability_count"] == 2
|
||||||
assert stats["index_present"] is True
|
assert stats["index_present"] is True
|
||||||
assert "discovery" in stats["histograms"]
|
assert stats["histograms"]["discovery"]["D3"] == 1
|
||||||
|
assert stats["histograms"]["discovery"]["D4"] == 1
|
||||||
|
assert stats["reliability"] == {"r0_r2": 1, "r3_plus": 1}
|
||||||
|
|
||||||
|
|
||||||
def test_format_stats_markdown_contains_count():
|
def test_format_stats_markdown_contains_count(stats_repo):
|
||||||
root = Path(__file__).resolve().parent.parent
|
text = format_stats_markdown(collect_stats(stats_repo))
|
||||||
text = format_stats_markdown(collect_stats(root))
|
assert "**Capabilities:** 2" in text
|
||||||
assert "Capabilities:" in text
|
|
||||||
assert "2" in text
|
|
||||||
|
|
||||||
|
|
||||||
def test_collect_roster_stats_federation_ready():
|
def test_collect_roster_stats_federation_ready():
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
Loading…
Add table
Add a link
Reference in a new issue