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

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